我想将深度缓冲区渲染到纹理,并使用DepthTexture绘制四边形。 但它不起作用。
首先我制作DepthTexture:
glGenTextures(1, &_iTexDepth);
glBindTexture(GL_TEXTURE_2D, _iTexDepth);
glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
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_TO_EDGE );
glTexParameteri ( GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE );
glTexImage2D(GL_TEXTURE_2D, 0, GL_DEPTH_COMPONENT, _w, _h, 0,
GL_DEPTH_COMPONENT, GL_UNSIGNED_BYTE, 0);
glBindTexture(GL_TEXTURE_2D, 0);
并准备渲染:
glViewport(0, 0, _w, _h);
glMatrixMode(GL_PROJECTION);
glLoadMatrixf(camera_proj);
glMatrixMode(GL_MODELVIEW);
glLoadMatrixf(camera_modelview);
glPushAttrib(GL_COLOR_BUFFER_BIT | GL_PIXEL_MODE_BIT);
glDrawBuffer(GL_BACK);
glReadBuffer(GL_BACK);
glClearColor(0, 0, 0, 1);
glClearDepth(1.0f);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
并渲染一些东西,并复制到纹理:
glBindTexture(GL_TEXTURE_2D, _iTexDepth);
glCopyTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, 0, 0, _w, _h);
glBindTexture(GL_TEXTURE_2D, 0);
最后,我绑定_iTexDepth
并绘制一个Quad
此代码适用于GL_RGBA8
纹理,但不适用于GL_DEPTH_COMPONENT
(仅限DEPTH_COMPONENT
白色)
如果您对此问题有所了解,我需要一些帮助
P.S。我不想使用FBO
答案 0 :(得分:0)
如果你的纹理全部变成白色,那么它确实被正确渲染。
我认为问题在于投影矩阵中远近平面的设置。深度缓冲区不是线性的,如果你的近平面非常接近,比如0.1,你的远平面很像500.0,那么很多可能的深度值都非常接近你的近平面。
将近平面设置为2.0甚至更高的位置会更好。尝试不同的近/远平面值,如果您仍然遇到问题,请告诉我。
至于你的英语,没关系!作为日本人的前私人英语老师,你的标准非常好。