2011-09-01 9 views
2

업데이트 : 요약 : 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(); 
} 
,691 363,210

원형 바늘 :

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를 비활성화합니다. 이 텍스쳐 화되지 않아야한다고 생각 하듯이, 실제로 텍스쳐링 된 객체에 대해서만 텍스쳐를 가능하게하고, 업데이트 된 코드에서 texCoord 배열을 활성화 및 비활성화하는 것과 같은 방법으로 텍스쳐를 다시 그릴 수 있습니다.

+0

당신이 해냈어! 감사!!!! – Rafaesp

1

봅니다 당신은 처음에 (glEnable(GL_TEXTURE_2D) 호출하여) 텍스처를 사용하지만, 서클 (토큰) 어떤 텍스처 좌표를 제공하지 않는

gl.glDisableClientState(GL10.GL_TEXTURE_COORD_ARRAY); 
+0

이제 원과 바늘의 그리기 시작 부분에서 GL_TEXTURE_COORD_ARRAY을 (를) 사용 설정하고 끝에서 사용을 중지합니다. 이제는 "선"이 그려지 지 않고 원이 없습니다. – Rafaesp

+0

고마워, 너 정말 가까웠다. – Rafaesp

관련 문제