2012-03-05 79 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