gpt4 book ai didi

OpenGL 帧缓冲区 : can clear it, 但无法绘制到它

转载 作者:行者123 更新时间:2023-12-04 13:24:35 24 4
gpt4 key购买 nike

在 Mac 上,我有一个 OpenGL 设置,除了帧缓冲区之外,它工作得很好——纹理工作等等。所以我知道纹理已启用,我有一个有效的上下文等。在我尝试创建一个之前,所有的工作都完美无缺帧缓冲区。

我用 glGenFramebuffer、glBindFramebuffer 和 glFramebufferTexture2D 创建了一个帧缓冲区,glCheckFramebufferStatus 返回 GL_FRAMEBUFFER_COMPLETE。如果我随后调用 glClear,然后调用 glGetTexImage,则返回的数据显示 glClear 对绑定(bind)到帧缓冲区的纹理按应有的方式起作用。我可以将 glClearColor 设置为我想要的任何内容,并且 glClear 可以正确设置纹理数据。

但这就是好消息停止的地方。无论我使用 VBO 还是 glBegin/glEnd,我都无法在帧缓冲区中绘制任何内容。来自绑定(bind)到帧缓冲区的纹理的纹理数据不受绘制调用的影响(尽管 glClear 结果仍然出现)。即使我在调用 glGetTexImage 之前调用 glFlush 和 glFinish 也是如此。此外,对于我的任何调用,glGetError 都没有返回错误。

我在下面发布了一些示例代码,这些示例代码是我在程序中的相关点添加的,只是为了尝试解决这个问题,以防万一给任何人一个想法。 (这不包括 glClear 调用,但我从同一点的单独测试中知道可以正常工作)。

    glGenFramebuffers(1, &fb);
glBindFramebuffer(GL_FRAMEBUFFER, fb);
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, fbTexID, 0);
GLenum status = glCheckFramebufferStatus(GL_FRAMEBUFFER);
if(status != GL_FRAMEBUFFER_COMPLETE)
Debugger();

glEnable(GL_TEXTURE_2D);
glCullFace(GL_NONE);
glGenTextures(1,(GLuint*)&tex);
glBindTexture(GL_TEXTURE_2D,tex);
glTexImage2D(GL_TEXTURE_2D,0,GL_RGBA,1024,1024,0,GL_RGBA,GL_UNSIGNED_BYTE,NULL);
glTexParameterf( GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER,GL_LINEAR );
glTexParameterf( GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR );
glTexParameterf( GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP );
glTexParameterf( GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP );

glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glOrtho(0, 1024, 1024, 0, -5000, 5000);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
glViewport(0, 0, 1024, 1024);
glColor4f(1,1,1,1);
glBegin(GL_TRIANGLES);
glTexCoord2f(0, 0);
glVertex2f(0, 0);
glTexCoord2f(1, 0);
glVertex2f(1024, 0);
glTexCoord2f(0, 1);
glVertex2f(0, 1024);
glEnd();
glFlush();
glFinish();
unsigned char *dd = new unsigned char[1024*1024*4];
glBindTexture(GL_TEXTURE_2D, fbTexID); //I've tried calling glBindFramebuffer(GL_FRAMEBUFFER,0) before this bind - makes no difference
glGetTexImage(GL_TEXTURE_2D, 0, GL_RGBA, GL_UNSIGNED_BYTE, dd);
delete dd;

最佳答案

你的纹理不起作用,因为它被绑定(bind)了!
你不能有 绑定(bind)纹理在 FBO 上作为渲染目标工作!
这是没有太多记录的东西,但是当您考虑它时是有道理的
驱动程序开发人员也需要一些保护措施,以防万一你做一些奇怪的事情,比如同时读取和写入同一个纹理

关于OpenGL 帧缓冲区 : can clear it, 但无法绘制到它,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7324208/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com