2011-08-30 9 views
1

나는 완전한 채워진 깊이 텍스처를 가지고 있지만 적절한 값을 얻지 못하는 것 같습니다.깊이 텍스처에서 깊이 값을 어떻게 얻을 수 있습니까?

GLSL 코드 조각 쉐이더 :

uniform sampler2D depth_tex; 
uniform float viewport_w; 
uniform float viewport_h; 

void main() 
{ 
    vec2 coord = vec2(gl_FragCoord.xy); 
    float depth = texture2D(depth_tex, vec2(coord.x/viewport_w, coord.y/viewport.h)).r; 
    float c = material_amb * depth; // material_amb is preset by host 
    out_color = vec4(c, c, c, 1.0f); 
} 

내가 모델의 색상은 정점 '깊이에 의해 변경 될 것으로 예상,하지만 난 모든 것을 볼 수 없습니다. 물론 깊이를 곱하지 않고 모델을 볼 수 있습니다. 심도 텍스처 유형은 GL_DEPTH_COMPONENT, GL_FLOAT입니다. 뭐가 문제 야? 나는 질감에서 깊이 값을 얻는 해결책이 잘못되었다고 생각하지만, 그 이유는 모른다. 깊이 값은 어디에 저장되어 있습니까? 깊이 값을 얻으려면 어떻게해야합니까?

+0

이런 종류의 것들을 디버깅하는 데 유용한 팁 :'depth '로 직접 곱하기보다는'fract (depth)'로 곱하기보다 값이'[0..1] '범위로 시작합니다. – UncleZeiv

+0

그건 그렇고, 당신의 코드에 오자가 있는데,'viewport.h'는'viewport_h' 여야합니다 ...'depth'를 사용할 때 셰이더가 컴파일되지 않을 수도 있습니다? – UncleZeiv

답변

3

깊이 텍스처의 유형이 말도 안돼, GL_FLOAT

GL_DEPTH_COMPONENT입니다. GL_FLOATOpenGL image format이 아닙니다. GL_DEPTH_COMPONENT은 이미지 형식이지만 크기가 정해지지 않은 형식입니다. 지정되지 않은 크기의 부호없는 정규화 된 정수 형식을 지정합니다.

GL_FLOAT 아마도 glTexImage 호출의 끝에서 두 번째 매개 변수에 넣은 것이 맞습니까? 그것은 pixel transfer 매개 변수입니다. 픽셀 데이터가 저장되는 방식이 아니라 텍스처에 복사하려는 픽셀 데이터를 설명합니다. 내에서 텍스처가입니다. OpenGL은 다양한 종류의 데이터 형식간에 변환 할 수 있습니다.

깊이 데이터를 렌더링에서 깊이 버퍼로 가져온 경우 비선형 사후 투영 영역에서 선형 사전 투영 영역으로 변환하는 방법을 이해해야 데이터에 의미있는 작업을 수행 할 수 있습니다. This answer에서는 변환 방법을 보여줍니다.