经过两天的抨击我的头并试图找出这些东西,我一直很不成功,希望有人能指出我的方向正确。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";
2.0中有glTranslate吗?此外,这并不能解释我将如何在屏幕上显示特定数量的三角形...... – FlyingStreudel 2011-12-21 23:13:05
@FlyingStreudel:不是字面上的,但是在你的情况下,翻译转换比一些setLookAt更合适。而可见的三角形数量只是选择投影量限制的问题。 – datenwolf 2011-12-21 23:15:44
好吧,我真的不熟悉openGL,我会尝试使用矩阵变换来操作顶点。但是,您能否更详细地解释投影量限制的含义? – FlyingStreudel 2011-12-21 23:24:39