【发布时间】:2011-10-09 18:17:58
【问题描述】:
我正在 OpenGL 中进行阴影映射 - 因此我创建了一个帧缓冲区对象,我在其中从灯光的角度渲染场景的深度。
glBindRenderbuffer(GL_RENDERBUFFER, color_buffer);
glRenderbufferStorage(GL_RENDERBUFFER, GL_RGBA, width, height);
glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER, color_buffer);
glBindRenderbuffer(GL_RENDERBUFFER, depth_buffer);
glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH_COMPONENT24, width, height);
glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, depth_buffer);
glGenTextures(1, &color_texture);
glBindTexture(GL_TEXTURE_2D, color_texture);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, width, height, 0, GL_RGBA, GL_UNSIGNED_BYTE, NULL);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP);
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, color_texture, 0);
glGenTextures(1, &depth_texture);
glBindTexture(GL_TEXTURE_2D, depth_texture);
glTexImage2D(GL_TEXTURE_2D, 0, GL_DEPTH_COMPONENT24, width, height, 0, GL_DEPTH_COMPONENT, GL_FLOAT, NULL);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP);
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_TEXTURE_2D, depth_texture, 0);
然后,这会像正常一样从灯光角度渲染场景,一切都如您所愿。唯一的补充是我使用自定义着色器将场景的深度也渲染到“color_texture”。
varying vec4 screen_position;
void main()
{
screen_position = gl_ModelViewProjectionMatrix * gl_Vertex;
gl_Position = screen_position;
}
--------------
varying vec4 screen_position;
void main()
{
float depth = screen_position.z / screen_position.w;
gl_FragColor = vec4(depth, depth, depth, 1.0);
}
我可以使用全屏四边形将这两个纹理“color_texture”和“depth_texture”写入屏幕。两者确实是深度图并且看起来正确。现在来看看奇怪的部分。
在实际渲染对象上的阴影时,“color_texture”深度采样可以正常工作,但是当我切换到“depth_texture”采样时,深度会有所不同,比例和常数不同。
当我向这个采样深度添加一些软糖因子数字时,我可以让它发挥作用,但这真的很困难,而且感觉很糟糕。
我真的不知道哪里出了问题,从技术上讲,两个纹理在采样时应该是相同的。由于 RGB 的准确性,我无法继续使用“color_texture”。我真的需要切换,但我一生都无法弄清楚为什么深度纹理会给出不同的值。
我之前已经编写过几次阴影贴图,这对我来说并不是一个新概念。
任何人都可以对此有所了解吗?
【问题讨论】:
标签: c opengl graphics rendering glsl