2013-07-11 2 views
-1

OpenGL Es를 사용 중입니다. 나는 성공적으로 obj 파일 (메쉬)과 그것의 잘 표시했지만 텍스처를 적용 할 때 표시하지 않습니다.메쉬에 텍스처가 적용되지 않음 - OpenGL

아래 코드를 추가했습니다. 유효한 텍스처 좌표를 가지고 있지에 그 개체의 원인이 때문에 아무것도 그리기 전에 TEXCOORD 배열 을 해제 물론

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

답변

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

은 좋은 생각이 아니다 (물론, stricty 말하기 모든 정점이 가지고있는 현재 기본 텍스처 좌표). 같은 방식으로 루프의 끝에서 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); 

(지금 나는 GL_NORMAL_ARRAY을 가능하게하지 않으면 서 당신이 glNormalPointer을 설정하는 것이 무시할 수 있습니다.)

항상 OpenGL은 상태 머신 것을 명심하고 모든 : 그래서 당신의 코드는 아마 같이한다 작업, 특히 무승부 호출은 현재 상태에서 호출되고 해당 상태는 변경되지 않습니다. (여기서는 응용 프로그램 코드를 의미합니다.) 동일한 OpenGL 컨텍스트를 사용하는 타사 구성 요소).

관련 문제