2016-09-10 5 views
2

나는 베 지어 곡선 집합 (3 차원 좌표)이 주어지면 3D 커브를 그리는 GLSL 쉐이더를 가지고 있습니다. 드로잉 자체는 내가 바라는대로 완료됩니다. 오 클루 전이 제대로 작동하지 않습니다. 즉, 특정 시점에서 매우 정면에 있어야하는 커브가 여전히 폐색 된 것처럼 보이고, 역순으로 : 커브의 일부 가려지기는 여전히 보입니다. GLSL 쉐이더 : 폐색 순서와 컬링

, 여기 설명 스크린 샷의 몇 가지 예입니다하려면

1 - 컬러 곡선이 카메라에 가까운, 그래서 제대로 여기에 렌더링됩니다. correct render

2 - 컬러 커브는 회색 커브 뒤쪽에 있어야하지만 맨 위에 렌더링됩니다. wrong render

나는 GLSL에 새로 온 사람과 결과의이 종류에 대한 올바른 용어를 알고하지 않을 수 있습니다,하지만 난 그것을 폐쇄 컬링되는 가정 (갱신! 실제로 깊이 버퍼, 용어 혼란과 문제가 있음을 나타냅니다). 내 질문은 : GLSL 쉐이더를 사용할 때 어떻게 폐색을 다루는가? 셰이더 프로그램 내에서 또는 다른 곳에서 처리해야합니까? 내 코드에 관한

, 그것은 (플러스 내가 OpenGL을 래퍼 라이브러리를 사용) 조금 긴하지만 주요 단계는 다음과 같습니다 버텍스 쉐이더에서
  1. , 나는 gl_Position = ModelViewProjectionMatrix * Vertex;을 계산하고 형상에 추가 색상 정보를 전달 셰이더.
  2. 지오메트리 셰이더에서 4 개의 제어점 (lines_adjacency)과 해당 색상을 사용하고 베 지어 곡선을 따라가는 삼각형 스트립을 만듭니다 (베 지어 세그먼트 사이에 기본 색상 보간을 사용합니다).
  3. 조각 쉐이더도 간단합니다 : gl_FragColor = VertexIn.mColor;.

OpenGL 설정에 대해서는 GL_DEPTH_TEST을 사용할 수 있지만 필요하지 않은 것 같습니다. 또한 장면에 다른 쉐이더 이외의 지오메트리 (예 : 쿼드)를 배치하면 뷰 포인트에 관계없이 항상 맨 위의 곡선이 렌더링됩니다.

문제를 해결하는 방법에 대한 통찰력 및 팁과 그 이유가 무엇인지 평가 해주십시오.

업데이트 솔루션

그래서, 초기 문제, 내가 배운대로, 컬링 알고리즘을 찾는 것에 대해,하지만 난 제대로의 z 값의 계산을 처리하지 않는 것이 (허용 대답 참조)되지 않았습니다 . 오른쪽 깊이 버퍼 설정이 주어지면 OpenGL은 오 클루 젼을 올바르게 처리하므로 휠을 다시 발명 할 필요가 없음을 알았습니다.

내 GLSL 프로그램을 검색 한 결과 정점 좌표를 화면 좌표 (vec2(vertex.xy/vertex.w) * Viewport;)로 변환 할 때 기본적으로 내 지오메트리 셰이더에서 z 값을 0으로 설정한다는 것을 알았습니다. 나는 그것들을 Z- 값 (vertex.z/vertex.w)을 따로 계산해서 고쳐서 방사 포인트 (gl_Position = vec4(screenCoords[i], zValues[i], 1.0);)에 할당했다. 그게 내 문제를 해결해 줬어.

깊이 버퍼 설정에 관해서는, 내가 사용하는 라이브러리가 기본적으로 올바르게 설정되어 있기 때문에 명시 적으로 지정할 필요가 없었습니다.

+0

apitrace 또는 renderdoc와 같은 디버거를 사용하여 어떤 깊이 값이 깊이 버퍼에 기록되는지 확인하십시오. – pleluron

+0

이론 수준에서 알아낼 수 없으면 시도해 보겠습니다. – vicrucann

+0

깊이 버퍼가 있습니까? 컨텍스트 및 렌더링 표면을 설정하는 데 사용하는 윈도우 시스템 툴킷/프레임 워크에 따라 이것이 기본값 일 수도 있고 명시 적으로 요청해야 할 수도 있습니다. –

답변

1

깊이 버퍼를 사용하지 않으면 가장 최근에 렌더링 된 객체가 항상 맨 위에 표시됩니다.

glEnable(GL_DEPTH_TEST)으로 기능을 설정하고 기능을 원하는대로 설정하고 (glDepthFunc(GL_LEQUAL)) 다른 모든 항목 (glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT))으로 모든 프레임을 지워야합니다.

그런 다음 정점 쉐이더가 최종 정점의 Z 값을 올바르게 설정하고 있는지 확인하십시오. 가장 간단한 방법은 CPU 측의 ModelViewProjectionMatrix의 "Model"부분이 쉐이더로 전달되기 전에 깊이 값을 갖도록 설정하는 것입니다.

직교 투영 행렬을 사용하는 경우 렌더링 순서가 올바른 것 외에도 렌더링이 영향을받지 않아야합니다.

+0

조금 명확히 해 주시겠습니까? "버텍스 쉐이더가 최종 버텍스의 Z 값을 올바르게 설정하고 있습니다"는 의미는 무엇입니까? Z-value 란 무엇입니까? 'gl_Position.z'입니까? ** 적절한 ** z-value는 무엇입니까? – vicrucann

+0

vec4의 Z 값 (예 : gl_Position)은 X와 Y와 같지만 깊이는 같습니다. 적절한 Z 값은 0과 1 사이의 값이거나 프로젝션 매트릭스를 만들 때 zNear와 zFar를 설정 한 값입니다. 0은 화면이고 1은 모니터의 뒷면을 밀어 내고 있으므로 깊이 함수를 GL_LEQUAL로 설정하면 모니터에 가장 가까운 것을 렌더링하는 것입니다. –

+0

보다 구체적인 예는 무지개 깊이를 0.8로 설정하고 회색 음영을 0.2로 설정하고 회색 음영을 먼저 렌더링하면 무지개의 겹치는 픽셀은 깊이 테스트에 실패하고 0.8은 작거나 같지 않으므로 그리지 않을 것입니다 0.2. 그리기 순서를 뒤집고 무지개를 먼저 그리면 회색 음영이 겹치는 픽셀이 대신 심도 테스트를 통과합니다. 0.2는 0.8보다 작거나 같기 때문에 무지개 픽셀과 회색 음영 픽셀이 겹칩니다. –