2011-09-01 187 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