2012-08-30 7 views
1

깊이 버퍼에 문제가 있습니다. 나는 감촉을 넣고 싶다. 그러나 그것은 효과가없는 것처럼 보입니다.텍스처에 대한 OpenGL 깊이 버퍼 (다양한 이미지 크기 용)

그래서, 여기에 개체를 렌더링 후 내가 실행 코드의 조각을이다 :

glGenTextures(1, (GLuint*)&_depthTexture); 
    glBindTexture(GL_TEXTURE_2D, _depthTexture); 

    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); 
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); 

    glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP); 
    glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP); 

    const pair<int, int> &img_size = getImageSize(); 
    glTexImage2D(GL_TEXTURE_2D, 0, GL_DEPTH_COMPONENT32, img_size.first, img_size.second, 0, GL_DEPTH_COMPONENT, GL_FLOAT, 0); 
    glCopyTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, 0, 0, img_size.first, img_size.second); 

    glClear(GL_DEPTH_BUFFER_BIT); 

것은 (나는 OpenGL을 함께 해요 3.2 이상)이며, 렌더링 이미지는 서로 다른 크기를 갖는다. 대개의 경우 크기에 대해 2^i 씩 2^i가되지 않습니다. 그래서, 그게 문제입니까? 내가 두 번째 몇 가지 모양을 렌더링 할 때, 나는 이전의 깊이를 사용하려면 그 후

#version 140 

uniform sampler2D depthTexture; 
uniform ivec2 screenSize; 

out vec4 outColor; 

void main() 
{ 
    vec2 depthCoord = gl_FragCoord.xy/screenSize.xy; 
    float d = texture2D(depthTexture, depthCoord).x; 
    outColor = vec4(d, d, d, 1.0); 
} 

(텍스처 깊이 :

또한, 문제의 다른 부분은 후 조각 쉐이더에있을 수 있습니다 버퍼), 몇 가지 효과를 수행 할 수 있습니다.

심각하게도 ... 누군가가 깊이 버퍼를 텍스처로 가져올 수있는 코드 조각을 보여줄 수 있습니까? 텍스쳐에 렌더링이되는지 또는 렌더링 후에 텍스처가 추출되는지는 상관하지 않습니다! 깊이 값을 가진 텍스처가 두 번째 패스를 수행하는 한 ... 중요합니다.

+0

"작동하려면 솔기가 없습니다." 어떤 방법으로 작동하지 않습니까? –

+0

내 이미지가 검은 색입니다! 그리고 다른 웹 사이트에 따르면, 깊이 버퍼는 흰색과 검은 색으로 가까울 때 흰색으로 보일 것입니다.하지만 내 이미지의 절반은 흰색이어야합니다! ... 최소한 새 삼각형으로 덮인 부분! – widgg

+0

"깊이가 완만하고 까맣게 가까울 때 깊이 버퍼가 흰색으로 보일 것"그곳에 저장된 내용에 따라 다릅니다. 기본 깊이 범위를 사용하면 참입니다. –

답변

1

glReadBuffer 전화가 필요할 수 있습니다. 컨텍스트가 더블 버퍼링되어 있으면 glReadBuffer(GL_BACK)이됩니다.

32 비트 심도 버퍼가 비정상적이기 때문에 GL_DEPTH_COMPONENT24을 시도해보십시오.

+0

32 비트 심도는 대단히 특이한 것이 아니라 일반 크기 플로트입니다 (32 비트 int 버퍼 형식도 존재하지만). 실제로 24 비트는 카드가 32 비트 전체를 수행 할 정도로 빠르지 만 16 비트는 렌더링하기에 충분하지 않은 시간의 잔재입니다. 그때 당시 일부 드라이버는 32 비트 대신 24 비트를 사용했습니다. 지금은 그 반대가되는 경향이 있습니다. – ssube

+0

@peachykeen : 32 비트 부동 소수점 버퍼 *가 비정상입니다. 또한,'DEPTH_COMPONENT32'는 * 정규화 된 정수 * 깊이 버퍼입니다. float (즉,'DEPTH_COMPONENT32F') –

+0

이 좋은 질문입니다 ...하지만 이중 버퍼가 될 수도 있습니다! 나는 잘 모르겠다. – widgg