Android OpenGLES2.0如何追踪;纹理是一种统一的颜色;bug-需要想法。

Android OpenGLES2.0如何追踪;纹理是一种统一的颜色;bug-需要想法。,android,textures,opengl-es-2.0,Android,Textures,Opengl Es 2.0,我在OpenGLES20(在android motorola Xoom上测试)上显示我的纹理VBO时遇到了这个问题,在OpenGLES20上,纹理看起来就像是从纹理的一个点而不是整个点上取下来的:一些会显示纯灰(我使用的墙的纹理),而另一些会显示纯白(android robot.png) 着色器程序成功编译并链接。模型成功地显示在正确的位置,但纹理没有显示。作为VBO发送的缓冲区似乎工作得很好,我在SampleGLSurface教程中将其作为静态浮点[]进行了测试,以替换三角形,并且robot.

我在OpenGLES20(在android motorola Xoom上测试)上显示我的纹理VBO时遇到了这个问题,在OpenGLES20上,纹理看起来就像是从纹理的一个点而不是整个点上取下来的:一些会显示纯灰(我使用的墙的纹理),而另一些会显示纯白(android robot.png)

着色器程序成功编译并链接。模型成功地显示在正确的位置,但纹理没有显示。作为VBO发送的缓冲区似乎工作得很好,我在SampleGLSurface教程中将其作为静态浮点[]进行了测试,以替换三角形,并且robot.png和my with own都能很好地显示纹理

没有glError消息

为了回答这个问题,我删除了onSurfaceCreated()和onSurfaceChanged()中的几乎所有内容,并缩小到绘图框中的一组连续的GLES20指令

着色器加载了一个

 GLES20.glUseProgram(_program);
在drawFrame()方法的开头,不会引发任何错误

顶点着色器:

uniform mat4 uMVPMatrix;
attribute vec4 aPosition;
attribute vec2 textureCoord;
varying vec2 tCoord;

void main() {
    tCoord = textureCoord;
    gl_Position = uMVPMatrix * aPosition; 
}
片段着色器:

precision mediump float;
uniform sampler2D texture0;
varying vec2 tCoord;

void main() {
    gl_FragColor = texture2D(texture0, tCoord);
}
渲染代码:

if(textureId==null){
    textureId = new int[1];
    Bitmap img = BitmapFactory.decodeResource(mContext.getResources(), R.drawable.texture0);
    GLES20.glGenTextures(1, textureId, 0);
    GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, textureId[0]);
    GLUtils.texImage2D(GLES20.GL_TEXTURE_2D, 0, img, 0);
    GLES20.glGenerateMipmap(GLES20.GL_TEXTURE_2D);
    GLES20.glTexParameterf(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_MIN_FILTER, GLES20.GL_NEAREST);
    GLES20.glTexParameterf(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_MAG_FILTER, GLES20.GL_NEAREST);
    img.recycle();
}

if(!meshisloaded){
    objectLoaderVBO = new ObjectLoaderVBO(mesh.getModelName(), mContext);
    meshisloaded = true;
}

int vboId = objectLoaderVBO.getVboId();
int iboId = objectLoaderVBO.getIboId();
int sizeInFaces = objectLoaderVBO.getSizeInFaces();
int facesSize = 3;
int FLOAT_SIZE_BYTES = 4;
int TRIANGLE_VERTICES_DATA_STRIDE_BYTES = 8 * FLOAT_SIZE_BYTES;
int TRIANGLE_VERTICES_DATA_POS_OFFSET = 0; 
int TRIANGLE_VERTICES_DATA_TEX_OFFSET = 6; // normals are at 3, 
                                               // but we don't care about normals 
                                               // just for simple texture display 
                                               // without culling, right?
int vertexLoc = GLES20.glGetAttribLocation(shaderProgram, "aPosition");
int texCoordLoc = GLES20.glGetAttribLocation(shaderProgram, "textureCoord");
int mMVPMatrixLoc = GLES20.glGetUniformLocation(shaderProgram, "uMVPMatrix");
int[] textureLocs = null;
textureLocs = new int[1];
textureLocs[0] = GLES20.glGetUniformLocation(shaderProgram, "texture0");
GLES20.glUniformMatrix4fv(mMVPMatrixLoc, 1, false, mMVPMatrix, 0);
GLES20.glActiveTexture(GLES20.GL_TEXTURE0);
GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, textureId[0]);
GLES20.glUniform1i(textureLocs[0], 0);
GLES20.glEnableVertexAttribArray(vertexLoc);
GLES20.glEnableVertexAttribArray(texCoordLoc);
GLES20.glBindBuffer(GLES20.GL_ARRAY_BUFFER, vboId);
GLES20.glVertexAttribPointer(vertexLoc, 3, GLES20.GL_FLOAT, false, TRIANGLE_VERTICES_DATA_STRIDE_BYTES,TRIANGLE_VERTICES_DATA_POS_OFFSET);
GLES20.glVertexAttribPointer(texCoordLoc, 2, GLES20.GL_FLOAT, true, TRIANGLE_VERTICES_DATA_STRIDE_BYTES, TRIANGLE_VERTICES_DATA_TEX_OFFSET);
GLES20.glBindBuffer(GLES20.GL_ELEMENT_ARRAY_BUFFER, iboId);
GLES20.glDrawElements(GLES20.GL_TRIANGLES, sizeInFaces*facesSize, GLES20.GL_UNSIGNED_SHORT, 0);
GLES20.glDisableVertexAttribArray(vertexLoc);
GLES20.glDisableVertexAttribArray(texCoordLoc);

我已经尝试了很多东西,但是我已经没有主意了

glvertexattributepointer
中提供的纹理坐标偏移必须以字节为单位,而不是以组件(浮动)为单位,因此它应该是
24
,或者更好的
6*浮动大小\u字节
。所以你的纹理坐标只是垃圾(部分来自位置,部分来自法线)


顺便说一句,
glvertexattributepointer
的规范化标志仅在提供整数数据时使用,因此无需为texCoords将其设置为
true

有了一个新想法-检查uv和st坐标之间是否存在误解Nope。。。我也尝试过缩放tcoords,我得到了一些有趣的结果,但没有解决我的问题。哇,这非常有用,很有效,非常感谢Christian!