【发布时间】:2012-03-06 17:24:49
【问题描述】:
我正在尝试创建 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);
Bitbucket 提供完整的源代码:https://bitbucket.org/amjaliks/gl2/src/66ee4932e212/GL2/GL2View.m
还有其他内容正确呈现。问题仅在于此纹理 - 它呈现为白色矩形。
我研究了很多例子,但仍然无法弄清楚我做错了什么。缺少什么?
更新 1: 我注意到,如果我设置 glClearColor() 并在绑定 texFrambuffer 时调用 glClear(),这些更改将保存到我的纹理中。因此,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);
Bitbucket 提供完整源代码:https://bitbucket.org/amjaliks/gl2/src/b3339661650e/GL2/GL2View.m
结果是一样的。仅填充矩形。看来我的矩阵肯定有问题。
【问题讨论】:
-
您不应该使用 glGenFramebuffersOES、glBindFramebufferOES 等等... OES 函数,而不是核心?因为 ES 1.1 在核心中没有 Framebuffer 对象,所以它们可以作为扩展使用。
-
Apple 似乎已经合并了 API。使用带 OES 和不带 OES 的方法没有区别。
-
你是什么意思 - 合并?它甚至写在 Apple 文档中:developer.apple.com/library/ios/#documentation/3DDrawing/…(帧缓冲区对象是 iOS 上唯一的渲染目标)在 GLES 1.1 上,您应该使用 OES_framebuffer_object 扩展。
-
@MārtiņšMožeiko 我刚刚尝试使用 OES 方法修复我的示例。结果完全没有区别。更重要的是,我添加了
glClearColor()和glClear()调用,而texFramebuffer是绑定的。现在我得到了用这种颜色填充的纹理。因此,FBO 可以正常工作(即使没有 OES)。但是我仍然缺少glDrawArrays()绘制的三角形。 -
@MārtiņšMožeiko 这是所有带有 OES 功能的代码。仍然没有想要的结果:bitbucket.org/amjaliks/gl2/src/328701fcd2f7/GL2/GL2View.m :(
标签: ios opengl-es textures render-to-texture opengl-es-1.1