二.GLSurfaceView绘制三角形

前面做好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

 

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值