每帧渲染一个小纹理,然后将其缩放?

时间:2013-07-18 08:19:36

标签: ios objective-c opengl-es

在iOS上使用OpenGL,是否可以更新小纹理(通过单独设置每个像素),然后将其放大以填充屏幕(每秒60帧)?

2 个答案:

答案 0 :(得分:1)

一般来说答案是肯定的,这是可能的。但这可能取决于你需要绘制什么。

由于您未提供更多详细信息,我将介绍一般方法:

  • 将纹理绑定到帧缓冲区(Here是一个很好的解释,其中包含有关如何执行此操作的代码。请参阅“示例6.10。初始化()以进行超级采样”代码示例)

  • 现在以与在屏幕上相同的方式绘制您需要的内容(转换,模型视图矩阵等)。如果您需要像素精度(修改每个像素),您可以考虑使用正交投影。如果这是可能的,取决于你需要绘制什么。所有这些绘图都将在您的纹理上执行,实现“更新纹理”部分。

  • 绑定您使用的普通帧缓冲区,在屏幕上绘制。使用上一步中的纹理绘制一个矩形(可能再次使用正交投影)。您可以缩放此矩形以填充屏幕。

如果上述方法能够达到60 fps,则取决于您的目标设备和需要渲染的场景。

希望有所帮助

答案 1 :(得分:1)

您应该能够使用glTexImage2D更新纹理的内容。

未经测试的例子:

GLubyte data[1024]; // 32x32 (power of two) 
for (int i=0; i<1024; i+=4) {
    // write a red pixel  (RGBA)    
    data[i] = 255;
    data[i+1] = 0;
    data[i+2] = 0;
    data[i+3] = 255;
}

glBindTexture(GL_TEXTURE_2D, my_texture);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 32, 32, 0, GL_RGBA, GL_UNSIGNED_BYTE, data);

// then simply render a quad with this texture.