2011-12-31 2 views
2

다음 코드는 GLSurfaceView와 대각선 프레임을 그리려고하지만 그 대신 큰 검은 색 화면이 표시됩니다. 직교 투영을 설정하고, 뷰포트 크기를 View 크기에 맞추고, glDrawArrays()로 프레임 선을 그리고 glDrawElements()로 대각선을 그려 봅니다. 문제의 원인을 찾지 못했습니다.OpenGL ES 1.0을 사용하는 Android의 선 그리기

public class MapView extends GLSurfaceView implements Renderer { 

private int w, h; 

private FloatBuffer frameVertices; 

private ByteBuffer diagIndices; 

public MapView(Context ctx) { this(ctx, null); } 

public MapView(Context context, AttributeSet attrs) { 
    super(context, attrs); 
    setRenderer(this); 
} 

@Override 
public void onDrawFrame(GL10 gl) { 
    gl.glClear(GL10.GL_COLOR_BUFFER_BIT); 
    gl.glEnableClientState(GL10.GL_VERTEX_ARRAY); 
    gl.glVertexPointer(2, GL10.GL_FLOAT, 0, frameVertices); 
    gl.glColor4f(0f, 0f, 1f, 0.5f); 
    gl.glDrawArrays(GL10.GL_LINE_LOOP, 0, 4); 
    gl.glDrawElements(GL10.GL_LINES, 1, GL10.GL_UNSIGNED_BYTE, diagIndices); 
    gl.glDisableClientState(GL10.GL_VERTEX_ARRAY); 
} 

@Override 
public void onSurfaceChanged(GL10 gl, int width, int height) { 
    // TODO Auto-generated method stub 

} 

@Override 
public void onSurfaceCreated(GL10 gl, EGLConfig config) { 
    w = getWidth(); h = getHeight(); 
    TRC.debug("w = " + w + ", h = " + h); 
    gl.glClearColor(0, 0, 0, 1); 
    gl.glViewport(0, 0, w, h); 
    gl.glDepthRangex(1, -1); // TODO remove 
    gl.glMatrixMode(GL10.GL_PROJECTION); 
    gl.glLoadIdentity(); 
    gl.glOrthox(0, w, 0, h, 1, -1); 

    float[] frame = { 
     0, 0, 
     w-1, 0, 
     w-1, h-1, 
     0, h-1 }; 
    ByteBuffer byteBuffer = ByteBuffer.allocateDirect(frame.length * 4); 
    byteBuffer.order(ByteOrder.nativeOrder()); 
    frameVertices = byteBuffer.asFloatBuffer(); 
    frameVertices.put(frame); 
    frameVertices.flip(); 
    frameVertices.position(0); 
    gl.glLineWidthx(10); 
    gl.glMatrixMode(GL10.GL_MODELVIEW); 
    gl.glLoadIdentity(); 
    gl.glDisable(GL10.GL_DEPTH_TEST); 
    diagIndices = ByteBuffer.allocateDirect(2); 
    diagIndices.order(ByteOrder.nativeOrder()); 
    diagIndices.put(new byte[] {0, 2}); 
    diagIndices.flip(); 
} 

} 

무엇이 문제 일 수 있습니까?

답변

0

gl.glDepthRangex() 메서드 호출이 필요하지 않으며 근거리 및 원거리 자르기 평면이 gl.glOrthox()으로 전환됩니다. 그것 이외에, 나는 틀린 아무것도 보지 않는다. gl.glClearColor()으로 다른 명확한 색상을 설정해보십시오.하지만별로 차이가 없을 것이라고 생각합니다.

다시 생각

, 가까운 클립 비행기가 0으로 더 나을 수 있습니다,이 시도 : gl.glOrthox(0, w, 0, h, 0, 1);

+0

안녕하세요, 고맙습니다. 나는 다른 명확한 색깔을 시도하고 효과가있다. 나는 클리핑면을 0, 1로 변경했고 어떤 차이도 느끼지 못했다. 전체보기는 선명한 색으로 채워집니다 (좋음, 적어도 GL의 일부가 작동하는 것으로 알고 있음). – Endre

+0

우선 화면 중앙으로 임의의 점으로 꼭지점 하드 코딩을 변경하십시오. 아무것도 보이지 않으면'int error = gl.glGetError(); if (error! = GL10.GL_NO_ERROR) {Log.e (error); OpenGL이 던지고있는 특정 오류가 있는지 확인하십시오. 귀하의 오류 int, 여기 [http://developer.android.com/reference/javax/microedition/khronos/opengles/GL10.html]의 의미와 오류 코드에 대한 설명을 볼 수 있습니다. ] (http://www.opengl.org/wiki/GL_Error_Codes). 여기에 오류로 의견을 말하면 더 자세히 살펴볼 것입니다. –

+0

glGetError()는 onDrawFrame() 메서드에서 GL 호출이 끝날 때마다 0으로 반환됩니다. 이제 내가 시도한 것은 다운로드 된 예제 소스에서 투영법을 원근법 기반으로 변경하는 것입니다. 수정 된 예제는 작동하지만 내 앱은 작동하지 않지만 두 앱 간의 까다로운 차이점을 파악할 수는 없습니다. – Endre

2

나는이 문제를 알아 냈어. glOrthox()을 사용했는데, x은 정수 값을 의미한다고 생각했습니다. 하지만 정확히는 중간 지점의 이진 지점으로 처리됩니다. 16bit.16bit. 내 정점이 화면 범위를 벗어났습니다. 내 솔루션은 glOrthox()glOrthof()으로 변경했습니다. 도와 주셔서 감사합니다!

관련 문제