在webgl中,调用了OpenGL-ES-2.0的API,而在OpenGL-ES专为嵌入式设备设计,其和其它设备一样,都是使用GLSL(GL Shading Language)来编写片段程序并执行于GPU的着色器上,来完成对对象的渲染。GLSL在其中起着相当重要的作用,所以要玩好 ...
在webgl中,调用了OpenGL-ES-2.0的API,而在OpenGL-ES专为嵌入式设备设计,其和其它设备一样,都是使用GLSL(GL Shading Language)来编写片段程序并执行于GPU的着色器上,来完成对对象的渲染。GLSL在其中起着相当重要的作用,所以要玩好webgl,我们就得把GLSL搞懂,本文主要介绍shader的基础使用及组成。
整个管线处理过程:
1.指定几何对象
- 顶点数组(直接将顶点数据传送至shader里)
- 顶点索引(将顶点数据保存于缓冲区中,用索引来从缓冲区获取数据传入shader)
2.逐个顶点操作
3.图元组装
根据指定的图元组装方式将若干顶点组成一个图元,OpenGL支持的几何图元有点、线、不闭合折线、闭合折线、多边形、三角形、线型连续填充三角形、扇形连续填充三角形、四边形以及连续填充四边形。
而webgl支持的图元为POINTS(点), LINE_STRIP(不闭合折线), LINE_LOOP(闭合折线), LINES(独立的线段), TRIANGLE_STRIP(顶点按顺序相连的三角形), TRIANGLE_FAN(扇形顺序组合三角形), TRIANGLES(每三个顶点组合成一个三角形)。
绘制三角形序列的三种方式解释了三种三角形绘制方法之间的不同。
4.图元处理
5.栅格化(生成片元fragment)
6.片元处理
7.逐个片元操作
8.帧缓冲区操作
在这八个步骤中,我们最重要的是对顶点和片元的操作,在整个管线中,我们可以加入的自己程序的部分则是顶点着色器和片元着色器部分。
着色器
顶点着色器:
操作的是顶点值和其关联的数据,它可完成下面这些操作:
- 顶点变换
- 法线变换以及规格化
- 纹理坐标生成
- 纹理坐标变换
- 光照
- 彩色材质应用
顶点着色器必须计算坐标在裁剪空间中的齐次位置并将结果存储在特殊的输出变量gl_Position中,它还有特殊的输出变量gl_ClipVertex,gl_PointSize。
顶点处理器的输出将被发送到后续的处理阶段,即:图元组装,用户裁剪,平截裁剪,透视划分,视口贴图,多边形偏移,多边形模式,阴影模式,消隐等。
片元着色器:
处理片元值及其相关联数据,它可执行传统的图形操作,如:
在插值等到的值上的操作
片元着色器其有特殊的输入变量gl_FragCoord(片元的窗口相对坐标)和gl_FrontFacing(正面图元为true,反之为false),经过计算颜色和深度将这些值写入特殊的输出变量gl_FragColor和gl_FragDepth中,或者完全丢弃(使用discard关键字)片元。
片元处理器的一大优点是它可以任意多次地访问纹理内存,并可以任意方式结合所读取的值,一次纹理访问的结果可作为执行另一次纹理访问的基础。
有三个精度可选择:lowp highp mediump
精度可指定于变量或设置默认精度
顶点着色器中的float和init默认精度为highp
片元着色器中float没有默认精度,所以必须为其指定默认精度,如:precision mediump float;
着色器多个执行是可并行发生的,针对每个顶点都会执行一次顶点着色器,针对每个片元都会执行一次片元着色器。
限定符
我们要向着色器中传入数据,则要了解其里面变量的组成和输入方式
属性变量(attribute):
这些变量代表了非常频繁地从应用程序传递到顶点处理器的值,只应用于程序中定义顶点数据,所以只允许作为顶点着色器的一部分,该值可以像每个顶点那样经常变动
一致变量(uniform):
用来将数据值从应用程序传递到顶点处理器或片元处理器,一致变量通常用来提供不频繁变动的值。
易变变量(varying):
定义了从顶点处理器传递到片元处理器的数据。
常量变量(const):
如C中的常量变量
数据类型
标量:
支持使用浮点数(float)、整数(int)和布尔值(bool)
矢量:
浮点数矢量:
vec2 (2个浮点数的矢量)
vec3 (3个浮点数的矢量)
vec4 (4个浮点数的矢量)
整数矢量:
ivec2 (2个整数的矢量)
ivec3 (3个整数的矢量)
ivec4 (4个整数的矢量)
布尔矢量:
bvec2 (2个布尔值的矢量)
bvec3 (3个布尔值的矢量)
bvec4 (4个布尔值的矢量)
矩阵:
mat2 (2×2的浮点数矩阵)
mat3 (3×3的浮点数矩阵)
mat4 (4×4的浮点数矩阵)
mat矩阵就像是一个vec数组,它也可以使用数组来进行访问。
取样器:
sampler1D (访问一个一维纹理)
sampler2D (访问一个二维纹理)
sampler3D (访问一个三维纹理)
samplerCube (访问一个立方贴图纹理)
sampler1DShadow (访问一个带对比的一维深度纹理)
sampler2DShadow (访问一个带对比的二维深度纹理)
只能通过uniform限定的取样器从应用程序接收取样器
使用时: uniform sampler2D texture;
操作
如果要对矢量进行部分操作,则可用访问矢量中的部分来使用,在shader中,共有三组组合供使用:
这四个值只是分别读取矢量中的第一个、第二个、第三个、第四个值,只是为了编写方便,语义化了三组组合,分别为坐标、纹理、颜色,但是使用它们去读取出来的值是一样的,如:
vec4 values = vec4(1.0,2.0,3.0,4.0);values.z; //3.0values.p; //3.0values.b; //3.0
The end.
海外公司注册、海外银行开户、跨境平台代入驻、VAT、EPR等知识和在线办理:https://www.xlkjsw.com
原标题:WebGL中的OpenGL着色器语言
关键词:web
*特别声明:以上内容来自于网络收集,著作权属原作者所有,如有侵权,请联系我们:
admin#shaoqun.com
(#换成@)。