OpenGl Es(二)——绘制三角形详解
3 minute read
下面是使用OpenGl Es绘制一个基本的三角形,旨在熟悉其使用流程。
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
TestGlSurfaceView view = new TestGlSurfaceView(this);
view.setRenderer(new TestRenderer());
//设置布局
setContentView(view);
}
}
class TestGlSurfaceView extends GLSurfaceView {
public TestGlSurfaceView(Context context) {
super(context);
}
public TestGlSurfaceView(Context context, AttributeSet attrs) {
super(context, attrs);
}
}
class TestRenderer implements GLSurfaceView.Renderer {
@Override
public void onSurfaceCreated(GL10 gl10, EGLConfig eglConfig) {
//设置清屏颜色
gl10.glClearColor(0f, 0f, 0f, 1f);
//启用客户端状态,这里的参数是启用顶点缓冲区数组才可以使用其绘制三角形,这里是开启相关的状态机
gl10.glEnableClientState(GL10.GL_VERTEX_ARRAY);
}
@Override
public void onSurfaceChanged(GL10 gl10, int i, int i1) {
/*
设置视口,即要显示的区域
int x, 要显示区域左下角的x坐标
int y, 要显示区域左下角的y坐标
int width, 显示区域的宽度
int height, 显示区域的高度
*/
gl10.glViewport(0, 0, i, i1);
//设置矩阵模式为投影矩阵
gl10.glMatrixMode(gl10.GL_PROJECTION);
//重置矩阵,即初始化为单位矩阵
gl10.glLoadIdentity();
/*
设置平截头体(视景体),设置一个比例来进行显示,即ratio
float left, 近平面的左边距离原点的距离
float right, 近平面的右边距离原点的距离
float bottom, 近平面的底部距离原点的距离
float top, 近平面的上部距离原点的距离
float zNear, 相机距离近平面的距离
float zFar, 相机距离远平面的距离
值都是向量值
*/
float ratio = (float) i / (float) i1;
gl10.glFrustumf(-1f, 1f, -ratio, ratio, 3, 7);
}
@Override
public void onDrawFrame(GL10 gl10) {
//清理颜色缓冲区
gl10.glClear(GL10.GL_COLOR_BUFFER_BIT);
gl10.glMatrixMode(GL10.GL_MODELVIEW);
gl10.glLoadIdentity();
//设置相机的朝向
/* gl a GL10 interface
镜头的位置
eyeX eye point X
eyeY eye point Y
eyeZ eye point Z
相机视图的中心点,为平截头体的中心点
centerX center of view X
centerY center of view Y
centerZ center of view Z
确定相机上方的向量
upX up vector X
upY up vector Y
upZ up vector Z*/
GLU.gluLookAt(gl10, 0, 0, 5, 0, 0, 0, 0, 1, 0);
//三角形的三个顶点数组
float[] coords = {
0f, 0.5f, 0f,
-0.5f, -0.5f, 0f,
0.5f, -0.5f, 0f
};
//字节缓冲区,用来存放顶点坐标数据
ByteBuffer ibb = ByteBuffer.allocateDirect(coords.length * 4);
//顶点的排序,设置为存入的顺序
ibb.order(ByteOrder.nativeOrder());
FloatBuffer fbb = ibb.asFloatBuffer();
fbb.put(coords);
//将指针指向首坐标
ibb.position(0);
//设置绘制的颜色
gl10.glColor4f(0f, 1f, 1f, 1f);
/*
* 设置绘制的相关参数
* int size, 指定为二维还是三维
* int type, 每个点的的数据类型,这里是float
* int stride, 跨度,即点是否连续绘制
* Buffer pointer, 指定的顶点缓冲区
*
* */
gl10.glVertexPointer(3, GL10.GL_FLOAT, 0, ibb);
/*
* 进行三角形的绘制
* int mode, 绘制的模式
* int first, 绘制顶点的起点,一般为0
* int count,绘制的点数
*/
gl10.glDrawArrays(GL10.GL_TRIANGLES, 0, 3);
}
}
I feedback.
Let me know what you think of this article on twitter @Yanlei_Hello or leave a comment below!
Let me know what you think of this article on twitter @Yanlei_Hello or leave a comment below!
comments powered by Disqus