GLSL三种基本类型(着色器语言三种变量)

 

着色器语言和C语言一样,通过一个表示特定数据类型的关键词声明一个变量,比如int num;通过int关键字声明一个整数型变量num,不过着色器语言还提供了三个关键字attributeuniformvarying用来声明特定用途的变量。

attributeuniform关键字的目的主要是为了javascript语言可以通过相关的WebGL API把一些数据传递给着色器,如果一个着色器中一个变量,着色器代码中变量不通过attributeuniform声明标识,该变量是不能从javascript代码中获得相应的数据。

 

关键字(变量类型)数据传递声明变量
attributejavascript——>顶点着色器声明顶点数据变量
uniformjavascript——>顶点、片元着色器声明非顶点数据变量
varying顶点着色器——>片元着色器声明需要插值计算的顶点变量

attribute:

1)只在顶点着色器中使用。

2)一般用于表示顶点坐标、纹理坐标等。

3)使用bindAttributeLocation来设置变量在着色器程序中参数列表的索引。

4)使用glVertexAttribPointer来设置attribute的数值。

// attribute声明顶点位置变量
attribute vec4 position;
// 与顶点相关的浮点数
attribute float scale;
void main() {
  // 每个顶点的x坐标乘以该顶点对应的一个系数scale
  gl_Position = vec4(position.x*scale,position.y,position.z,1.0);
}
​

uniform:

1)uniform是由外部程序传递给顶点着色器和片元着色器的变量。

2)当顶点着色器和片元着色器声明了一个完全一样的unifrom变量,则两者都可以访问到数据,但不能修改,相当于只读全局变量。

3)一般情况下用于表示材质数据。

片元着色器中通过uniform关键字声明了一个颜色变量color,为了给该变量传递数据在ShaderMaterial对象的uniforms属性中定义了一个名为color的属性,按照Three.js系统uniform变量数据自动传递的机制,如果你在着色器代码中自定义声明了多个uniform变量,只要名字和ShaderMaterial对象中uniform数据的名字保持一直就可以正确完成数据传递。

<!-- 片元着色器 -->
<script id="fragmentShader" type="x-shader/x-fragment">
  // color变量数据来自ShaderMaterial的uniforms属性的color属性
  uniform vec3 color;
  void main() {
 // gl_FragColor = vec4(1.0,0.0,0.0,1.0);
 gl_FragColor = vec4(color,1.0);
  }
</script>

ShaderMaterial的uniforms属性代码

var material = new THREE.ShaderMaterial({
  //定义uniforms属性,uniforms的属性和着色器中的uniform变量相对应
  uniforms:{
// 颜色属性clor对应片元着色器代码中uniform声明的color变量
color:{value:new THREE.Color(0xff0000)}
  },
  // 顶点着色器
  vertexShader: document.getElementById('vertexShader').textContent,
  // 片元着色器
  fragmentShader: document.getElementById('fragmentShader').textContent,
})

varing:

1)用于顶点着色器和片元着色器之间传递的变量。

2)由顶点着色器赋值,片元着色器只读。

3)二者的声明必须完全一直,外部程序不能使用该变量。

<!-- 顶点着色器源码 -->
<script id="vertexShader" type="x-shader/x-vertex">
  //attribute声明vec4类型变量apos
  attribute vec4 apos;
  // attribute声明顶点颜色变量
  attribute vec4 a_color;
  //varying声明顶点颜色插值后变量
  varying vec4 v_color;
  void main() {
    // 顶点坐标apos赋值给内置变量gl_Position
    gl_Position = apos;
    //顶点颜色插值计算
    v_color = a_color;
  }
​
</script>
<!-- 片元着色器源码 -->
<script id="fragmentShader" type="x-shader/x-fragment">
  // 所有float类型数据的精度是lowp
  precision lowp float;
  // 接收顶点着色器中v_color数据
  varying vec4 v_color;
  void main() {
    // 插值后颜色数据赋值给对应的片元
    gl_FragColor = v_color;
  }
​
</script>
  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值