在OpenGL中渲染到纹理

用户名

我收到以下错误代码:GL_FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT。关于我在这里可能会缺少的任何想法:

glGenTextures(1, &tex);
glBindTexture(GL_TEXTURE_2D, tex);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA4, 640, 480, 0, GL_RGBA4, GL_UNSIGNED_BYTE, NULL);

glGenFramebuffers(1, &renderTexture);
glBindFramebuffer(GL_FRAMEBUFFER, renderTexture);
//glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, tex, 0);
glFramebufferTexture(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, tex, 0);
glDrawBuffer(GL_COLOR_ATTACHMENT0);


GLint val = glCheckFramebufferStatus(GL_FRAMEBUFFER);

if(val != GL_FRAMEBUFFER_COMPLETE)
{
    std::cout <<"\n Error in framebuffer  : 2";
}

这是其余的渲染和blit到默认FB的代码,但是渲染任何想法都没有吗?期望默认FB呈绿色清除

glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glClearColor(0.0f,1.0f,0.0f,0.0f);


glBindFramebuffer(GL_FRAMEBUFFER, 0);
glBindFramebuffer(GL_READ_FRAMEBUFFER, renderTexture);
glReadBuffer(GL_COLOR_ATTACHMENT0);
glDrawBuffer(GL_COLOR_ATTACHMENT0); 
val = glGetError();
if( val == GL_NO_ERROR)
    std::cout<<"\n Bind  Fine";

val = glCheckFramebufferStatus(GL_FRAMEBUFFER);
if(val != GL_FRAMEBUFFER_COMPLETE)
{
    std::cout <<"\n Error in framebuffer  : 3";
}   
glBlitFramebuffer(0,0,128,128,0,0,128,128, GL_COLOR_BUFFER_BIT, GL_NEAREST);
雷托·科拉迪(Reto Koradi)

您需要先绑定FBO,然后再对其进行操作。修改对象的OpenGL调用通常在当前绑定的对象上运行。这与发布代码开始时对纹理的遵循的方案相同,在该方案中,您可以使用生成纹理id并将其glGenTextures()绑定glBindTexture(),然后进行调用以修改纹理,例如glTexParameteri()glTexImage2D()

在FBO的情况下,glFrameBufferTexture2D()以及glDrawBuffer()操作上当前绑定的FBO。因此,glBindFramebuffer()呼叫必须在这些呼叫之前:

glGenFramebuffers(...);
glBindFramebuffer(...);
glFramebufferTexture2D(...);
glDrawBuffer(...);

glGetError()如果您发现自己的代码有任何意外的行为,那么调用总是一个好主意您会GL_INVALID_OPERATIONglFramebufferTexture2D()通话中看到错误,因为没有绑定FBO。

关于代码的更多观察:

  • glDrawBuffer()在这种情况下,呼叫是多余的。GL_COLOR_ATTACHMENT0是FBO的默认绘制缓冲区。
  • 虽然您可以glFramebufferTexture()在这里使用,但效果glFramebufferTexture2D()也一样。glFramebufferTexture()需要较新的OpenGL版本(3.2),并且仅对分层附件(纹理数组等)有利。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

在OpenGL中渲染纹理1到1

来自分类Dev

在OpenGL中以1到1渲染纹理

来自分类Dev

将OpenGL纹理渲染到CGContext中的最快方法

来自分类Dev

OpenGL ES无法渲染到纹理

来自分类Dev

在WebGL中渲染到纹理

来自分类Dev

在WebGL中渲染到纹理

来自分类Dev

OpenGL渲染到纹理-调整rtt纹理的大小

来自分类Dev

openGL渲染到纹理始终渲染黑色几何

来自分类Dev

渲染到纹理,然后在iOS中渲染纹理到屏幕

来自分类Dev

纹理在OpenGL中的渲染非常奇怪

来自分类Dev

在OpenGL着色器中渲染纹理

来自分类Dev

在OpenGL着色器中渲染纹理

来自分类Dev

将CIFilter应用于OpenGL渲染到纹理

来自分类Dev

OpenGL ES渲染绑定到着色器的纹理

来自分类Dev

OpenGL渲染到Framebuffer会产生白色矩形纹理

来自分类Dev

将CIFilter应用于OpenGL渲染到纹理

来自分类Dev

OpenGL渲染到纹理看起来参差不齐

来自分类Dev

OpenGL (LWJGL):渲染到纹理不起作用

来自分类Dev

从OpenGL中渲染的图像中读回纹理坐标?

来自分类Dev

从OpenGL中渲染的图像中读回纹理坐标?

来自分类Dev

渲染深度到纹理

来自分类Dev

如何在Android的OpenGL ES中渲染深度纹理

来自分类Dev

如何在OpenGL 3.1中正确渲染为纹理

来自分类Dev

如何在现代OpenGL中渲染多个纹理?

来自分类Dev

OpenGL纹理渲染与原始纹理不匹配

来自分类Dev

QGraphicsItemGroup到OpenGL纹理

来自分类Dev

使用现代OpenGL渲染纹理

来自分类Dev

Opengl渲染到具有部分透明度(半透明)的纹理,然后将其渲染到屏幕

来自分类Dev

Opengl渲染到具有部分透明度(半透明)的纹理,然后将其渲染到屏幕