前面做好OpenGL绘制的准备工作,今天我们先来绘制一个三角形。
原理介绍
Vertex Shader顶点着色器,实现了一种通用的可编程方法操作顶点。顶点着色器被使
用在传统的基于顶点的操作,例如位移矩阵、计算光照方程、产生贴图坐标。顶点着色器被用指定,应用于客户的顶点转化;
在编程中,顶点着色器的输入主要有:
1.Attributes——属性,顶点矩阵支持的Per_vertex数据
2.Uniforms——顶点着色器使用的常量数据
3.Samplers——被Uniforms使用的特殊类型,在顶点着色器的贴图中使用(是可选的)4.ShaderProgram——顶点着色器编程源码或可执行的部分
对应的,顶点着色器的输出叫做varying变量(后面章节会用到);
Fragment Shader片段着色器,用他来处理片段。负责三角形像素的最终颜色;顶点只绘
制了几个点,需要用片段着色器进行填充;
封装三角形类
public class Triangle {
//着色器代码
private final String vertexShaderCode =
"attribute vec4 a_Position;" +
"void main() {" +
" gl_Position = a_Position;" +
"}";
private final String fragmentShaderCode =
"precision mediump float;" +
"uniform vec4 u_Color;" +
"void main() {" +
" gl_FragColor = u_Color;" +
"}";
//------------- 局部变量------------------
private Context mContext;
//定义position和color的ID,用来传递参数
private int mColorID;
private int mPositionID;
//定义program的ID
private int mProgramID;
//顶点缓冲区
FloatBuffer mVertexTriangle;
//------------- 全局变量定义--------------
//数组中每个顶点的坐标数
private static final int COORDS_PER_VERTEX = 2;
//浮点数占字节数
private static final int BYTES_PER_FLOAT = 4;
//三角形顶点坐标
private static float mTriangleCoords[] =
{ 0.0f, 0.5f, // top
-0.5f, 0.0f, // bottom left
0.5f, 0.0f // bottom right
};
//定义顶点着色器和片段着色器的变量名
private static final String A_POSITION = "a_Position";
private static final String U_COLOR = "u_Color";
//---------------------------------------------------------------------
public Triangle(Context context) {
mContext = context;
mVertexTriangle = ByteBuffer
.allocateDirect(mTriangleCoords.length * BYTES_PER_FLOAT)
.order(ByteOrder.nativeOrder())
.asFloatBuffer();
//添加坐标
mVertexTriangle.put(mTriangleCoords);
//设置第一个坐标开始读
mVertexTriangle.position(0);
getProgram();
//获取Position和Color的ID
mColorID = GLES20.glGetUniformLocation(mProgramID, U_COLOR);
mPositionID = GLES20.glGetAttribLocation(mProgramID, A_POSITION);
//传入值
GLES20.glVertexAttribPointer(mPositionID, COORDS_PER_VERTEX,
GLES20.GL_FLOAT, false, 0, mVertexTriangle);
GLES20.glEnableVertexAttribArray(mPositionID);
}
//获取Program
private void getProgram() {
//获取ProgramID
mProgramID = ShaderHelper.buildProgram(vertexShaderCode, fragmentShaderCode);
GLES20.glUseProgram(mProgramID);
}
//绘制图形
public void draw() {
GLES20.glUniform4f(mColorID, 0.0f, 0.0f, 1.0f, 1.0f);
GLES20.glDrawArrays(GLES20.GL_TRIANGLES, 0, mTriangleCoords.length);
}
}
绘制过程
1)创建三角形绘制类,代码如下:
public void onSurfaceCreated(GL10 gl10, EGLConfig config) {
//设定颜色RGBA
glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
mTriangle = new Triangle(mContext);
}
2)绘制三角形,代码如下:
public void onDrawFrame(GL10 gl10) {
//清空屏幕,擦除屏幕上所有的颜色,用glClearColor定义的颜色填充
glClear(GL_COLOR_BUFFER_BIT);
mTriangle.draw();
}
代码地址:https://download.csdn.net/download/gaojun1146/10697890