[英]Cube map render texture creation works in GL 3.2 but gives an error in 4.3
我正在使用以下代码创建多维数据集贴图渲染目标:
glGenTextures( 1, &id );
glBindTexture( GL_TEXTURE_CUBE_MAP, id );
glTexParameteri( GL_TEXTURE_CUBE_MAP, GL_TEXTURE_MAG_FILTER, GL_LINEAR );
glTexParameteri( GL_TEXTURE_CUBE_MAP, GL_TEXTURE_MIN_FILTER, GL_LINEAR );
glTexParameteri( GL_TEXTURE_CUBE_MAP, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE );
glTexParameteri( GL_TEXTURE_CUBE_MAP, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE );
glTexParameteri( GL_TEXTURE_CUBE_MAP, GL_TEXTURE_WRAP_R, GL_CLAMP_TO_EDGE );
// Creates a renderbuffer object to store depth info.
GLuint bufferId;
glGenRenderbuffers( 1, &bufferId );
glBindRenderbuffer( GL_RENDERBUFFER, bufferId );
glRenderbufferStorage( GL_RENDERBUFFER, GL_DEPTH_COMPONENT16, width, height );
glBindRenderbuffer( GL_RENDERBUFFER, 0 );
glGenFramebuffers( 1, &fboId );
glBindFramebuffer( GL_FRAMEBUFFER, fboId );
const GLenum externalFormat = GL_RGBA;
const GLenum internalFormat = GL_RGBA8;
const GLenum dataType = GL_UNSIGNED_BYTE;
for (int i = 0; i < 6; ++i)
{
glTexImage2D( GL_TEXTURE_CUBE_MAP_POSITIVE_X + i, 0, internalFormat,
size, size, 0, externalFormat,
dataType, nullptr );
glFramebufferTexture2D( GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_CUBE_MAP_POSITIVE_X + i, id, 0 );
}
glFramebufferRenderbuffer( GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, bufferId );
它不会在OpenGL 3.2上下文中生成任何OpenGL错误,但是在OpenGL 4.3上下文中运行相同的代码时,调试输出回调在glFramebufferTexture2D上会产生以下错误:
OpenGL: Framebuffer unsupported. Attachment COLOR_ATTACHMENT0 unsupported because it uses an inconsistent texture due to invalid texture parameters.
我正在使用NVIDIA GeForce GT 750M,驱动程序337.88在Windows 8.1上运行代码。 我是否错误地创建了渲染目标?
我不确定这是什么错误,但可能与size
, width
和height
之间的不匹配有关。
无论如何,还有其他一些问题:
每个循环迭代仅覆盖GL_COLOR_ATTACHMENT0
。 也许更改为GL_COLOR_ATTACHMENT0 + i
。
但是,这意味着,只要片段通过深度测试,就必须写入多维数据集的每一层。
您还只有一个渲染缓冲区,只有一个图层,这意味着对多维数据集的所有面都使用了一个深度测试。
我认为以上并不是您想要的。
要渲染为立方体纹理,您可以依次绑定每个图层,从一个新的投影中多次渲染整个场景。 这是老方法。
要仅通过一次渲染就可以渲染为立方体纹理,可以将整个立方体贴图(实际上只是常规纹理的6层)绑定到GL_COLOR_ATTACHMENT0
。 对于深度测试,您可以使用GL_DEPTH_COMPONENT
创建另一个立方体纹理 (或渲染缓冲区,但不确定是否可以绑定)并将其绑定到GL_DEPTH_ATTACHMENT
。 然后,在几何体着色器中,您将所有内容重复6次,对于立方体的每个面一次。 几何着色器中的gl_Layer
用于设置基本体将绘制到立方体中的哪个面。 想一想,您还可以使用实例化( glDrawElementsInstanced
/ gl_InstanceID
)将几何图形复制6次,这将使计算从几何图形着色器转移到顶点着色器,并且如果您的顶点操作很昂贵,可能会更快一些。
在这两种情况下,您都将需要一个长宽比为1的90度投影矩阵,并且需要旋转视图以匹配多维数据集的面(这很奇怪,因此请保存您的代码以备将来使用)。 因此,根据您是否使用实例化,创建6个视图矩阵,并将它们传递给几何或顶点着色器。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.