WebGL关于着色器传值的几种方式总结

Posted hpugisers

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了WebGL关于着色器传值的几种方式总结相关的知识,希望对你有一定的参考价值。

最近两周都在看WebGL,至于为什么要看WebGL???我是想看Cesium源码,发现要想看懂Cesium的源码。需要WebGL知识储备,因为Cesium是基于WebGL开发的三维api封装,但是如果想完全弄懂Cesium,仅靠学习WebGL是无法做到的,需要了解OpenGL、计算机图形学、数字地球等。关于webgis发展认为未来三维GIS应该比较火,二维方面的发展已经相当成熟了,虽然三维现在发展也不错。但是和二维的比还差点意思,说的有点多了,关于WebGL我推荐《WebGL编程指南》这本书,对于入门WebGL这本书可以说做的非常。每个函数参数都给你解释的明明白白,其中也穿插一些GLSLES、线性代数、向量一些知识,可以说我觉得WebGL初级必备。下面讲单个值传入和多个值的传值:

一、三个变量限定词的概念
1、Attribute
用途:传输那些和顶点数据有关的数据(例如,顶点位置、法向量、顶点颜色<每个顶点都对应一个颜色>)
2、uniform
用途:传输那些对于所有顶点都相同(或者与顶点无关数据)=》例如:旋转、平移、缩放的矩阵,每个顶点位置都要用到同样的矩阵来获取变换的位置,对于每一个顶点该矩阵都一样,或者光线的颜色,压根和顶点没有关系
3、varying
用途:从顶点着色器,像片源着色器传递数据 。例如:纹理坐标等,一般通过attribute传给varying
以上三个变量限定词都是全局属性。
二、单值传入(分别以顶点、入射光颜色)
(attribute 传值)
1、声明变量

//顶点着色器代码
var VSHADER_SOURCE = 
  'attribute vec4 a_Position;\\n' + // attribute variable
  'void main() \\n' +
  '  gl_Position = a_Position;\\n' +
  '  gl_PointSize = 10.0;\\n' +
  '\\n

2、获取attribute变量存储地址

var a_Position = gl.getAttribLocation(gl.program, 'a_Position');

3、将顶点传给attribute变量(vertexAttrib3f为组函数)

gl.vertexAttrib3f(a_Position, 0.0, 0.0, 0.0);

(uniform 传值)
1、声明变量

'uniform vec3 u_LightColor;\\n'

2、获取uniform变量存储地址

var u_LightColor = gl.getUniformLocation(gl.program, 'u_LightColor');

3、将入射光颜色传给uniform(这里uniform3f也是组函数)

gl.uniform3f(u_LightColor, 1.0, 1.0, 1.0);

(varying 传值)

三、多值传入
(attribute 传值)
1、声明变量

'attribute vec4 a_Position;\\n' 

2、创建缓冲区对象

var vertexBuffer = gl.createBuffer();

3、绑定缓冲区对象

 gl.bindBuffer(gl.ARRAY_BUFFER, vertexBuffer);

4、将数据写入缓冲区对象

gl.bufferData(gl.ARRAY_BUFFER, vertices, gl.STATIC_DRAW);

5、获取attribute变量存储地址

 var a_Position = gl.getAttribLocation(gl.program, 'a_Position');

6、将缓冲区对象分配给attribute变量

gl.vertexAttribPointer(a_Position, 2, gl.FLOAT, false, 0, 0);

7、开启attribute变量

gl.enableVertexAttribArray(a_Position);

(uniform 传值)
将第六步改成下面代码,第七步去掉即可

 gl.uniformMatrix4fv(u_xformMatrix, false, xformMatrix.elements);

以上是关于WebGL关于着色器传值的几种方式总结的主要内容,如果未能解决你的问题,请参考以下文章

总结vue中组件相互传值的几种方式

ASP.NET 页面之间传值的几种方式

ssmcrud关于修改put的几种传值方式(并不是最终版的集合

总结窗体间传值的几种方法

vue传值的几种方式

Activity传值的几种方式