【发布时间】:2012-08-30 19:31:54
【问题描述】:
我的深度缓冲区有问题。我想放入纹理。但这似乎不起作用。
所以,这是我在渲染对象后执行的一段代码:
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 x 2^j 的大小。那么,这是一个问题吗?
另外,问题的另一部分可能出在片段着色器之后:
#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);
}
之后,当我第二次渲染一些形状时,我想使用之前的深度(纹理深度缓冲区)来做一些效果。
但是说真的……谁能给我看一段代码,你可以在其中将深度缓冲区转换为纹理?我不在乎它是渲染到纹理还是渲染后提取纹理!只要我有一个具有深度值的纹理来进行第二次传递......这就是重要的!
【问题讨论】:
-
“它不接缝工作。”在什么情况下它不起作用?
-
我的图片是黑色的!根据其他网站,深度缓冲区在远处和黑色近处时应该看起来是白色的......但我的图像的一半应该是白色的!......至少是新三角形覆盖的部分!
-
"深度缓冲区在远处应该看起来是白色的,而黑色靠近时应该是白色的" 这取决于那里存储的内容。如果您使用默认深度范围,那么这将是正确的。
-
但是我的代码,可以吗?将深度缓冲区放入纹理中?
-
试试 glEnable(GL_DEPTH_TEST);为什么不使用 FBO 进行渲染深度并避免复制操作和纹理大小问题?
标签: opengl texture2d depth-buffer