저는 대부분의 시간을 ArchLinux에서 개발합니다. 최근 Ubuntu 16.04에서 사용해보기로 결정했습니다. 제가 만난 상황은 정말 이상했습니다.

  1. glGetError() 전혀 없습니다.
  2. 오류, 경고, 나쁜 것은 없습니다. gl 디버그 출력에서.
  3. 모든 나쁜 상황에 대해 만든 모든 주장이 트리거되지 않았습니다.
  4. glClear가 버퍼를 성공적으로 지 웠습니다. 지정되었지만 :
  5. glDraw*는 아무것도 그리지 않았습니다.

다행히 해결책을 찾았습니다. glViewport 를 설정했습니다. 하지만 우분투에서 그리는데 왜 필요하지만 ArchLinux에서는 필요하지 않은지 잘 모르겠습니다. 그래픽 어댑터 간의 차이점도 있습니다. archlinux에서는 NVIDIA 1060을 사용하고 Ubuntu에서는 통합 HD Graphics P530 (Skylake GT 2)을 사용합니다. ).

중요한 경우 OpenGL 4.4와 함께 SDL2를 사용합니다.

댓글

  • It '는 OS가 여기서 관련이 없다는 것을 인식하는 데 중요합니다. OpenGL은 GPU 공급 업체가 드라이버에 구현하므로 중요한 요소는 GPU와 드라이버입니다. OS가 흥미로울 수있는 곳은 GPU 공급 업체가 OS마다 다른 코드베이스를 가지고 있지만 그렇지 않으면 ' 유용한 정보가 아닙니다.
  • @MaximusMinimus 이것이 질문에 대한 답이 될 수 있습니다.

답변

이미 좋은 답이 두 개 있지만 초보자에게는 이해하기 어려울 수 있으므로 ” 기능.

일반적인 렌더링에서는 의미가없는 것처럼 보일 수 있습니다. 창이나 렌더링 대상을 만들고 그 위에 그립니다. 95 % 이상의 앱이 그런 식으로 작동한다고 말하고 싶습니다.

하지만 “3DS MAX와 같은 앱을 작성하고 있다고 가정 해 보겠습니다. 여기서 창을 4 개의 개별 렌더링으로 분할했습니다. 현재 분할 위치와 마우스 이벤트를 관리하므로 분할 막대 위로 마우스를 가져 가면 크기 조정 등으로 마우스 커서를 변경할 수 있습니다. 분할 막대를 드래그하면 새 위치 등을 기억합니다.

3D 뷰를 렌더링하려면 첫 번째 3D 하위 창의 위치와 크기로 glViewport를 계산하고 여기에 그릴 일반적인 GL 명령을 실행합니다. OpenGL은 자동으로 렌더링 크기를 조정하여 주어진 뷰포트에 맞 춥니 다. 나머지 뷰포트와 끝에는 각각 고유 한 매개 변수가있는 서로 다른 렌더링이 거의없는 하나의 창이 나타납니다. 이렇게하면 단일 창 / 렌더링 대상에서 원하는만큼의 고유 한 렌더링을 가질 수 있습니다.

왜 하나의 컴퓨터에서 작동하지 않았나요?

GPU와 드라이버는 구현 세부 사항 및 차이점이 있으므로 일반적으로 이러한 문제에 익숙해 져야합니다. 간단한 예 하나 : GLSL 셰이더에서 다음과 같은 2D 제로 벡터를 만들 수 있습니다. vec2(0.0,0.0), 하나의 값을 작성해 볼 수도 있습니다. vec2(0.0)이 코드를 사용하면 일부 드라이버는 이전 버전으로 처리하고 다른 드라이버는 오류를 반환하고 아무것도 렌더링하지 않습니다. 두 공급 업체의 드라이버는 동일한 드라이버의 두 버전보다 더 다를 수 있으므로 “nVidia, ATI 및 Intel GPU에서 코드를 테스트하는 것이 좋습니다. 바로이 경우 nVidia 드라이버에서 전체 렌더 타겟을 사용하고 싶다고 가정하는 반면 인텔 드라이버는 그렇게하지 않습니다.

답변

glViewport는 OpenGL이 NDC 좌표를 프레임 버퍼 좌표에 매핑하는 방법을 알려줍니다.

기본적으로 화면 버퍼의 전체 크기로 설정되어 있으므로 창이 열릴 때만 호출하면됩니다. 크기가 조정되거나 실제로 변경하고 싶습니다.

설명

  • 또는 프레임 버퍼로 렌더링 할 때 창의 크기가 다르다고 가정합니다.

Answer

glViewport는 정규화 된 장치 좌표에서 창 좌표로 xx 및 yy의 아핀 변환을 지정합니다. Let (xnd , ynd) xndynd be normalized device coord inates. 그런 다음 창 좌표 (xw, yw) xwyw는 다음과 같이 계산됩니다.

  • “xw = (xnd + 1) (width2) + xxw = xnd + 1⁢width2 + x”
  • “yw = (ynd + 1) (height2) + yyw = ynd + 1⁢height2 + y”

뷰포트 너비와 높이는 다음에 따라 달라지는 범위에 자동으로 고정됩니다. 구현. 이 범위를 쿼리하려면 “GL_MAX_VIEWPORT_DIMS”인수와 함께 glGet을 호출합니다.

x 및 y 매개 변수는 뷰포트의 왼쪽 하단 모서리를 픽셀 단위로 지정하고 너비 및 높이는 뷰포트의 너비와 높이를 지정합니다.

답글 남기기

이메일 주소를 발행하지 않을 것입니다. 필수 항목은 *(으)로 표시합니다