GLSL三种基本类型(着色器语言三种变量)
着色器语言和C语言一样,通过一个表示特定数据类型的关键词声明一个变量,比如int num;
通过int关键字声明一个整数型变量num,不过着色器语言还提供了三个关键字attribute
、uniform
和varying
用来声明特定用途的变量。
attribute
和uniform
关键字的目的主要是为了javascript语言可以通过相关的WebGL API把一些数据传递给着色器,如果一个着色器中一个变量,着色器代码中变量不通过attribute
或uniform
声明标识,该变量是不能从javascript代码中获得相应的数据。
关键字(变量类型) | 数据传递 | 声明变量 |
---|---|---|
attribute | javascript——>顶点着色器 | 声明顶点数据变量 |
uniform | javascript——>顶点、片元着色器 | 声明非顶点数据变量 |
varying | 顶点着色器——>片元着色器 | 声明需要插值计算的顶点变量 |
attribute:
1)只在顶点着色器中使用。
2)一般用于表示顶点坐标、纹理坐标等。
3)使用bindAttributeLocation来设置变量在着色器程序中参数列表的索引。
4)使用glVertexAttribPointer来设置attribute的数值。
// attribute声明顶点位置变量
attribute vec4 position;
// 与顶点相关的浮点数
attribute float scale;
void main() {// 每个顶点的x坐标乘以该顶点对应的一个系数scalegl_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类型变量aposattribute vec4 apos;// attribute声明顶点颜色变量attribute vec4 a_color;//varying声明顶点颜色插值后变量varying vec4 v_color;void main() {// 顶点坐标apos赋值给内置变量gl_Positiongl_Position = apos;//顶点颜色插值计算v_color = a_color;}
</script>
<!-- 片元着色器源码 -->
<script id="fragmentShader" type="x-shader/x-fragment">// 所有float类型数据的精度是lowpprecision lowp float;// 接收顶点着色器中v_color数据varying vec4 v_color;void main() {// 插值后颜色数据赋值给对应的片元gl_FragColor = v_color;}
</script>
GLSL三种基本类型(着色器语言三种变量)相关推荐
- OpenGL ES着色器语言之语句和结构体(官方文档第六章)内建变量(官方文档第七、八章)...
OpenGL ES着色器语言之语句和结构体(官方文档第六章) OpenGL ES着色器语言的程序块基本构成如下: 语句和声明 函数定义 选择(if-else) 迭代(for, while, do-wh ...
- Godot着色器语言
引言 Godot 使用的了一种非常接近GLSL ES 3.0的着色器语言,并且支持其绝大多数的数据类型和函数,尚未完全支持的部分也会逐渐增加进去. 如果你对GLSL熟悉的话,可以直接阅读 <Go ...
- 着色器语言(GLSL)基础学习三
内置的常量 glsl提供了一些内置的常量,用来说明当前系统的一些特性. 有时我们需要针对这些特性,对shader程序进行优化,让程序兼容度更好. 在 vertex Shader 中: 1.const ...
- OpenGL ES着色器语言(GLSL ES)规范 ——下篇
文章目录 前言 分支和循环 if.if-else for continue.break.discard 着色器内置变量 函数 函数定义 规范声明 webgl内置函数 存储限定字 const attri ...
- OpenGLES2.0着色器语言glsl
OpenGLES2.0中是强制使用可编程的渲染管线的,使用的是glsl着色器语言,因为着色器语言是使用的GPU,即图形处理单元,而不是CPU,这样可以使CPU从繁重的几何计算和像素的处理中解脱出来了. ...
- OpenGL着色器语言GLSL语法总结
GLSL语法与C语言类似. 1.变量类型 基础类型:bool,int,uint,float,double与C语言的类型类似. 向量类型:vecN,bvecN,ivecN,uvecN,dvecN,N表示 ...
- OpenGL ES着色器语言之变量和数据类型
所有变量和函数在使用前必须声明.变量和函数名是标识符. 没有默认类型,所有变量和函数声明必须包含一个声明类型以及可选的修饰符.变量在声明的时候首先要标明类型,后边可以跟多个变量,之间用逗号隔开.很多情 ...
- 可编程渲染管线与着色器语言
Programming pipeline & shading language 大家好,今天想给大家介绍一下可编程渲染管线和着色器语言的相关基础知识,使想上手SHADER编程的童鞋们可以快速揭 ...
- 第三章 opengl之着色器
OpenGL 着色器 GLSL GLSL的数据类型 向量 输入与输出 Uniform 更多属性 自己的着色器类 着色器 着色器是运行在GPU上的小程序.着色器只是一种把输入转化为输出的程序.着色器也是 ...
最新文章
- 在新建好的ROS空间里面添加功能包
- java安全技术-Base64编码与解码
- python 拼多多秒杀_关于 拼多多笔试题-简单易懂的秒杀服务
- mysql ereg_php中正则表达式匹配函数ereg是不是被弃用了?
- vs2005 无法加载服务器控件解决办法
- mysql 并发_Mysql事务,并发问题,锁机制
- Groovy轻松入门——通过与Java的比较,迅速掌握Groovy (更新于2008.10.18)
- 『Material Design 入门学习笔记』前言
- 无法找到模块“mint-ui”的声明文件_[搬运] JavaScript 模块化:CommonJS vs AMD vs ES6...
- Uva 11054 - Wine trading in Gergovia(模拟)
- mysql-proxy实现读写分离
- cesium 高程数据使用
- 固态硬盘安装Win7双系统
- 不同速度流体的剪切形成不同尺度的漩涡,看起来很像分形。
- 列宁名言、警句、格言、语录
- Android Rect相关方法
- KERNEL32.DLL中可供调用的API函数列表
- 一个人到过的12个国家,45座城市
- 用AOMEI Partition Assistant制作PE 启动盘
- SSM-Spring