2011-08-22 38 views
0

我从glCopyTexImage2D()中弄错了纹理值。我将深度纹理附加到FBO,并在渲染过程中获得了它的值。我期望的结果如下图所示:(X:背景,Y:正确的像素)glCopyTexImage2D()中错误的纹理值

---yyyyyyyyyyyyyyyyyyyy----- 
-----------yyyyyyyyyyy------ 
yyyyyy----------y----------- 
yyyyyyyyyy-------y----y-yyyy 
yyyyyyyyyyyyyyyyyyyyyy------ 

但是,我的结果是这样的:

---yyyyyyyyyyyyyyyyyyyy----- 
-----------yyyyyyyyyyy------ 
yyyyyy----------y----------- 
---------------------------- 
---------------------------- 

从纹理的一半到最后,背景像素仅出现。当然,从左上角到一半我得到了正确的结果。

纹理生成代码如下:

glGenTexture(1, &tex); 
glActiveTexture(GL_TEXTURE0); 
glBindTexture(GL_TEXTURE_2D, tex); 
glTexImage2D(GL_TEXTURE_2D, 0, GL_DEPTH_TEXTURE, w, h, 0, GL_DEPTH_TEXTURE, GL_FLOAT, 0); 

和渲染代码,

glActiveTexture(GL_TEXTURE0); 
glBindTexture(GL_TEXTURE_2D, tex); 
glCopyTexImage2D(GL_TEXTURE_2D, 0, GL_DEPTH_TEXTURE, 0, 0, w, h, 0); 

是否有任何glCopyTexImage2D错误? W和H是固定的,我不知道为什么..

+0

如果你将纹理附加到FBO,因此直接渲染它,为什么你要做glCopyTexImage2D? – datenwolf

回答

1

首先,我不知道你如何发布编译,因为没有这样的事情,如GL_DEPTH_TEXTURE。然而,有GL_DEPTH_COMPONENT

其次,您应该始终使用大小不等的深度格式。因此,而不是GL_DEPTH_COMPONENT,使用GL_DEPTH_COMPONENT24获得24位深度缓冲区。请注意,像素传输格式(参数的第三个参数)仍应为GL_DEPTH_COMPONENT

第三,你应该使用glCopyTexSubImage2D,这样你就不会一直重新分配纹理内存。

+0

+1,看起来像缓冲区大小不匹配。 – Kromster