2013-10-21 1 views
0

그림자 쉐이핑을 구현하려고하므로 깊이있는 텍스처로 렌더링하고 있습니다. 깊이 텍스처가 포함 된 프레임 버퍼를 바인딩하지 않고 기본 프레임 버퍼를 사용하면 화면에 출력됩니다. 그러나 멀리 떨어진 조각에 대해서는 흰색 대신 빨간색입니다.OpenGL이 깊이 텍스처 - 붉은 색으로 렌더링됩니까?

이 내 조각 쉐이더이다 : 그것은 문제

#version 330 

out float fragmentdepth; 
uniform sampler2D inputTex; 

void main(){ 
fragmentdepth = gl_FragCoord.z; 
} 

인가? 쉐도우 맵핑이 작동하지 않기 때문에 이것을 문제의 원인으로 배제하고 싶습니다.

+2

깊이 텍스처에 쓰는 경우 왜 깊이를 컬러 버퍼로 출력합니까? 기본적으로이 쉐이더의 메모리 대역폭 요구 사항은 두 배가됩니다. 깊이가 FBO의 깊이 부착 점에 첨부 된 값에 쓰여지기 때문입니다. –

+0

기억이 나지 않지만'gl_FragColour'처럼'gl_FragDepth'가 삭제되지 않았습니까? 만일'fragmentdepth'가 COLOUR_ATTACHMENT0에 대한 RGBA 출력에서 ​​단순히 적색으로 취급되고 있다면 이것은 의미가 있습니다. 깊이 텍스처 대신 부동 소수점 컬러 텍스처에 깊이를 쓰려고하지만 어쨌든 여전히 깊이 테스트가 필요한 경우가 아니면 @ AndonM.Coleman이 지적한대로 대역폭이 두 배가 될 것입니다. 어쩌면'gl_FragDepth'에 글쓰기를 시도할까요? – jozxyqk

+0

확실히, 'gl_FragDepth'가 여전히 존재하지 않습니다. 그러나 하드웨어 깊이 최적화 (Hi-Z, 초기 깊이 테스트 등)를 많이 수행하기 때문에 셰이더에서 아무 것도 쓰지 않는 것이 좋지 않습니다. –

답변

2

깊이는 스칼라 값입니다. 스칼라는 OpenGL에서 단일 컴포넌트 텍스처로 해석됩니다. 단일 컴포넌트 텍스처는 .x 또는 .r 요소 (사용하는 모든 것) 만 0이 아닌 것을 의미합니다.

+0

쉐이더에서 텍스처를 읽었을 때 x, y, z 요소가 0이 아닙니다. – user1760770

+4

@ user1760770 GLSL> = 130 버전의 경우, 깊이 텍스처가 바인드되어있는 sampler2D는'GL_DEPTH_TEXTURE_MODE' 설정 방법과 상관없이 항상 vec4 (r, r, r, 1.0)을 반환합니다 (제거 된 이후 GL3). 이것에 대해서는 Pg. [OpenGL 3.2 핵심 사양]의 320 개 (http://www.opengl.org/registry/doc/glspec32.core.20091207.pdf). –

관련 문제