2011-12-31 45 views
2

次のコードは、GLSurfaceViewと対角線のフレームを描画しようとしますが、結果は大きな黒い画面になります。私は、orthonogal投影を設定しようとすると、ビューサイズを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()で別の透明な色を設定してみてください。しかし、それは大きな違いはないと思います。私はこの問題を考え出しgl.glOrthox(0, w, 0, h, 0, 1);

+0

こんにちは、ありがとうございます。私は別の明確な色を試して、それは効果があります。私はクリッピング・プレーンを0,1に変更し、何の違いにも気付かなかった。全体像が鮮明な色で塗りつぶされています(少なくとも、GLの一部が機能していることはわかります)。 – Endre

+0

まず、頂点を画面の中央に向かってランダムなポイントにハードコーディングしてみてください。何も表示されない場合は、 'int error = gl.glGetError(); if(エラー!= GL10.GL_NO_ERROR){Log.e(エラー); OpenGLが投げている特定のエラーがあるかどうかを調べるために、drawメソッドの最後に 'あなたのエラーは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で返されます。今私が試みるのは、ダウンロードされたサンプルソースの直交性に基づいて、投影から見方を変えることです。変更された例は動作していますが、私のアプリはそうではありませんが、私はまだ2つのアプリの間の厄介な違いを理解できませんでした。 – Endre

2

:二思想に

は、ニアクリップ面を0として方が良いかもしれないが、これを試してみてください。私はglOrthox()を使用しました。私はxが整数値を意味すると考えました。しかし、それは正確ではありません、それは中間で2進小数点で扱われます。 16bit.16bit。私の頂点は画面範囲外でした...私の解決策はglOrthox()glOrthof()に変更することでした。助けてくれてありがとう!

関連する問題