glDrawBuffers在opengl es 2.0 c ++中

问题描述 投票:1回答:1

我正在将代码从Windows移植到Android,并且在Opengl ES 2.0中不存在一些GL方法。

目的是将所有纹理渲染到将使用特定着色器生成效果的纹理。

第一行:

Windows版本

glFramebufferTexture(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, renderedTexture, 0);

ES 2.0版本?我不确定

glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, renderedTexture, 0, 0);

第二行:

Windows版本

GLenum DrawBuffers[1] = { GL_COLOR_ATTACHMENT0 };
glDrawBuffers(1, DrawBuffers);

ES 2.0版本?

失踪

码:

glGenFramebuffers(1, &FramebufferName);
glBindFramebuffer(GL_FRAMEBUFFER, FramebufferName);

glGenTextures(1, &renderedTexture);

glBindTexture(GL_TEXTURE_2D, renderedTexture);

glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, 1024, 768, 0, GL_RGB, GL_UNSIGNED_BYTE, 0);

glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);

glFramebufferTexture(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, renderedTexture, 0);

GLenum DrawBuffers[1] = { GL_COLOR_ATTACHMENT0 };
glDrawBuffers(1, DrawBuffers);

编辑:

调整后,应用程序运行但它崩溃,logcat说:

D/libGLESv2: DTS_GLAPI : DTS is not allowed for Package : xxx.xxx 

声明:

if (glCheckFramebufferStatus(GL_FRAMEBUFFER) != GL_FRAMEBUFFER_COMPLETE)

是真的

目前的代码是:

glGenFramebuffers(1, &FramebufferName);
glBindFramebuffer(GL_FRAMEBUFFER, FramebufferName);

glGenTextures(1, &renderedTexture);

glBindTexture(GL_TEXTURE_2D, renderedTexture);

glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, 1024, 768, 0, GL_RGB, GL_UNSIGNED_BYTE, 0);

glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);

glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, renderedTexture, 0, 0);
c++ opengl-es
1个回答
1
投票

而不是(桌面)OpenGL中的glFramebufferTexture,它可以在OpenGL ES 2.0中使用glFramebufferTexture2DglFramebufferTexture2D的第三个参数是纹理目标,在你的情况下是GL_TEXTURE_2D

glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, renderedTexture, 0, 0);

glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, 
                       GL_TEXTURE_2D, renderedTexture, 0); 

将调用移植到glDrawBuffers不是必需的,因为在初始状态下,片段颜色为零的绘制缓冲区是COLOR_ATTACHMENT0,而在OpenGL ES 2.0中,唯一可能的颜色附件是COLOR_ATTACHMENT0。 在OpenGL ES 3.0中,此行为会更改,并且与您正在使用的(桌面)OpenGL版本类似。

进一步注意,为了实现帧缓冲完整性的规则,附加图像的内部格式必须是颜色可渲染格式。

有关详细信息,请参阅OpenGL ES 2.0 Full Specification - 4.4.5帧缓冲区完整性(第117/118页)。

如果帧缓冲对象目标是窗口系统提供的帧缓冲,或者如果所有以下条件都为真,则称帧缓冲对象目标是帧缓冲完成:

[...]

  • 附加图像的内部格式的组合不违反依赖于实现的一组限制。
© www.soinside.com 2019 - 2024. All rights reserved.