繁体   English   中英

多维数据集贴图渲染纹理创建在GL 3.2中有效,但在4.3中出现错误

[英]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上运行代码。 我是否错误地创建了渲染目标?

我不确定这是什么错误,但可能与sizewidthheight之间的不匹配有关。

无论如何,还有其他一些问题:

  1. 每个循环迭代仅覆盖GL_COLOR_ATTACHMENT0 也许更改为GL_COLOR_ATTACHMENT0 + i

  2. 但是,这意味着,只要片段通过深度测试,就必须写入多维数据集的每一层。

  3. 您还只有一个渲染缓冲区,只有一个图层,这意味着对多维数据集的所有面都使用了一个深度测试。

我认为以上并不是您想要的。

  • 要渲染为立方体纹理,您可以依次绑定每个图层,从一个新的投影中多次渲染整个场景。 这是老方法。

  • 要仅通过一次渲染就可以渲染为立方体纹理,可以将整个立方体贴图(实际上只是常规纹理的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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM