C++ 在OS X 10.7(而不是Linux)中使用FBO渲染纹理时出现问题
我有一个测试程序,以编程方式渲染纹理,然后渲染一个简单的四边形,该四边形使用先前绘制的纹理进行蒙皮。这个程序非常简单,所有的事情都是在2D中完成的。该程序在linux下运行良好,一切看起来都应该: 但是,当我在运行10.7的mac电脑上运行该程序时,没有显示任何内容: 我完全不知道为什么这个程序不能在我的mac上运行 以下是程序的相关部分 创建纹理:C++ 在OS X 10.7(而不是Linux)中使用FBO渲染纹理时出现问题,c++,macos,opengl,C++,Macos,Opengl,我有一个测试程序,以编程方式渲染纹理,然后渲染一个简单的四边形,该四边形使用先前绘制的纹理进行蒙皮。这个程序非常简单,所有的事情都是在2D中完成的。该程序在linux下运行良好,一切看起来都应该: 但是,当我在运行10.7的mac电脑上运行该程序时,没有显示任何内容: 我完全不知道为什么这个程序不能在我的mac上运行 以下是程序的相关部分 创建纹理: void createTextureObject(){ cout<<"Creating a new texture of s
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 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);
}
我使用的是GLUT,我的显示回调很简单:
void displayCB(){
drawToTexture();
drawTexturedQuad();
glutSwapBuffers();
}
此外,我还有其他方法检查FrameBufferObject是否受OpenGL支持,以及程序是否退出。此外,我还有其他逻辑,可以在调整窗口大小时设置
textureSize
。是否确定缓冲区id为0而不是1?
也许之前已经创建了另一个FBO
同时检查纹理尺寸,尝试使其为2的幂
glTexParameteri(GL_TEXTURE_2D, GL_GENERATE_MIPMAP, GL_TRUE); // automatic mipmap generation included in OpenGL v1.4
这可能是个问题。GL规范没有明确说明应该在什么点生成Mipmap,当然,这会产生渲染到纹理的问题。因此,GL_EXT_framebuffer_对象(以及核心版本)引入了glGenerateMipmapEXT,您可以在希望生成mipmap的位置(通常在渲染到纹理后)调用它
因此,删除GL_GENERATE_MIPMAP内容,并在需要时手动使用glGenerateMipmap。您可以在中了解有关此问题的更多信息。我不知道我的缓冲区id是什么,当我在缓冲区id 0上调用bind时,我正在解除缓冲区的绑定。此外,我知道2建议的威力,但在我的情况下,我必须使用精确大小的纹理。
void displayCB(){
drawToTexture();
drawTexturedQuad();
glutSwapBuffers();
}
glTexParameteri(GL_TEXTURE_2D, GL_GENERATE_MIPMAP, GL_TRUE); // automatic mipmap generation included in OpenGL v1.4