我正在将代码从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);
而不是(桌面)OpenGL中的glFramebufferTexture
,它可以在OpenGL ES 2.0中使用glFramebufferTexture2D
。
glFramebufferTexture2D
的第三个参数是纹理目标,在你的情况下是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页)。
如果帧缓冲对象目标是窗口系统提供的帧缓冲,或者如果所有以下条件都为真,则称帧缓冲对象目标是帧缓冲完成:
[...]
- 附加图像的内部格式的组合不违反依赖于实现的一组限制。