2011-12-21 11 views
0

私の頭を叩いて、このようなことを理解しようとした2日後、私はうんざりしてうまくいけば、うまくいけば誰かが私を正しい方向に向けることができます。Android OpenGLES 2.0 2Dレンダリング

私はGLES 2.0でタイルベースのゲームを作ろうとしていますが、私が望むように何かを表示することはできません。基本的に私は正方形のグリッドを形成する三角形のペアを構成する頂点の配列を持っています。このグリッドのサブセクションを一度に描画するには、GLES20.glDrawArrays()を使います。

私は画面全体を埋めていない私の三角形を持ってする方法を見つけ出すことができMatrix.orthoM()Matrix.setLookAtM()の組み合わせを使用して、異なる視点からではなく、私の人生のための「ビュー」する方法を考え出しました。

三角形が(0,0,0)(0,20,0)(20,0,0)として定義されている場合は、プロジェクションの設定に関するガイダンスが必要です私の現在の見解では、幅20ピクセル、高さ20ピクセルです。

ここは私が現在持っているものですが、画面全体が緑色で塗りつぶされています。誰かが私にシーンを操作してカメラをいっぱいにするように正しい方法を示すことができたら、カメラは20の三角形と幅が10の三角形のようにしか見えません。

ときに表面変化:

GLES20.glViewport(0, 0, ScreenX, ScreenY); 
float ratio = ScreenX/ScreenY; 
Matrix.orthoM(_ProjMatrix, 0, 
    -ratio, 
    ratio, 
    -1, 1, 
    3, 7); 
Matrix.setLookAtM(_VMatrix, 0, 
    60, 60, 7, 
    60, 60, 0, 
    0, 1, 0); 

以降の描画:

GLES20.glClear(GLES20.GL_COLOR_BUFFER_BIT | GLES20.GL_DEPTH_BUFFER_BIT); 
Matrix.multiplyMM(_MVPMatrix, 0, _ProjMatrix, 0, _VMatrix, 0); 
if (_activeMap != null) 
    _activeMap.draw(0, 0, (int)ScreenX, (int)ScreenY, _MVPMatrix); 

描画機能:

public void draw(int x, int y, int width, int height, float[] MVPMatrix) 
{ 
    GLES20.glClear(GLES20.GL_COLOR_BUFFER_BIT); 
    GLES20.glUseProgram(_pHandle); 
    GLES20.glUniformMatrix4fv(_uMVPMatrixHandle, 1, false, MVPMatrix, 0); 

    int minRow, minCol, maxRow, maxCol; 
    minRow = (int) (y/Engine.TileSize); 
    minCol = (int) (x/Engine.TileSize); 
    maxRow = (int) (minRow + (height/Engine.TileSize)); 
    maxCol = (int) (minCol + (width/Engine.TileSize)); 
    minRow = (minRow < 0) ? 0 : minRow; 
    minCol = (minCol < 0) ? 0 : minCol; 
    maxRow = (maxRow > _rows) ? (int)_rows : maxRow; 
    maxCol = (maxCol > _cols) ? (int)_cols : maxCol; 

    for (int r = minRow; r < maxRow - 1; r++) 
     for (int d = 0; d < _vBuffers.length; d++) 
     { 
     _vBuffers[d].position(0); 
     GLES20.glVertexAttribPointer(_vAttHandle, 3, GLES20.GL_FLOAT, 
      false, 
      0, _vBuffers[d]);    
     GLES20.glEnableVertexAttribArray(_vAttHandle); 
     GLES20.glDrawArrays(GLES20.GL_TRIANGLES, 
      (int) (r * 6 * _cols), 
      (maxCol - minCol) * 6); 
     } 
} 

シェーダスクリプト:

private static final String _VERT_SHADER = 
    "uniform mat4 uMVPMatrix;     \n" 
+ "attribute vec4 vPosition;     \n" 
+ "void main()        \n" 
+ "{           \n" 
+ " gl_Position = uMVPMatrix * vPosition; \n" 
+ "}           \n"; 

private static final String _FRAG_SHADER = 
    "precision mediump float;       \n" 
+ "void main()           \n" 
+ "{             \n" 
+ " gl_FragColor = vec4 (0.63671875, 0.76953125, 0.22265625, 1.0); \n" 
+ "}             \n"; 

答えて

1

タイルベースのゲームでは、単純な変換がはるかに適切ですが、setLookAtはちょっと残虐です。

+0

2.0にglTranslateがありますか?また、それは私が画面上に特定の数の三角形を表示する方法を説明しません。 – FlyingStreudel

+0

@FlyingStreudel:文字通りではありませんが、変換の変換はあなたのケースではいくつかのsetLookAtよりも派手です。また、表示される三角形の数は、選択した投影ボリュームの制限の問題です。 – datenwolf

+0

ああ、私はOpenGLには慣れていないので、行列変換を使って頂点を操作しようとします。しかし、プロジェクションボリュームの制限が意味することをもう少し詳しく説明できますか? – FlyingStreudel

0

私はあなたを助けてくれることを願っています。 OpenGLプログラミングのこのリンクを確認してください。

OpenGL Programming Guide

章3.Viewingに移動ここでは、投影についての情報を見つけることができます。

関連する問題