运行你的shader

225 阅读2分钟

「这是我参与2022首次更文挑战的第6天,活动详情查看:2022首次更文挑战

shader就是着色器语言,用于绘制计算机图形, 但是并不能单独运行。

我们前端的使用方式就是webgl, 也就是js + glsl. 使用webgl绘图, 需要先建立着色器对象, 创建程序,然后把着色器对象装进程序里, 最后激活程序。然后就可以使用gl 上下文执行绘图命令。相对来说还是比较繁琐的。 本文主要介绍如何画出一个矩形, 然后改变片元着色器即可画出不同的效果。

画一个覆盖整个画布的矩形,用作模板。然后就可以练习shader,基本上其他部分不会有太大改动。

众所周知,画一个矩形需要确定四个点。我们这里也一样。 不过,不同的是wegl只能画点, 线 ,三角形。 这个矩形就需要用两个三角形拼凑起来。

着色器部分

着色器通常分为顶点着色器和片元着色器。

简单的说,顶点着色器定位(确定坐标点位),片元着色器上色。 也就是说,如果把将我们的显示器分割成一格一格的像素点。那么, 通过顶点着色器,来确定给哪个像素点上色, 通过片元着色器来确定给那个点上红色还是绿色。

我们先来写着色器代码

顶点着色器

非常简单的几行代码, 就是告诉着色器我们要确定的那几个点。attribute 是声明顶点属性的关键字 ,vec4 是类型声明,代表四维向量。

attribute vec4 a_Position ; 

void main(){
    
    gl_Position = a_Position ;
    gl_PointSize = 10.0;
}

片元着色器

这里的片元着色器,也只是告诉了着色器,我们选择紫色来上色。



 void main(){
     gl_FragColor =  vec4(1,0,1,1);
}

js部分

鉴于活动要求,我就直接截图了,免得代码占比过大。 也就是前面说的 初始化着色器 ,然后用gl上下文绘图。 注释已经写得足够详细了。

image.png

image.png

效果如下

image.png

是不是很麻烦,要是用css写一下就出来了,这是因为越接近底层,就越低级,就越麻烦。 把我们的绘制三角形那行代码改一下,就能看到三角形了。

gl.drawArrays(gl.TRIANGLE_STRIP, 0, 3)

image.png

今天的分享就到这里。