Android 纹理不应用于网格-OpenGL

Android 纹理不应用于网格-OpenGL,android,opengl-es,opengl-es-2.0,Android,Opengl Es,Opengl Es 2.0,我正在使用OpenGLES。我已经成功加载了obj文件(网格)并显示良好,但当我应用纹理时,它不会显示 我在下面添加了代码 public void draw(GL10 gl) { // bind the previously generated texture gl.glBindTexture(GL10.GL_TEXTURE_2D, textures[0]); gl.glEnableClientState(GL10.GL_VERTEX_ARRAY); gl.glE

我正在使用OpenGLES。我已经成功加载了obj文件(网格)并显示良好,但当我应用纹理时,它不会显示

我在下面添加了代码

public void draw(GL10 gl) {
    // bind the previously generated texture
    gl.glBindTexture(GL10.GL_TEXTURE_2D, textures[0]);
    gl.glEnableClientState(GL10.GL_VERTEX_ARRAY);
    gl.glEnableClientState(GL10.GL_TEXTURE_COORD_ARRAY);
    // Set the face rotation
    gl.glFrontFace(GL10.GL_CW);

    gl.glVertexPointer(3, GL10.GL_FLOAT, 0, vertexBuffer);
    gl.glTexCoordPointer(2, GL10.GL_FLOAT, 0, textureBuffer);

    //Disable the client state before leaving
    gl.glDisableClientState(GL10.GL_TEXTURE_COORD_ARRAY);

    for(int i=0; i<parts.size(); i++){
        TDModelPart t=parts.get(i);
        gl.glNormalPointer(GL10.GL_FLOAT, 0, t.getNormalBuffer());
        gl.glDrawElements(GL10.GL_TRIANGLES,t.getFacesCount(),GL10.GL_UNSIGNED_SHORT,t.getFaceBuffer());
        gl.glDisableClientState(GL10.GL_VERTEX_ARRAY);
    }
}

public void buildVertexBuffer(){
    ByteBuffer vBuf = ByteBuffer.allocateDirect(v.size() * 4);
    vBuf.order(ByteOrder.nativeOrder());
    vertexBuffer = vBuf.asFloatBuffer();
    vertexBuffer.put(toPrimitiveArrayF(v));
    vertexBuffer.position(0);

    vBuf = ByteBuffer.allocateDirect(texture.length * 4);
    vBuf.order(ByteOrder.nativeOrder());
    textureBuffer = vBuf.asFloatBuffer();
    textureBuffer.put(texture);
    textureBuffer.position(0);
}

private static float[] toPrimitiveArrayF(Vector<Float> vector){
    float[] f;
    f=new float[vector.size()];
    for (int i=0; i<vector.size(); i++){
        f[i]=vector.get(i);
    }
    return f;
}

/**
 * Load the texture for the square
 * @param gl
 * @param context
 */
public void loadGLTexture(GL10 gl, Context context) {
    // loading texture
    Bitmap bitmap = BitmapFactory.decodeResource(context.getResources(),
            R.drawable.nehe);

    // generate one texture pointer
    gl.glGenTextures(1, textures, 0);
    // ...and bind it to our array
    gl.glBindTexture(GL10.GL_TEXTURE_2D, textures[0]);

    // create nearest filtered texture
    gl.glTexParameterf(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_MIN_FILTER, GL10.GL_NEAREST);
    gl.glTexParameterf(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_MAG_FILTER, GL10.GL_LINEAR);

    //Different possible texture parameters, e.g. GL10.GL_CLAMP_TO_EDGE
    //gl.glTexParameterf(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_WRAP_S, GL10.GL_REPEAT);
    //gl.glTexParameterf(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_WRAP_T, GL10.GL_REPEAT);

    // Use Android GLUtils to specify a two-dimensional texture image from our bitmap 
    GLUtils.texImage2D(GL10.GL_TEXTURE_2D, 0, bitmap, 0);

    // Clean up
    bitmap.recycle();
}

public void onSurfaceCreated(GL10 gl, EGLConfig config) {
    gl.glLightfv(GL10.GL_LIGHT0, GL10.GL_AMBIENT, lightAmbientBuffer);      
    gl.glLightfv(GL10.GL_LIGHT0, GL10.GL_DIFFUSE, lightDiffuseBuffer);      
    gl.glLightfv(GL10.GL_LIGHT0, GL10.GL_POSITION, lightPositionBuffer);    
    gl.glEnable(GL10.GL_LIGHT0);

    model.loadGLTexture(gl, context);
    gl.glEnable(GL10.GL_TEXTURE_2D);
    gl.glShadeModel(GL10.GL_SMOOTH);            
    gl.glClearColor(0.0f, 0.0f, 0.0f, 0.5f);    
    gl.glClearDepthf(1.0f);                     
    gl.glEnable(GL10.GL_DEPTH_TEST);            
    gl.glDepthFunc(GL10.GL_LEQUAL);         

    gl.glHint(GL10.GL_PERSPECTIVE_CORRECTION_HINT, GL10.GL_NICEST); 
}
公共作废提取(GL10 gl){
//绑定先前生成的纹理
gl.glBindTexture(GL10.gl_TEXTURE_2D,textures[0]);
gl.glEnableClientState(GL10.gl_顶点数组);
gl.glEnableClientState(GL10.gl_纹理_坐标_数组);
//设置面旋转
gl.glFrontFace(GL10.GLU CW);
gl.glVertexPointer(3,GL10.gl_FLOAT,0,vertexBuffer);
gl.glTexCoordPointer(2,GL10.gl_FLOAT,0,textureBuffer);
//在离开之前禁用客户端状态
gl.glDisableClientState(GL10.gl_纹理_坐标_数组);
对于(int i=0;i
(目前,我将忽略您在未启用
GL\u NORMAL\u数组时设置
glnormal指针的情况

请始终记住,OpenGL是一个状态机,所有操作,尤其是draw调用,在调用时都在当前状态上运行,并且该状态不会改变,除非您自己改变它(这里的“您”指的是应用程序代码,包括使用相同OpenGL上下文的任何其他第三方组件)

//Disable the client state before leaving
gl.glDisableClientState(GL10.GL_TEXTURE_COORD_ARRAY);

for(int i=0; i<parts.size(); i++) {
    TDModelPart t=parts.get(i);
    gl.glNormalPointer(GL10.GL_FLOAT, 0, t.getNormalBuffer());
    gl.glDrawElements(GL10.GL_TRIANGLES,t.getFacesCount(),GL10.GL_UNSIGNED_SHORT,t.getFaceBuffer());
    gl.glDisableClientState(GL10.GL_VERTEX_ARRAY);
}
// bind the previously generated texture
gl.glBindTexture(GL10.GL_TEXTURE_2D, textures[0]);
gl.glEnableClientState(GL10.GL_VERTEX_ARRAY);
gl.glEnableClientState(GL10.GL_TEXTURE_COORD_ARRAY);
// Set the face rotation
gl.glFrontFace(GL10.GL_CW);

gl.glVertexPointer(3, GL10.GL_FLOAT, 0, vertexBuffer);
gl.glTexCoordPointer(2, GL10.GL_FLOAT, 0, textureBuffer);

for(int i=0; i<parts.size(); i++){
    TDModelPart t=parts.get(i);
    gl.glNormalPointer(GL10.GL_FLOAT, 0, t.getNormalBuffer());
    gl.glDrawElements(GL10.GL_TRIANGLES,t.getFacesCount(),GL10.GL_UNSIGNED_SHORT,t.getFaceBuffer());
}

//Disable the client state before leaving
gl.glDisableClientState(GL10.GL_VERTEX_ARRAY);
gl.glDisableClientState(GL10.GL_TEXTURE_COORD_ARRAY);