【问题标题】:OpenGL ES; rendering texture created from CGBitmapContextOpenGL ES;渲染从 CGBitmapContext 创建的纹理
【发布时间】:2010-04-26 13:43:20
【问题描述】:

我正在执行以下内容,这些内容来自几个不同的教程(只是一个渲染过程,未显示初始化代码,但适用于无纹理的基元):

glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glOrthof(0, xSize, 0, ySize, -1.0f, 1.0f);
glMatrixMode(GL_MODELVIEW);

glColor4f(1.0f, 1.0f, 1.0f, 1.0f);
glEnable(GL_TEXTURE_2D);
glBlendFunc(GL_ONE, GL_SRC_COLOR);

GLuint texture[1];
glGenTextures(1, &texture[0]);
glBindTexture(GL_TEXTURE_2D, texture[0]);
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR);

int width = 50;
int height = 50;
void* textureData = malloc(width * height * 4);
CGColorSpaceRef cSp = CGColorSpaceCreateDeviceRGB();
CGContextRef ct = CGBitmapContextCreate(textureData, width, height, 8, width*4, cSp, kCGImageAlphaPremultipliedLast | kCGBitmapByteOrder32Big);

CGContextSetRGBFillColor(ct, 0, 1, 0, 1);
CGContextFillRect(ct, CGRectMake(0, 0, 50, 50));
CGContextRelease(ct);

glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, width, height, 0, GL_RGBA, GL_UNSIGNED_BYTE, textureData);

float verts[] = {
0.0f, 0.0f, 0.0f,
50.0f, 0.0f, 0.0f,
0.0f, 50.0f, 0.0f,
50.0f, 50.0f, 0.0f
};

float texCords[] = {
0.0f, 0.0f,
1.0f, 0.0f,
0.0f, 1.0f,
1.0f, 1.0f
};

 glVertexPointer(3, GL_FLOAT, 0, verts);
 glTexCoordPointer(2, GL_FLOAT, 0, texCords);
 glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);

 glDisable(GL_TEXTURE_2D);

结果是一个白色方块。不是预期的绿色。任何人都可以在我的代码中发现导致其无法呈现的错误吗?

我希望让它工作,然后将其移至文本渲染。

【问题讨论】:

  • 可能应该说,我知道即使它确实有效,上述内容也非常低效,而且其中一些甚至不应该在渲染循环中。这只是为了简单起见并使其正常工作。

标签: iphone opengl-es textures cgcontext


【解决方案1】:

问题在于widthheight 不是2 的幂。有两种解决方案:

  • 使用纹理矩形扩展。将纹理目标设置为GL_TEXTURE_RECTANGLE_ARB 而不是GL_TEXTURE_2D。在使用它之前,您必须启用此扩展程序。请注意,矩形纹理不支持 mipmap。
  • 纹理尺寸使用 2 的幂。

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-01-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-06-30
  • 1970-01-01
相关资源
最近更新 更多