-1

Android デバイスで OpenGL ES を使用して、好きなだけ異なる形状を表示したいと考えています。問題は、私のコードが長方形のような簡単な形状 (以下で使用します) に対しても機能しないことです。

に何か問題があると思いますglTranslatef。すべての値を調整しましたが、それが何であるかわかりません。

Rectangle は points によって定義されP(0,0,0), P(0,1,0), P(1,1,0), P(1,0,0)ます。私はこのようActivityに実装しましたGLSurfaceView.Renderer

private static FloatBuffer getVertexCoords() {
    float coords[] = {
        0f, 0f, 0f, // first triangle first point
        0f, 1f, 0f, // first triangle second point
        1f, 1f, 0f, // first triangle third point
        1f, 1f, 0f, // second triangle first point
        1f, 0f, 0f, // second triangle second point
        0f, 0f, 0f, // second triangle third point                
        }
    ByteBuffer vbb = ByteBuffer.allocateDirect(coords.length * 4); // n coords * 4 bytes per float
    vbb.order(ByteOrder.nativeOrder());
    FloatBuffer trianglesVB = vbb.asFloatBuffer();
    trianglesVB.put(coords);
    trianglesVB.position(0);
    return trianglesVB;
}


@Override
public void onDrawFrame(GL10 gl) {
   gl.glClear(GL10.GL_COLOR_BUFFER_BIT | GL10.GL_DEPTH_BUFFER_BIT);
   gl.glMatrixMode(GL10.GL_MODELVIEW);
   gl.glLoadIdentity();
   gl.glTranslatef(0f, 0f, -4f);
   gl.glEnableClientState(GL10.GL_VERTEX_ARRAY); // glBegin
   gl.glColor4f(1.0f, 0.0f, 0.0f, 1.0f);
   gl.glVertexPointer(3, GL10.GL_FLOAT, 0, getVertexCoords());
   gl.glDrawArrays(GL10.GL_TRIANGLES, 0, 2 * 3 * 3); // triangles * points * coords
   gl.glDisableClientState(GL10.GL_VERTEX_ARRAY); // glEnd
   int error = gl.glGetError();
   if (error != GL10.GL_NO_ERROR) {
       Log.e(TAG, "OpenGL ES Error: " + error);
   }
}

@Override
public void onSurfaceChanged(GL10 gl, int width, int height) {
    // think this one doesn't matter
}

@Override
public void onSurfaceCreated(GL10 gl, EGLConfig config) {
    gl.glClearColor(1.0f, 1.0f, 1.0f, 1.0f);    // white background
    gl.glFrontFace(GL10.GL_CW);         // front face is clockwise

}
4

1 に答える 1

0

どこかに射影行列が必要だと思います。設定しない場合は、正規化されたデバイス座標で直接描画されます。有効な z 値は (-1 から 1) までです。

三角形が表示されている深さの範囲外にあるだけです。

単純な射影行列を onSurfaceCreated に追加してみてください。

glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glOrtho(-10, 10, -10, 10, 0, 10);
于 2012-04-19T17:40:57.510 に答える