OpenGL ES 2.0 C ++中的glDrawBuffers

时间:2019-02-22 11:26:55

标签: c++ opengl-es

我正在将代码从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);

1 个答案:

答案 0 :(得分:1)

它可以代替glFramebufferTexture在(台式机)OpenGL中使用,glFramebufferTexture2D在OpenGL ES 2.0中使用。
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版本相似。


另外,要满足帧缓冲区完整性的规则,附加图像的内部格式必须为 Color-renderable 格式。

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

  

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

     

[...]

     
      
  • 附加图像的内部格式的组合不违反依赖于实现的一组限制。
  •