OpenGL에서 어떻게 항목을 앞쪽으로 끌어 올릴 수 있습니까?

StackOverflow https://stackoverflow.com/questions/185536

  •  06-07-2019
  •  | 
  •  

문제

기본적으로 객체는 앞쪽으로 그려진 것 같습니다. 2D UI 객체를 그리는데 앞쪽으로 다시 만들고 싶습니다. 예를 들어, 먼저 흰색 사각형을 만들고 그 위에 약간 작은 검은 색 사각형을 만들 수있어 흰색 테두리가있는 검은 색 창이 생성 될 수 있습니다. 이 게시물 그것에 대해 약간의 토론을 했고이 순서를 "화가 알고리즘"으로 묘사했지만 궁극적으로 그들이 준 예제는 단순히 객체를 반대로 렌더링하여 원하는 효과를 얻었습니다. 나는 앞쪽으로 돌아옵니다 (첫 번째 객체가 뒤로 들어가고 후속 객체가 위에 그려집니다) 렌더링은 약간의 변환을 통해 달성 될 수 있습니까 (Gortho?)?

또한 GLUT와 같은 래퍼 라이브러리를 사용하는 솔루션에 관심이 없다고 언급 할 것입니다.

또한 Cocoa nsopenglview를 사용하는 Mac의 기본 동작이 Windows에서와 마찬가지로이 동작을 얻을 수없는 곳으로 돌아가는 것으로 보입니다. 내가 사용중인 Windows의 설정 코드는 다음과 같습니다.

glViewport (0, 0, wd, ht);
glMatrixMode(GL_PROJECTION);           
glLoadIdentity();                      
glOrtho (0.0f, wd, ht, 0.0f, -1.0f, 1.0f);
glMatrixMode(GL_MODELVIEW);             
glLoadIdentity();                       
도움이 되었습니까?

해결책

다음 호출은 깊이 테스트를 해제하여 생성 된 순서 대상으로 객체를 그립니다. 사실상 물체가 앞쪽으로 다시 그려집니다.

glDepthFunc(GL_NEVER);      // Ignore depth values (Z) to cause drawing bottom to top

이것을 호출하지 마십시오.

glEnable (GL_DEPTH_TEST);   // Enables Depth Testing

다른 팁

특정 질문의 경우 OpenGL에서 깊이 순서를 지정하는 표준화 된 방법이 없습니다. 일부 구현은 일반적으로 더 빠르기 때문에 기본적으로 전면 깊이 깊이 순서를 수행 할 수 있지만 보장되지는 않습니다 (발견 한대로).

그러나 나는 그것이 당신의 시나리오에서 당신을 어떻게 도울 것인지 실제로 알지 못합니다. 흰색 사각형 앞에 검은 사각형을 그리면 깊이 버퍼링을 활성화하는 한, 어떤 순서에 관계없이 흰색 사각형 앞에 검은 사각형을 그려야합니다. 그들이 실제로 Coplanar라면, 어느 쪽도 실제로 다른쪽에 있지 않으며 깊이 분류 알고리즘은 예측할 수 없습니다.

투명성을 사용할 때 깊이 정렬이 관련되기 때문에 링크 만 게시 한 링크를 게시했습니다. 그러나 그것은 당신이 추구하는 것처럼 나에게 들리지 않습니다.

그러나 당신이 정말로 그렇게해야한다면, 당신은 직접해야합니다. 먼저 흰색 사각형을 렌더링 파이프 라인으로 보내고 렌더링을 강제 한 다음 검은 색 사각형을 보내십시오. 그렇게하고 깊이 버퍼링을 비활성화하면 사각형이 코플라나가 될 수 있으며 검은 사각형이 흰색 사각형 위에 그려져 있음을 보장합니다.

그리기 순서는 어렵습니다. 쉬운 해결책은 없습니다. 화가의 알로로 리더 (카메라의 관점과 관련하여 거리별로 정렬)가 가장 간단하지만 발견 한 바와 같이 모든 경우를 해결하는 것은 아닙니다.

나는 화가의 algroithm과 레이어의 조합을 제안합니다. 프로그램의 특정 요소에 대한 레이어를 구축합니다. 따라서 배경 레이어, 객체 레이어, 특수 효과 레이어 및 GUI 레이어가 있습니다.

각 레이어 항목에 화가의 알고리즘을 사용하십시오. 일부 특수 레이어 (GUI 레이어와 같은)에서는 화가 알고리즘을 정렬하지 않고 통화 순서로 정렬하십시오. 당신은 그것을 먼저 화이트 스퀘어라고 부르므로 먼저 그려집니다.

당신이 앞에 있고 싶은 아이템 뒤에 약간 뒤에 있고 싶은 아이템을 그립니다. 즉, 실제로 z 값을 변경합니다 (z가 화면 평면에 수직이라고 가정). 아이템을 서로 앞에 끌어 들이기 위해 많이 바꿀 필요는 없습니다. Z 값을 약간만 변경하면 원하는 위치에서 많은 오프셋을 발견해서는 안됩니다. 당신은 정말로 화려하게 갈 수도 있고, 변경된 z 위치를 기준으로 올바른 x, y 위치를 계산하여 항목이 예상되는 곳에 나타나도록 할 수도 있습니다.

당신의 물건은 Glbegin/Glend 함수라고하는 정확한 순서로 그려 질 것입니다. z-buffer를 사용하여 깊이 버퍼링 될 수 있으며 2D 객체에 Z 값이 다른 경우 원하는 효과를 얻을 수 있습니다. MAC에서 설명하는 동작을 보는 유일한 방법은 프로그램이 연속 주문으로 수동으로 주문하거나 Z-Buffer를 사용하여이를 달성하는 것입니다. 그렇지 않으면 OpenGL은 설명대로 자동으로 기능이 없습니다.

Alankley가 지적했듯이,이를 수행하는 방법은 깊이 버퍼를 비활성화하는 것입니다. 화가의 알고리즘은 실제로 z- 버퍼와 같은 것이 없을 때 다각형을 올바른 순서로 렌더링하는 데 사용되는 2D 스캔 전환 기술입니다. 그러나 당신은 그것을 3D 다각형에 적용하지 않을 것입니다. 일반적으로 변환 및 투사 (다른 다각형과의 교차로 처리)를 돌려 준 다음 투영 된 z- 조정으로 2D 투영 다각형 목록을 정렬 한 다음 리버스 Z- 주문으로 그립니다.

나는 항상 화가 알고리즘을 z- 버퍼를 사용할 수 없거나 원하지 않을 때 숨겨진 표면 제거를위한 대체 기술로 생각했습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top