我尝试用不同的方法渲染游戏基础。首先,我创建一些纹理并将其上传到GPU。
void initialize(float width,float height)
{
for(int i = 0;i < 10;i++)
{
glActiveTexture(GL_TEXTURE1 + i);
GLuint gridTexture;
glGenTextures(1, &gridTexture);
glBindTexture(GL_TEXTURE_2D, gridTexture);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
setPngTexture(gameMap->texture);
glGenerateMipmap(GL_TEXTURE_2D);
}
}
然后在每帧渲染时使用纹理。
void render() const
{
for(int i = 0; i < map -> maps.size();i++)
{
glUniform1i(uniforms.Sampler,i);
glBindBuffer(GL_ARRAY_BUFFER, gameMap -> verticesbuffer);
glVertexAttribPointer(position, 3, GL_FLOAT, GL_FALSE, stride, 0);
glVertexAttribPointer(normal, 3, GL_FLOAT, GL_FALSE, stride, offset);
glVertexAttribPointer(texture, 2, GL_FLOAT, GL_FALSE, stride, texCoordOffset);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, gameMap -> indicesbuffer);
glDrawElements(GL_TRIANGLES, gameMap -> indexCount, GL_UNSIGNED_SHORT, 0);
}
}
该代码可以在iPhone模拟器上正常工作,但是当我在设备上测试应用程序时,它的帧率非常低:2fps。如果我将
glUniform1i(uniforms.Sampler,i);
行更改为glUniform1i(uniforms.Sampler,0);
,则该应用程序正常运行!我是OpenGL ES的新生,我不确定我是否以正确的方式使用多个纹理。谁能告诉我这个问题的原因是什么,我该如何纠正?非常感谢!
最佳答案
这可能有很多问题。您没有提供足够的代码来真正诊断问题(着色器源)。我将从移动glUniform1i(uniforms.Sampler,i)开始;在循环之外。当前使用它的方式没有任何意义(基本上,您正在尝试将制服.Sampler绑定到map.size()的着色器中的第n个值。我很确定这会引发大量的OpenGL错误。 -阅读有关glUniform1i的文档