2011-09-22 3 views
2

간단한 질문 일 수 있습니다. GLSL에 초보자로서, 나는 여기에서 오히려 묻고 싶다. 이제 , 버텍스 쉐이더에서, 나는 세계에서 가장 위치가 다음과 같은 방법으로 좌표계를 얻을 수 있습니다 :[GLSL] 세계 좌표에서 모든 정점의 z 값을 비교하는 방법은 무엇입니까?

gl_Position = ftransform(); 
    posWorld = gl_ModelViewMatrix * gl_Vertex; 

질문은 지금 할 수있는 내가 할 수있는 모든 정점 중 posWorld의 최대/최소 값? 그래서 깊이 버퍼의 범위가 아닌 정점 깊이 범위를 얻을 수 있습니다.

이것이 가능하지 않은 경우 세계 좌표계에서 near/far 평면의 z 값을 얻으려면 어떻게해야합니까?

안부와

,

지앤 내가 아는 바로는

+0

'gl_ModelViewMatrix'는 월드 공간이 아닌 _view_ space로 이동합니다. 이것이 "모델 뷰"라고 불리는 이유입니다. 모델에서 뷰로 이동합니다. –

답변

2

예 OpenGL에서 가능합니다. GPU에서 객체의 경계 상자를 계산하는 것과 비슷한 기술을 사용하고 있습니다. 다음 단계가 있습니다.

  1. 크기 1x1 유형의 RGBA_32F 렌더링 버퍼를 자체 FBO에 배열하십시오. 렌더 타겟으로 설정합니다 (깊이/스텐실 없음, 단 하나의 컬러 평면). 더 큰 텍스처의 픽셀 일 수 있습니다.이 경우 뷰포트를 올바르게 설정해야합니다.
  2. 기본 값으로 지움. 'min'은 거대한 숫자가 될 것입니다. 'max'는 거대한 양의 값입니다.
  3. 계수 (1,1)에 따라 'min'또는 'max'혼합 함수를 설정하십시오.
  4. 좌표가 (0,0,0,1) 인 점을 생성하는 셰이더로 메쉬를 그립니다. 원래의 정점 세계 위치가 포함 된 색상을 출력합니다.

여기에서 더 최적화 할 수 있습니다. 예를 들어, 기하학 쉐이더를 사용하고 출력 픽셀 중 하나에 대한 위치를 부정함으로써 하나의 그리기 호출에서 '최소'와 '최대'를 모두 얻을 수 있습니다.

+0

DI가 쉐이더에서이 작업을 시도했습니다. 그리고 나는 당신을 꽤 데려 오지 못했습니다 .. ( – superpanda

+0

) 나는 당신이 원래 요구했던 것과 단계를 설명했고, @ Cristobal은 불가능하다고 생각했다.언급했듯이,이 스키마는 테두리 상자를 업데이트하는 엔진에서 작동합니다. 요점은 그것이 효과가 있다는 것입니다. 그리고 당신이 그것을 이해하지 못한다면 - 좀 더 구체적인 질문을하십시오 (여전히 관심이 있다면). – kvark

+0

저는 xip builder로 작업하고 있습니다. 내가 할 수있는 것은 내 자신의 셰이더 파일을로드하여 표준 셰이더를 대체하는 것입니다.이 셰이더 파일은 버텍스 셰이더 및 조각 셰이더입니다. 그리고 메쉬가 아닌 볼륨 데이터로 작업하고 있습니다. 셰이더에서 메서드가 작동하도록 할 수 있습니까? 감사 : D – superpanda

1

, 난이 병렬 감소에 따라 알고리즘을 사용하여 수동으로 수행해야합니다 생각합니다. 이미 누군가 OpenGL 또는 GLSL 함수가 존재하는지 여부를 확인하고 싶습니다.

한편, 프래그먼트 셰이더 내에서 정규화 된 근거리/원거리 평면 인 http://www.opengl.org/wiki/GLSL_Predefined_Variables#Fragment_shader_uniforms에 액세스 할 수 있습니다.
일부 균일 변수를 사용하여 세계를 멀리 또는 가까이에 배치 할 수 있습니다.

+0

답변 해 주셔서 감사합니다. 정규화 된 near/far에서 near/far에 이르는 변환에 사용하는 uniform varialbes에 대한 힌트를 줄 수 있습니까? – superpanda

+1

@superpanda 거기에 나열된 유니폼 값은 3 개 뿐이며 * all *을 사용합니다. 문제는 공간을보기 위해 가고 싶다면 그 이상이 필요하다는 것입니다. 먼저 투영 행렬이 필요합니다 (또는 그 반대로). 솔직히, 그냥 지나치는 것이 훨씬 쉽습니다. near와 far 값은'glFrustum' 또는'gluPerspective'에서 사용하는 near와 far 값의 뷰 공간에서 파생됩니다. –

+0

예, Nicol이 제안한대로 투영 행렬을 전달합니다. – labotsirc

관련 문제