与PC相比,为什么Android上显示的纹理更大且更完整?

时间:2015-02-05 14:34:24

标签: android c++ linux opengl-es textures

我的目标是用Linux,Windows和Android编写C ++游戏。我使用SDL,并能够使用OpenGL ES 2.0和着色器绘制基本的几何形状。但是当我尝试将纹理应用于这些形状时,我认识到它们在Android上显得更大且不完整。在PC上它工作正常。我的代码不必更改为Android编译。我使用Ubuntu 14.10并在其上以及使用Android 5.0.1的Nexus 5上进行测试。

我设置了一个正交投影矩阵,它给了我一个"表面"在x 0.0到1.0和y 0.0到0.5625的区域中,纵横比为16:9。在这个区域我绘制一个矩形来检查"自定义空间":

//Clear
glClearColor(0.25, 0.0, 0.0, 1.0);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

//Configure viewport
glViewport(0, 0, this->width, this->height);

//Update matrices
this->baseShader.bind();
this->baseShader.updateProjectionMatrix(this->matrix);
this->matrix.loadIdentity();
this->baseShader.updateModelViewMatrix(this->matrix);

//Draw rectangle
GLfloat vertices[] = {0.0, 0.0, 0.0, 0.5625, 1.0, 0.0, 1.0, 0.5625};

glVertexAttribPointer(0, 2, GL_FLOAT, GL_FALSE, 0, vertices);
glEnableVertexAttribArray(0);
glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);

glDisableVertexAttribArray(0);

结果如下:

TextureComparison1.png - Dropbox

然后我绘制一个正方形并将纹理映射到它。这是代码:

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

但这给了我不同的结果:

TextureComparison2.png - Dropbox

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

那么有人能给我一个提示我做错了吗?

1 个答案:

答案 0 :(得分:0)

我弄明白了这个问题。我将我的属性a_Vertex绑定为0,将a_TexCoordinate绑定为1.在PC上它会发生,但在Android上它是相反的。所以我看了一下关于glBindAttribLocation的OpenGL ES 2.0参考。您必须在链接之前绑定位置程序。现在它在Android上与在PC上完全相同。