【发布时间】:2012-11-19 14:15:06
【问题描述】:
每当我尝试渲染一个带纹理的四边形时,我最终都会得到一个扭曲的纹理三角形部分: .
纹理是在 GIMP 中创建的 PNG,我尝试了两种不同的加载纹理的方法(均来自 Apple 自己的示例代码)。每种加载纹理的方法都会产生不同的结果(我不知道是默认设置不同,还是纹理有问题),但我都无法正确渲染。
根据Fastest way to draw quads in OpenGL ES? 中发布的建议,我尝试以多种不同的方式设置我的索引/垂直/texices,但仍然没有成功。
我可能会错过什么?
加载纹理的代码
- (GLuint)setupTexture:(NSString *)fileName {
CGImageRef spriteImage = [UIImage imageNamed:fileName].CGImage;
if (!spriteImage) {
NSLog(@"Failed to load image %@", fileName);
exit(1);
}
size_t width = CGImageGetWidth(spriteImage);
size_t height = CGImageGetHeight(spriteImage);
GLubyte * spriteData = (GLubyte *) calloc(width*height*4, sizeof(GLubyte));
CGContextRef spriteContext = CGBitmapContextCreate(spriteData, width, height, 8, width*4,
CGImageGetColorSpace(spriteImage), kCGImageAlphaPremultipliedLast);
CGContextDrawImage(spriteContext, CGRectMake(0, 0, width, height), spriteImage);
CGContextRelease(spriteContext);
GLuint texName;
glGenTextures(1, &texName);
glBindTexture(GL_TEXTURE_2D, texName);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, width, height, 0, GL_RGBA, GL_UNSIGNED_BYTE, spriteData);
free(spriteData);
return texName;
}
纹理坐标和垂直
const GLfloat texices[] =
{ 0,1,
1,1,
0,0,
1,0 };
glActiveTexture(GL_TEXTURE0);
glUniform1i(_texturedTextureUniformSlot, 0);
glVertexAttribPointer(_texturedTextureSlot, 2, GL_FLOAT, GL_FALSE, 0, texices);
GLfloat vertices[] = {-1, -1, 0, //bottom left corner
-1, 1, 0, //top left corner
1, 1, 0, //top right corner
1, -1, 0}; // bottom right rocner
GLubyte indices[] = {0,1,2, // first triangle (bottom left - top left - top right)
0,2,3}; // second triangle (bottom left - top right - bottom right)
glVertexAttribPointer(3, GL_FLOAT, 0, vertices);
glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_BYTE, indices);
【问题讨论】:
-
你的纹理幂是二吗?请显示更多代码。
-
是的,它是 1024x1024。我也刚刚将
setupTexture函数附加到我的帖子中。 -
请发布一些代码,其中为屏幕对齐的四边形指定纹理坐标。
-
添加纹理坐标代码,我相信这些是生成截图的坐标。
标签: ios xcode opengl-es opengl-es-2.0