我是OpenGL ES的新手,我正在尝试做一些基本的东西作为我学习曲线的一部分。我能够渲染两个网格,一个球体和一个带有两个glDrawArrays调用的立方体。我试图加载一个不同的纹理来包裹立方体和球体,但发生的是最后加载的纹理被包裹到两个网格。有谁知道为什么会发生这种情况?
以下是网格的代码:
glEnable(GL_DEPTH_TEST);
glGenVertexArraysOES(1, &vertexArray);
glBindVertexArrayOES(vertexArray);
glGenBuffers(1, &vertexBuffer);
glBindBuffer(GL_ARRAY_BUFFER, vertexBuffer);
glBufferData(GL_ARRAY_BUFFER, sizeMeshVerts, meshVerts, GL_STATIC_DRAW);
glEnableVertexAttribArray(GLKVertexAttribPosition);
glVertexAttribPointer(GLKVertexAttribPosition, 3, GL_FLOAT, GL_FALSE, 4*8, BUFFER_OFFSET(0));
glEnableVertexAttribArray(GLKVertexAttribNormal);
glVertexAttribPointer(GLKVertexAttribNormal, 3, GL_FLOAT, GL_FALSE, 4*8, BUFFER_OFFSET(4*3));
glEnableVertexAttribArray(GLKVertexAttribTexCoord0);
glVertexAttribPointer(GLKVertexAttribTexCoord0, 2, GL_FLOAT, GL_FALSE, 4*8, BUFFER_OFFSET(4*6));
// Texture
// Create image from file
NSString *path = [[NSBundle mainBundle] pathForResource:textureImage ofType:@"jpg"];
NSData *texData = [[NSData alloc] initWithContentsOfFile:path];
UIImage *image = [[UIImage alloc] initWithData:texData];
//生成一个新的OpenGL ES纹理缓冲区和 //使用来自的像素数据初始化缓冲区内容 //指定的Core Graphics图像,cgImage。
[TextureLoader textureWithCGImage:image.CGImage options:nil error:NULL];
glBindVertexArrayOES(0);
这是绘图代码:
glBindVertexArrayOES(_vertexArray);
// Render the object with ES2
glUseProgram(_program);
// Set the sampler texture unit to 0
glUniform1i (uniforms[UNIFORM_TEXTURE_MATRIX], 0);
glDrawArrays(GL_TRIANGLES, 0, numVertices);
答案 0 :(得分:1)
在渲染之前,您没有将纹理绑定到采样器。首先,您需要保留对GLKTextureInfo
返回的textureWithCGImage:
对象的引用,然后您可以使用带有纹理名称的glBindTexture
将其绑定到当前的样本器。例如
GLKTextureInfo *tex = [TextureLoader textureWithCGImage:image.CGImage options:nil error:NULL];
...
glBindTexture(GL_TEXTURE_2D, tex.name);
您需要在每次绘制调用之前执行此操作,以便为采样器设置正确的纹理。您可以将所需的每个纹理绑定到不同的采样器,然后只传入正确的采样器制服。