three.js着色器材质的内置变量示例详解


Posted in Javascript onAugust 16, 2020

什么是着色器?

固定渲染管线: ——标准的几何&光照(T&L)管线,功能是固定的,它控制着世界、视、投影变换及固定光照控制和纹理混合。T&L管线可以被渲染状态控制,矩阵,光照和采制参数。如果有了固定渲染管线,编写程序就比较容易了,因为所有的变换都是由固定渲染管线来完成的,但是缺点就是自由度低。固定渲染管线只能完成一些最基本的操作,如果想要做一些特殊的处理,就比较麻烦了。

可编辑渲染管线:——WebGL中不存在固定渲染管线,坐标变换必须全部由自己来做,这个记述了坐标变换的机制就叫做着色器(Shader),这样可以由程序员控制的机制叫做可编辑渲染管线。而着色器又有 处理几何图形顶点的顶点着色器和处理像素的片段着色器两种类型。由于WebGL中没有固定管线,所以必须准备好顶点着色器和片段着色器。

这篇郭先生说一下three.js着色器的内置变量,分别是

  1. gl_PointSize:在点渲染模式中,控制方形点区域渲染像素大小(注意这里是像素大小,而不是three.js单位,因此在移动相机是,所看到该点在屏幕中的大小不变)
  2. gl_Position:控制顶点选完的位置
  3. gl_FragColor:片元的RGB颜色值
  4. gl_FragCoord:片元的坐标,同样是以像素为单位
  5. gl_PointCoord:在点渲染模式中,对应方形像素坐标

他们或者单个出现在着色器中,或者组团出现在着色器中,是着色器的灵魂。下面来分别说一说他们的意义和用法。

1. gl_PointSize

gl_PointSize内置变量是一个float类型,在点渲染模式中,顶点由于是一个点,理论上我们并无法看到,所以他是以一个正对着相机的正方形面表现的。使用内置变量gl_PointSize主要是用来设置顶点渲染出来的正方形面的相素大小(默认值是0)。

void main() {
 gl_PointSize = 10.0;
}

2. gl_Position

gl_Position内置变量是一个vec4类型,它表示最终传入片元着色器片元化要使用的顶点位置坐标。vec4(x,y,z,1.0),前三个参数表示顶点的xyz坐标值,第四个参数是浮点数1.0。

void main() {
 gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );
}

3. gl_FragColor

gl_FragColor内置变量是vec4类型,主要用来设置片元像素的颜色,它的前三个参数表示片元像素颜色值RGB,第四个参数是片元像素透明度A,1.0表示不透明,0.0表示完全透明。

void main() {
 gl_FragColor = vec4(1.0,0.0,0.0,1.0);
}

4. gl_FragCoord

gl_FragCoord内置变量是vec2类型,它表示WebGL在canvas画布上渲染的所有片元或者说像素的坐标,坐标原点是canvas画布的左上角,x轴水平向右,y竖直向下,gl_FragCoord坐标的单位是像素,gl_FragCoord的值是vec2(x,y),通过gl_FragCoord.x、gl_FragCoord.y方式可以分别访问片元坐标的纵横坐标。这里借了一张图

three.js着色器材质的内置变量示例详解

下面我们举个例子

fragmentShader: `
 void main() {
  if(gl_FragCoord.x < 600.0) {
   gl_FragColor = vec4(1.0,0.0,0.0,1.0);
  } else {
   gl_FragColor = vec4(1.0,1.0,0.0,1.0);
  }
 }
`

three.js着色器材质的内置变量示例详解

这里以600像素为分界,x值小于600像素的部分,材质被渲染成红色,大于的部分为黄色。

5. gl_PointCoord

gl_PointCoord内置变量也是vec2类型,同样表示像素的坐标,但是与gl_FragCoord不同的是,gl_FragCoord是按照整个canvas算的x值从[0,宽度],y值是从[0,高度]。而gl_PointCoord是在点渲染模式中生效的,而它的范围是对应小正方形面,同样是左上角[0,0]到右下角[1,1]。

6. 内置变量练习

五个内置变量我们都大致的说了一遍,下面用一个小案例来试用一下除了gl_FragCoord的其他四个。先上图,在线案例请点击。

three.js着色器材质的内置变量示例详解

var planeGeom = new THREE.PlaneGeometry(1000, 1000, 100, 100);
uniforms = {
 time: {
  value: 0
 }
}
var planeMate = new THREE.ShaderMaterial({
 transparent: true,
 side: THREE.DoubleSide,
 uniforms: uniforms,
 vertexShader: `
    uniform float time;
  void main() {
   float y = sin(position.x / 50.0 + time) * 10.0 + sin(position.y / 50.0 + time) * 10.0;
   vec3 newPosition = vec3(position.x, position.y, y * 2.0 );
   gl_PointSize = (y + 20.0) / 4.0;
   gl_Position = projectionMatrix * modelViewMatrix * vec4( newPosition, 1.0 );
  }
 `,
 fragmentShader: `
  void main() {
   float r = distance(gl_PointCoord, vec2(0.5, 0.5));
   if(r < 0.5) {
    gl_FragColor = vec4(0.0,1.0,1.0,1.0);
   }
  }
 `
})
var planeMesh = new THREE.Points(planeGeom, planeMate);
planeMesh.rotation.x = - Math.PI / 2;
scene.add(planeMesh);

