为什么Android上显示的纹理比PC更大、更完整? 我的目标是为Linux、Windows和Android编写C++游戏。我使用SDL,能够使用OpenGL ES 2.0和着色器绘制基本的几何形状。但当我尝试将纹理应用于这些形状时,我发现它们在Android上看起来更大,而且不完整。在PC机上,它运行良好。我的代码在为Android编译时不需要更改。我使用Ubuntu14.10,并在它和我的Nexus5上用安卓5.0.1进行测试

为什么Android上显示的纹理比PC更大、更完整? 我的目标是为Linux、Windows和Android编写C++游戏。我使用SDL,能够使用OpenGL ES 2.0和着色器绘制基本的几何形状。但当我尝试将纹理应用于这些形状时,我发现它们在Android上看起来更大,而且不完整。在PC机上,它运行良好。我的代码在为Android编译时不需要更改。我使用Ubuntu14.10,并在它和我的Nexus5上用安卓5.0.1进行测试,android,c++,linux,opengl-es,textures,Android,C++,Linux,Opengl Es,Textures,我建立了一个正交投影矩阵,它给了我一个纵横比为16:9的“曲面”,区域x 0.0到1.0,y 0.0到0.5625。在此区域中,我绘制一个矩形以检查“自定义空间”: 结果如下: 然后我画一个正方形,并将纹理映射到它。代码如下: //Enable blending bw::Texture::enableAlpha(); //Matrices this->textureShader.bind(); this->textureShader.updateProjectionMatrix(

我建立了一个正交投影矩阵,它给了我一个纵横比为16:9的“曲面”,区域x 0.0到1.0,y 0.0到0.5625。在此区域中,我绘制一个矩形以检查“自定义空间”:

结果如下:

然后我画一个正方形,并将纹理映射到它。代码如下:

//Enable blending
bw::Texture::enableAlpha();

//Matrices
this->textureShader.bind();
this->textureShader.updateProjectionMatrix(this->matrix);
this->matrix.loadIdentity();

this->matrix.translate(this->sW/2.0, this->sH/2.0, 0.0);
this->matrix.rotate(rot, 0.0, 0.0, 1.0);
this->matrix.translate(-this->sW/2.0, -this->sH/2.0, 0.0);

this->textureShader.updateModelViewMatrix(this->matrix);

//Coordinates
float x3 = this->sW/2.0-0.15, x4 = this->sW/2.0+0.15;
float y3 = this->sH/2.0-0.15, y4 = this->sH/2.0+0.15;
GLfloat vertices2[] = {x3, y3, x3, y4, x4, y3, x4, y4};
GLfloat texCoords[] = {0.0, 0.0, 0.0, 1.0, 1.0, 0.0, 1.0, 1.0};

//Send coordinations to GPU
glVertexAttribPointer(0, 2, GL_FLOAT, GL_FALSE, 0, vertices2);
glEnableVertexAttribArray(0);

glVertexAttribPointer(1, 2, GL_FLOAT, GL_FALSE, 0, texCoords);
glEnableVertexAttribArray(1);

//Bind texture
int u1 = glGetUniformLocation(this->textureShader.getId(), "u_Texture");
glActiveTexture(GL_TEXTURE0);
this->spriteTexture.bind();
glUniform1i(u1, 0);

//Draw
glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);

glDisableVertexAttribArray(0);
glDisableVertexAttribArray(1);
但这给了我不同的结果:

然后我尝试用纹理坐标进行修改和测试。如果我将它们减半,那么所有1.0到0.5,应该只显示纹理的“1字段”吗?在Linux上是这样的,但在Android上只是一些随机显示的纹理区域


有谁能告诉我我做错了什么吗?

我发现了问题所在。我将属性a_顶点绑定到0,a_坐标绑定到1。在PC上会发生这种情况,但在Android上则相反。因此,我查看了OpenGLES2.0参考资料中有关GLBindAttriblation的内容。在链接程序之前,必须先绑定位置。现在它在Android上的工作原理与在PC上完全相同。

你的纹理大小是多少,OpenGL ES有一些限制?我的测试纹理大小是128x128。所以两边都是2的幂。
//Enable blending
bw::Texture::enableAlpha();

//Matrices
this->textureShader.bind();
this->textureShader.updateProjectionMatrix(this->matrix);
this->matrix.loadIdentity();

this->matrix.translate(this->sW/2.0, this->sH/2.0, 0.0);
this->matrix.rotate(rot, 0.0, 0.0, 1.0);
this->matrix.translate(-this->sW/2.0, -this->sH/2.0, 0.0);

this->textureShader.updateModelViewMatrix(this->matrix);

//Coordinates
float x3 = this->sW/2.0-0.15, x4 = this->sW/2.0+0.15;
float y3 = this->sH/2.0-0.15, y4 = this->sH/2.0+0.15;
GLfloat vertices2[] = {x3, y3, x3, y4, x4, y3, x4, y4};
GLfloat texCoords[] = {0.0, 0.0, 0.0, 1.0, 1.0, 0.0, 1.0, 1.0};

//Send coordinations to GPU
glVertexAttribPointer(0, 2, GL_FLOAT, GL_FALSE, 0, vertices2);
glEnableVertexAttribArray(0);

glVertexAttribPointer(1, 2, GL_FLOAT, GL_FALSE, 0, texCoords);
glEnableVertexAttribArray(1);

//Bind texture
int u1 = glGetUniformLocation(this->textureShader.getId(), "u_Texture");
glActiveTexture(GL_TEXTURE0);
this->spriteTexture.bind();
glUniform1i(u1, 0);

//Draw
glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);

glDisableVertexAttribArray(0);
glDisableVertexAttribArray(1);