gpt4 book ai didi

c++ - 在 OS X 10.7 而非 Linux 中使用 FBO 渲染到纹理时出现问题

转载 作者:行者123 更新时间:2023-11-28 03:38:33 24 4
gpt4 key购买 nike

我有一个测试程序,它以编程方式渲染纹理,然后渲染一个简单的四边形,该四边形使用之前绘制的纹理蒙皮。该程序非常简单,一切都在 2D 中完成。该程序在 Linux 下运行良好,一切看起来都应该如此:Running on Linux

但是,当我在运行 10.7 的 mac 上运行该程序时,没有任何显示: Running on Mac

我完全不知道为什么这个程序不能在我的 mac 上运行。

这是程序的相关部分。

创建纹理:

void createTextureObject(){
cout<<"Creating a new texture of size:"<<textureSize<<endl;
//glDeleteTextures(1, &textureId);
glGenTextures(1, &textureId);
glBindTexture(GL_TEXTURE_2D, textureId);
glTexParameteri(GL_TEXTURE_2D, GL_GENERATE_MIPMAP, GL_TRUE); // automatic mipmap generation included in OpenGL v1.4
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8, textureSize, textureSize, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0);

isTextureValid = true;
createFBObject();
}

创建帧缓冲区对象:

void createFBObject(){
cout<<"Creating a new frame buffer object"<<endl;

glDeleteFramebuffers(1, &fboId);
glGenFramebuffersEXT(1, &fboId);

glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, fboId);

glGenRenderbuffersEXT(1, &rboId);
glBindRenderbufferEXT(GL_RENDERBUFFER_EXT, rboId);
glRenderbufferStorageEXT(GL_RENDERBUFFER_EXT, GL_DEPTH_COMPONENT, textureSize, textureSize);
glBindRenderbufferEXT(GL_RENDERBUFFER_EXT, 0);

glFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT0_EXT, GL_TEXTURE_2D, textureId, 0);

glFramebufferRenderbufferEXT(GL_FRAMEBUFFER_EXT, GL_DEPTH_ATTACHMENT_EXT, GL_RENDERBUFFER_EXT, rboId);

bool status = checkFramebufferStatus();
if(!status){
cout<<"FrameBufferObject not created! Quitting!"<<endl;
exit(1);
fboUsed = false;
}

glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, 0);
}

渲染到纹理:

void drawToTexture(){

if (!isTextureValid)
createTextureObject();

glViewport(0, 0, textureSize, textureSize);
glLoadIdentity();
// set the rendering destination to FBO
glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, fboId);
// clear buffer
glClearColor(0, 0, 0, 1.0);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
// draw to the texture
glColor3f(0.0, 1.0, 0.0);

for (int i=1; i<=5; i++){
glBegin(GL_LINE_LOOP);
glVertex2f(-1 * i/5.0f, -1 * i/5.0f);
glVertex2f( 1 * i/5.0f, -1 * i/5.0f);
glVertex2f( 1 * i/5.0f, 1 * i/5.0f);
glVertex2f(-1 * i/5.0f, 1 * i/5.0f);
glEnd();
}
glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, 0);
}

渲染带纹理的四边形:

void drawTexturedQuad(){
glViewport(50, 50, textureSize, textureSize);
glLoadIdentity();
glClearColor(0.2, 0.2, 0.2, 0.2);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

glBindTexture(GL_TEXTURE_2D, textureId);

int size = 1;
int texS = 1;

glBegin(GL_QUADS);
glColor4f(1, 1, 1, 1);
glTexCoord2f(texS, texS); glVertex3f(size, size,0);
glTexCoord2f(0, texS); glVertex3f(-1 * size , size,0);
glTexCoord2f(0, 0); glVertex3f(-1 * size, -1 * size,0);
glTexCoord2f(texS, 0); glVertex3f(size, -1 * size,0);
glEnd();

glBindTexture(GL_TEXTURE_2D, 0);
}

我正在使用 GLUT,我的显示回调很简单:

void displayCB(){
drawToTexture();
drawTexturedQuad();
glutSwapBuffers();
}

此外,我还有其他方法检查 OpenGL 是否支持 FrameBufferObjects,如果不支持则程序退出。此外,每当调整窗口大小时,我还有其他逻辑设置 textureSize

最佳答案

glTexParameteri(GL_TEXTURE_2D, GL_GENERATE_MIPMAP, GL_TRUE); // automatic mipmap generation included in OpenGL v1.4

这可能是个问题。 GL规范并没有明确说明应该在什么时候生成mipmaps,当然,这会产生渲染到纹理的问题。因此 GL_EXT_framebuffer_object(以及核心版本)引入了 glGenerateMipmapEXT,您可以在您想要生成 mipmap 的地方调用它(通常在渲染到纹理之后)。

因此,删除 GL_GENERATE_MIPMAP 内容并在需要时手动使用 glGenerateMipmap。您可以在 GL_EXT_framebuffer_object specification 中阅读有关此问题的更多信息.

关于c++ - 在 OS X 10.7 而非 Linux 中使用 FBO 渲染到纹理时出现问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10079603/

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