好了这篇就说到这了,再见。

总结

到此这篇关于three.js着色器材质的内置变量的文章就介绍到这了,更多相关three.js着色器材质内置变量内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Javascript 相关文章推荐
基于jQuery的Spin Button自定义文本框数值自增或自减
Jul 17 Javascript
防止文件缓存的js代码
Jan 10 Javascript
javascript事件函数中获得事件源的两种不错方法
Mar 17 Javascript
Javascript学习笔记之函数篇(六) : 作用域与命名空间
Nov 23 Javascript
node.js中的fs.close方法使用说明
Dec 17 Javascript
详解JavaScript的while循环的使用
Jun 03 Javascript
AngularJS用户选择器指令实例分析
Nov 04 Javascript
jQuery中DOM节点的删除方法总结(超全面)
Jan 22 Javascript
vue项目在安卓低版本机显示空白的原因分析(两种)
Sep 04 Javascript
Vue+Express实现登录状态权限验证的示例代码
May 05 Javascript
基于Express框架使用POST传递Form数据
Aug 10 Javascript
vue 解决无法对未定义的值,空值或基元值设置反应属性报错问题
Jul 31 Javascript
Angular进行简单单元测试的实现方法实例
Aug 16 #Javascript
前端使用crypto.js进行加密的函数代码
Aug 16 #Javascript
vue Treeselect 树形下拉框:获取选中节点的ids和lables操作
Aug 15 #Javascript
Vue使用axios引起的后台session不同操作
Aug 14 #Javascript
解决VUE项目localhost端口服务器拒绝连接,只能用127.0.0.1的问题
Aug 14 #Javascript
vue项目在线上服务器访问失败原因分析
Aug 14 #Javascript
vue设置全局访问接口API地址操作
Aug 14 #Javascript
You might like
虫族 Zerg 魔法科技
2020/03/14 星际争霸
php开发过程中关于继承的使用方法分享
2011/06/17 PHP
PHP魔术引号所带来的安全问题分析
2014/07/15 PHP
PHP实现通用alert函数的方法
2015/03/11 PHP
jquery实现带复选框的表格行选中删除时高亮显示
2013/08/01 Javascript
Javascript Object 对象学习笔记
2014/12/17 Javascript
JQUERY的AJAX请求缓存里的数据问题处理
2016/02/23 Javascript
javascript运算符——逻辑运算符全面解析
2016/06/27 Javascript
javascript中的 object 和 function小结
2016/08/14 Javascript
详解如何使用Vue2做服务端渲染
2017/03/29 Javascript
Angular.Js中过滤器filter与自定义过滤器filter实例详解
2017/05/08 Javascript
React Native中的RefreshContorl下拉刷新使用
2017/10/09 Javascript
ES6中let 和 const 的新特性
2018/09/03 Javascript
vue使用laydate时间插件的方法
2018/11/14 Javascript
详解vue项目中使用token的身份验证的简单实践
2019/03/08 Javascript
vue实现编辑器键盘抬起时内容跟随光标距顶位置向上滚动效果
2020/05/28 Javascript
vue prop传值类型检验方式
2020/07/30 Javascript
Chrome插件开发系列一:弹窗终结者开发实战
2020/10/02 Javascript
vue实现移动端返回顶部
2020/10/12 Javascript
恢复百度云盘本地误删的文件脚本(简单方法)
2017/10/21 Python
详谈python中冒号与逗号的区别
2018/04/18 Python
ubuntu 16.04下python版本切换的方法
2019/06/14 Python
基于Python批量生成指定尺寸缩略图代码实例
2019/11/20 Python
python实现按键精灵找色点击功能教程,使用pywin32和Pillow库
2020/06/04 Python
python创建文本文件的简单方法
2020/08/30 Python
css3实现垂直下拉动画菜单示例
2014/04/22 HTML / CSS
html5使用canvas压缩图片的示例代码
2018/09/11 HTML / CSS
德国鞋子网上商店:Omoda.de
2017/03/31 全球购物
政府信息公开实施方案
2014/05/09 职场文书
公司承诺书格式
2014/05/21 职场文书
高中综合实践活动总结
2014/07/07 职场文书
2015新年寄语大全
2014/12/08 职场文书
MySQL通过binlog恢复数据
2021/05/27 MySQL
oracle连接ODBC sqlserver数据源的详细步骤
2021/07/25 Oracle
MyBatis 动态SQL全面详解
2021/10/05 MySQL
Python使用Web框架Flask开发项目
2022/06/01 Python