离屏渲染纹理渲染屏幕上的空矩形
问题描述:
我正在尝试创建OpenGL ES 1.1纹理并使用渲染内容进行填充。离屏渲染纹理渲染屏幕上的空矩形
准备质地:
glGenTextures(1, &texture);
glBindTexture(GL_TEXTURE_2D, texture);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 32, 32, 0, GL_RGBA, GL_UNSIGNED_BYTE, NULL);
GLuint texFrambuffer;
glGenFramebuffers(1, &texFrambuffer);
glBindFramebuffer(GL_FRAMEBUFFER, texFrambuffer);
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, texture, 0);
GLenum status = glCheckFramebufferStatus(GL_FRAMEBUFFER) ;
if(status != GL_FRAMEBUFFER_COMPLETE) {
NSLog(@"failed to make complete framebuffer object %x", status);
// this message doesn't appear, thus, framebuffer is complete
}
glViewport(0, 0, 32, 32);
glClearColor(1.0f, 0.0f, 1.0f, 1.0f);
glClear(GL_COLOR_BUFFER_BIT);
GLfloat vertices[] = {
10.0f, 10.0f, 0.0f,
20.0f, 40.0f, 0.0f,
10.0f, 30.0f, 0.0f
};
glColor4f(0.0f, 1.0f, 0.0f, 1.0f);
glVertexPointer(3, GL_FLOAT, 0, vertices);
glDrawArrays(GL_TRIANGLE_STRIP, 0, 3);
glBindFramebuffer(GL_FRAMEBUFFER, 0);
glDeleteFramebuffers(1, &texFrambuffer);
渲染到纹理场景:
glEnable(GL_TEXTURE_2D);
glBindTexture(GL_TEXTURE_2D, texture);
glColor4f(1.0f, 1.0f, 1.0f, 1.0f);
GLshort texCoord[] = {0, 0, 0, 1, 1, 0, 1, 1};
GLfloat vertices2[] = {0.0, 0.0, 0.0, 31.0f, 31.0f, 0.0f, 31.0f, 31.0f};
glVertexPointer(2, GL_FLOAT, 0, vertices2);
glTexCoordPointer(2, GL_SHORT, 0, texCoord);
glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);
glDisable(GL_TEXTURE_2D);
完整的源代码可从到位桶:https://bitbucket.org/amjaliks/gl2/src/66ee4932e212/GL2/GL2View.m
还有其他内容正确呈现。问题仅限于此纹理 - 它呈现为白色矩形。
我已经研究了很多例子,但仍然无法弄清楚我做错了什么。什么不见了?
更新1:我注意到,如果我设置glClearColor()
并调用glClear()
而texFrambuffer
必然,这些变化将被保存到我的质感。因此,glDrawArrays()
和/或相关事情有问题。
我需要为我的texFrambuffer
专门设置矩阵模式和投影吗?
更新2:我曾尝试使用也glCopyTexImage2D
从“主”帧缓冲区的内容复制到纹理。可用
glGenTextures(1, &texture);
glBindTexture(GL_TEXTURE_2D, texture);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 32, 32, 0, GL_RGBA, GL_UNSIGNED_BYTE, NULL);
glViewport(0, 0, 32, 32);
glClearColor(1.0f, 0.75f, 0.5f, 1.0f);
glClear(GL_COLOR_BUFFER_BIT);
GLfloat vertices[] = {
0.0f, 0.0f, 0.0f,
20.0f, 32.0f, 0.0f,
10.0f, 30.0f, 0.0f
};
glColor4f(0.0f, 1.0f, 0.0f, 1.0f);
glVertexPointer(3, GL_FLOAT, 0, vertices);
glDrawArrays(GL_TRIANGLE_STRIP, 0, 3);
glBindTexture(GL_TEXTURE_2D, texture);
glCopyTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 0, 0, 32, 32, 0);
完整的源代码在到位桶:https://bitbucket.org/amjaliks/gl2/src/b3339661650e/GL2/GL2View.m
结果是相同的。只填充矩形。它看起来像我的矩阵肯定存在问题。
答
您的问题与矩阵。默认情况下投影矩阵是标识。因此给出视口的(-1,-1) - (+ 1,+ 1)坐标。很可能你需要正投影到(0,0) - (32,32)平方。
你不应该使用glGenFramebuffersOES,glBindFramebufferOES,等等... OES函数,而不是核心?因为ES 1.1在核心中没有Framebuffer对象,所以它们可以作为扩展使用。 – 2012-03-03 06:45:31
看来苹果已经合并了API。使用OES和不使用OES的方法没有区别。 – 2012-03-03 07:47:37
你是什么意思 - 合并?它甚至可以在Apple文档中编写:https://developer.apple.com/library/ios/#documentation/3DDrawing/Conceptual/OpenGLES_ProgrammingGuide/OpenGLESonthe iPhone/OpenGLESonthe iPhone.html#//apple_ref/doc/uid/TP40008793-CH101-SW6( Framebuffer对象是iOS上的唯一呈现目标)在GLES 1.1上,您应该使用OES_framebuffer_object扩展。 – 2012-03-03 08:07:20