2012-03-05 92 views
1

我想通过使用OpenGL 2.1/GLSL 1.2来使用深度缓冲区来存储2D纹理中的眼睛空间中的粒子深度值。在OpenGL 2.1中使用浮点渲染目标的深度缓冲区

到目前为止,我发现了一种使用colorbuffer

// create texture 
glGenTextures(1, &g_hDepthTexture); 
glBindTexture(GL_TEXTURE_2D, g_hDepthTexture); 
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP); 
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP); 
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); 
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); 
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA32F_ARB, g_windowWidth, g_windowHeight, 0, GL_RGBA, GL_FLOAT, 0); 
// create framebuffer 
glGenFramebuffersEXT(1, &g_hFBO); 
glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, g_hFBO);glFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, g_hDepthTexture, 0); 

不过,我并不需要的BGA部件。因此,我曾尝试使用深度缓冲,但下面的代码夹每个值在纹理0 ... 1

// create texture 
glGenTextures(1, &g_hDepthTexture); 
glBindTexture(GL_TEXTURE_2D, g_hDepthTexture); 
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP); 
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP); 
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); 
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); 
glTexImage2D(GL_TEXTURE_2D, 0, GL_DEPTH_COMPONENT, g_windowWidth, g_windowHeight, 0, GL_DEPTH_COMPONENT, GL_FLOAT, 0); // create framebuffer 
glGenFramebuffersEXT(1, &g_hFBO); 
glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, g_hFBO); 

glDrawBuffer(GL_NONE); 
glReadBuffer(GL_NONE); 

glFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT, GL_DEPTH_ATTACHMENT, GL_TEXTURE_2D, g_hDepthTexture, 0); 

我想知道如何使用深度缓存(可能如何选择正确的内部格式/格式),以便纹理值不被钳位。

回答

1

标准化的整数图像格式总是被钳位。这就是为什么他们是规范化的整数。如果你想要一个unclamped格式,那么你需要浮点值。

我建议使用实际的1通道浮点图像格式,例如GL_R32F。也许GL_R16F,这取决于我需要多少精度。如果您没有GL 3.x硬件,则可以使用GL_LUMINANCE32F_EXT,具体取决于可用的扩展名。

顺便说一句,如果你这样做延期渲染,不要打扰。您实际上可以直接从常规深度缓冲区计算眼睛空间点。 Yes, really