2011-09-01 83 views
2

UPDATE:總結: 我可以得出使用TRIANGLE_FAN一個圓,並且單獨我還可以得出兩個正方形與位圖紋理。但問題是當我繪製紋理,然後繪製圓圈。圈子沒有繪製。TRIANGLE_FAN圓不繪製紋理

我正在繪製兩個紋理化正方形(每個4個頂點)。然後我使用GL_TRIANGLE_FAN繪製一個圓,但是繪製不正確(請參閱圖像)。

當我繪製沒有正方形的圓圈時,繪製正確。

任何想法可能是問題?

請詢問更多信息。由於

添加一些代碼,我覺得是很重要的:

public void onSurfaceCreated(GL10 gl, EGLConfig config) { 
    gl.glClearColor(0.0f, 0.0f, 0.0f, 1.0f); 
    gl.glShadeModel(GL10.GL_SMOOTH); 
    gl.glFrontFace(GL10.GL_CCW); 
    gl.glEnable(GL10.GL_CULL_FACE); 
    gl.glEnable(GL10.GL_BLEND); 
    gl.glCullFace(GL10.GL_BACK); 
    gl.glBlendFunc(GL10.GL_SRC_ALPHA, GL10.GL_ONE_MINUS_SRC_ALPHA); 
    gl.glEnableClientState(GL10.GL_VERTEX_ARRAY); 
    gl.glEnable(GL10.GL_TEXTURE_2D); 
} 
public void onSurfaceChanged(GL10 gl, int w, int h) { 
    gl.glViewport(0, 0, width, height); 
    gl.glMatrixMode(GL10.GL_PROJECTION); 
    gl.glOrthof(0, w, -0, h, -1, 1); 
    gl.glMatrixMode(GL10.GL_MODELVIEW); 
    gl.glLoadIdentity(); 
} 

public void onDrawFrame(GL10 gl) { 
    gl.glClear(GL10.GL_COLOR_BUFFER_BIT); 
    gl.glColor4f(1.0f, 1.0f, 1.0f, 1.0f); 
    circle.draw(gl); 
    needle.draw(gl); 
    synchronized (tokens) { 
     for (Token d : tokens) { 
      d.draw(gl); 
     } 
    } 
} 

更新: 一些截圖。 沒有繪製圓和針對象: Without bitmaps

繪製圓和針: With bitmaps (看那些紅線其中應該是一個圓)

在這些圖像之間的代碼唯一的變化是評論的線

circle.draw(gl); 
needle.draw(gl); 

令牌:

public void draw(GL10 gl) { 
    gl.glVertexPointer(3, GL10.GL_FLOAT, 0, vertexBuffer); 

    gl.glPushMatrix(); 
    gl.glTranslatef(x, y, 0f); 
    gl.glScalef(radius, radius, 0f); 
    gl.glColor4f(1.0f, 0.0f, 0.0f, 1.0f); 
    gl.glDrawArrays(GL10.GL_TRIANGLE_FAN, 0, nVertices+2); 
    gl.glPopMatrix(); 
} 

圈和針:

public void draw(GL10 gl) { 
    gl.glVertexPointer(3, GL10.GL_FLOAT, 0, vertexBuffer); 

    if (shouldLoadTexture) { 
     loadGLTexture(gl); 
     shouldLoadTexture = false; 
    } 


    gl.glTexCoordPointer(2, GL10.GL_FLOAT, 0, textureBuffer); 
    gl.glBindTexture(GL10.GL_TEXTURE_2D, textureId); 

    gl.glPushMatrix(); 
    gl.glTranslatef(x, y, 0f); 
    gl.glRotatef((float) angle, 0f, 0f, 1f); 
    angle += rotAngle; 
    if(angle+rotAngle > 360.0) 
     angle -= 360.0; 
    gl.glScalef(width, height, 0f); 
    gl.glDrawElements(GL10.GL_TRIANGLES, indices.length, 
      GL10.GL_UNSIGNED_SHORT, indexBuffer); 
    gl.glPopMatrix(); 

} 

private void loadGLTexture(GL10 gl) { 

    int[] textures = new int[1]; 
    gl.glGenTextures(1, textures, 0); 
    textureId = textures[0]; 

    gl.glBindTexture(GL10.GL_TEXTURE_2D, textureId); 

    gl.glTexParameterf(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_MIN_FILTER, 
      GL10.GL_LINEAR); 
    gl.glTexParameterf(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_MAG_FILTER, 
      GL10.GL_LINEAR); 


    gl.glTexParameterf(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_WRAP_S, 
      GL10.GL_CLAMP_TO_EDGE); 
    gl.glTexParameterf(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_WRAP_T, 
      GL10.GL_REPEAT); 

    GLUtils.texImage2D(GL10.GL_TEXTURE_2D, 0, bitmap, 0); 
} 

更新:

按照什麼阿恩說,在第一個答案,我改變了:

public void draw(GL10 gl) { 
      //New line 
      gl.glEnableClientState(GL10.GL_TEXTURE_COORD_ARRAY); 
    gl.glVertexPointer(3, GL10.GL_FLOAT, 0, vertexBuffer); 

    if (shouldLoadTexture) { 
     loadGLTexture(gl); 
     shouldLoadTexture = false; 
    } 


    gl.glTexCoordPointer(2, GL10.GL_FLOAT, 0, textureBuffer); 
    gl.glBindTexture(GL10.GL_TEXTURE_2D, textureId); 

    gl.glPushMatrix(); 
    gl.glTranslatef(x, y, 0f); 
    gl.glRotatef((float) angle, 0f, 0f, 1f); 
    angle += rotAngle; 
    if(angle+rotAngle > 360.0) 
     angle -= 360.0; 
    gl.glScalef(width, height, 0f); 
    gl.glDrawElements(GL10.GL_TRIANGLES, indices.length, 
      GL10.GL_UNSIGNED_SHORT, indexBuffer); 
    gl.glPopMatrix(); 
      //New line 
      gl.glDisableClientState(GL10.GL_TEXTURE_COORD_ARRAY); 
} 

現在我沒有得到任何圓的。紅線和第二張圖片一樣。

更新:

當我不加載圈和針(只是評論調用loadTexture()),我得到的質地這樣的:

Commenting loadTexture()

所以問題應該與紋理。

+0

不要問我們更多的信息,自己提供更多的信息,因爲你的問題非常模糊,沒有一些代碼。這就像要求一個人在沒有上下文的情況下診斷某些事物。 – Cristina

+0

你說得對。我添加了更多信息。謝謝 – Rafaesp

+0

你可以分別添加圈子,針和令牌的繪製代碼嗎? –

回答

1

繪製圓之前禁用GL_TEXTURE_COORD_ARRAY啓用絨(通過調用glEnable(GL_TEXTURE_2D))開頭,但你沒有提供你的社交圈(標記)任何紋理座標。正如我認爲這些不應該紋理,你應該只爲紋理對象啓用紋理,並在繪製後再次禁用紋理,就像在更新的代碼中啓用和禁用texCoord數組一樣。

+0

你做到了!謝謝!!!! – Rafaesp

1

嘗試與

gl.glDisableClientState(GL10.GL_TEXTURE_COORD_ARRAY); 
+0

我現在啓用GL_TEXTURE_COORD_ARRAY開始繪製圓和針的方法,並在最後禁用。 現在,沒有「線」被繪製,但沒有圈也沒有 – Rafaesp

+0

謝謝,你非常接近。 – Rafaesp