나는 베 지어 곡선 집합 (3 차원 좌표)이 주어지면 3D 커브를 그리는 GLSL 쉐이더를 가지고 있습니다. 드로잉 자체는 내가 바라는대로 완료됩니다. 오 클루 전이 제대로 작동하지 않습니다. 즉, 특정 시점에서 매우 정면에 있어야하는 커브가 여전히 폐색 된 것처럼 보이고, 역순으로 : 커브의 일부 가려지기는 여전히 보입니다. GLSL 쉐이더 : 폐색 순서와 컬링
, 여기 설명 스크린 샷의 몇 가지 예입니다하려면1 - 컬러 곡선이 카메라에 가까운, 그래서 제대로 여기에 렌더링됩니다.
2 - 컬러 커브는 회색 커브 뒤쪽에 있어야하지만 맨 위에 렌더링됩니다.
나는 GLSL에 새로 온 사람과 결과의이 종류에 대한 올바른 용어를 알고하지 않을 수 있습니다,하지만 난 그것을 폐쇄 컬링되는 가정 (갱신! 실제로 깊이 버퍼, 용어 혼란과 문제가 있음을 나타냅니다). 내 질문은 : GLSL 쉐이더를 사용할 때 어떻게 폐색을 다루는가? 셰이더 프로그램 내에서 또는 다른 곳에서 처리해야합니까? 내 코드에 관한
, 그것은 (플러스 내가 OpenGL을 래퍼 라이브러리를 사용) 조금 긴하지만 주요 단계는 다음과 같습니다 버텍스 쉐이더에서- , 나는
gl_Position = ModelViewProjectionMatrix * Vertex;
을 계산하고 형상에 추가 색상 정보를 전달 셰이더. - 지오메트리 셰이더에서 4 개의 제어점 (
lines_adjacency
)과 해당 색상을 사용하고 베 지어 곡선을 따라가는 삼각형 스트립을 만듭니다 (베 지어 세그먼트 사이에 기본 색상 보간을 사용합니다). - 조각 쉐이더도 간단합니다 :
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);
)에 할당했다. 그게 내 문제를 해결해 줬어.
깊이 버퍼 설정에 관해서는, 내가 사용하는 라이브러리가 기본적으로 올바르게 설정되어 있기 때문에 명시 적으로 지정할 필요가 없었습니다.
apitrace 또는 renderdoc와 같은 디버거를 사용하여 어떤 깊이 값이 깊이 버퍼에 기록되는지 확인하십시오. – pleluron
이론 수준에서 알아낼 수 없으면 시도해 보겠습니다. – vicrucann
깊이 버퍼가 있습니까? 컨텍스트 및 렌더링 표면을 설정하는 데 사용하는 윈도우 시스템 툴킷/프레임 워크에 따라 이것이 기본값 일 수도 있고 명시 적으로 요청해야 할 수도 있습니다. –