2011-12-21 109 views
0

經過兩天的抨擊我的頭並試圖找出這些東西,我一直很不成功,希望有人能指出我的方向正確。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 2011-12-21 23:13:05

+0

@FlyingStreudel:不是字面上的,但是在你的情況下,翻譯轉換比一些setLookAt更合適。而可見的三角形數量只是選擇投影量限制的問題。 – datenwolf 2011-12-21 23:15:44

+0

好吧,我真的不熟悉openGL,我會嘗試使用矩陣變換來操作頂點。但是,您能否更詳細地解釋投影量限制的含義? – FlyingStreudel 2011-12-21 23:24:39

0

我希望它可以幫助你。檢查這個鏈接的OpenGL編程。

OpenGL Programming Guide

轉到章3.Viewing在這裏你可以找到關於投影信息。