ios - 离屏渲染纹理在屏幕上渲染空矩形

标签 ios opengl-es textures render-to-texture opengl-es-1.1

我正在尝试创建 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() > 已绑定(bind),这些更改已保存到我的纹理中。因此,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

结果是一样的。仅填充矩形。看来我的矩阵肯定有问题。

最佳答案

您的问题与矩阵有关。默认情况下投影矩阵是恒等的。从而为视口(viewport)提供 (-1,-1)-(+1,+1) 坐标。您很可能需要正交投影到 (0,0)-(32,32) 正方形。

关于ios - 离屏渲染纹理在屏幕上渲染空矩形,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9542061/

相关文章:

java - 带有 OBJ 文件的顶点纹理

c++ - 以重复模式绑定(bind)纹理

ios - 如何添加Today Widget Chevron

ios - 在 OpenGL 中为透明图像应用蒙版

使用移动 pkg 的 Golang 跨平台游戏引擎?

c++ - 为什么 glCheckFramebufferStatus 对于 OpenGL ES 3.1+ 上的 GL_DEPTH_COMPONENT 总是 36054?

linux - 与 Linux 上的 GLUT 共享上下文

ios - 在 Xcode IOS 中,我可以在应用程序中创建一个按钮,按下该按钮会进行正常的屏幕锁定吗?

iOS Firebase 身份验证错误

ios - 当 UICollectionView 位于 iOS 中的自定义 TableViewCell 内时,如何实现 UICollectionView 的委托(delegate)和数据源方法, Objective-C