OpenGL基础知识的理解

本文深入解析OpenGL ES 3.0中顶点着色器和片元着色器的工作原理,详细解释了如何通过GLSL语言设置顶点属性,包括顶点坐标和颜色,并演示了如何在Android平台上实现点、线和三角形的绘制。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

之前看过android平台下OpenGL ES 3.0绘制圆点、直线和三角形这篇blog,对于顶点着色器和片元着色器的代码不是很理解,这里算是做个笔记备忘吧

OpenGL超级宝典笔记——GLSL语言基础

1.先看顶点着色器的代码:

	private String vertextShader =
                     "#version 300 es \n" +
                    "layout (location = 0) in vec4 vPosition;\n"
                    + "layout (location = 1) in vec4 aColor;\n"
                    + "out vec4 vColor;\n"
                    + "void main() { \n"
                    + "gl_Position  = vPosition;\n"
                    + "gl_PointSize = 20.0;\n"
                    + "vColor = aColor;\n"
                    + "}\n";

如上,我们得到的信息如下,我们使能了2个顶点属性(参考blog:顶点属性理解),一个是顶点坐标,一个是顶点颜色,这个和后面onDrawFrame代码是能够对应上的,如下:

    public void onDrawFrame(GL10 gl) {
        GLES30.glClear(GLES30.GL_COLOR_BUFFER_BIT);

        //准备坐标数据
        GLES30.glVertexAttribPointer(0, POSITION_COMPONENT_COUNT, GLES30.GL_FLOAT, false, 0, vertexBuffer);
        //启用顶点的句柄,总共有16组属性,这里使能第0组
        GLES30.glEnableVertexAttribArray(0);

        //绘制三角形颜色, 这里为"1"则使能目标颜色,否则是纯黑色
        //启用颜色属性,总共有16组属性,这里使能第1组
        GLES30.glEnableVertexAttribArray(1);
        GLES30.glVertexAttribPointer(1, 4, GLES30.GL_FLOAT, false, 0, colorBuffer);

        GLES30.glDrawArrays(GLES30.GL_POINTS, 0, 3);
        //禁止顶点数组的句柄
        GLES30.glDisableVertexAttribArray(1);
    }

GLES30.glVertexAttribPointerGLES30.glEnableVertexAttribArray分别对应的是配置和使能相应的顶点属性
还有代码里面的gl_Positiongl_PointSize都是对应的opengl的内建变量,而vPositionaColor是用户的自定义变量,很明显以gl_***开头的内建变量你是不能瞎改的,否则肯定出问题,而用户自定义的变量则没关系,这里的gl_Position很明显指的是顶点的坐标,而gl_PointSize对应的是顶点的大小(一个顶点需要占用多少个像素),还有个变量是aColor和vColor,啥意思呢,就是指顶点着色器传入的颜色属性(colorBuffer),经过顶点着色器后的输出变量是vColor,这个变量会进一步传递到片元着色器中。

1.片元着色器的代码:

    private String fragmentShader =
                    "#version 300 es \n" +
                    "precision mediump float;\n"
                    + "in vec4 vColor;\n"
                    + "out vec4 fragColor;\n"
                    + "void main() { \n"
                    + "fragColor = vColor; \n"
                    + "}\n";

这儿的片元着色器很简单,对应的就是指顶点着色器输出的变量传递到片元着色器,片元着色器处理完成后以fragColor变量输出给到后续的步骤处理

特别需要留意的一点,片元着色器中的输入变量vColor和顶点着色器的输出变量vColor必须是完全一样的,这很好理解

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值