时间:2021-05-18
说起three.js,着色器材质总是绕不过的话题,今天郭先生就说一说什么是着色器材质。着色器材质是很需要灵感和数学知识的,可以用简短的代码和绘制出十分丰富的图像,可以说着色器材质是脱离three.js的另一块知识,因此它十分难讲,我们只能在一个一个案例中逐渐掌握着色器语言的使用技巧。
1. 什么是着色器材质
着色器材质(ShaderMaterial)是一个用GLSL编写的小程序 ,在GPU上运行。它能够提供 materials 之外的效果,也可以将许多对象组合成单个Geometry或BufferGeometry以提高性能。
2. 着色器材质的变量
每个着色器材质都可以指定两种不同类型的shaders,他们是顶点着色器和片元着色器(Vertex shaders and fragment shaders)。
shader中有三种类型的变量: uniforms, attributes, 和 varyings
注意:在shader 内部,uniforms和attributes就像常量;你只能使用JavaScript代码通过缓冲区来修改它们的值。
3. 着色器材质的使用
上面说了每个着色器材质都可以指定两种不同类型的shaders,不过如果我们不去指定这两个shaders而直接使用也不会报错,因为ShaderMaterial已经定义了默认的顶点着色器和片元着色器,他们的代码是这样的。
//顶点着色器代码void main() { gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );}//片元着色器代码void main() { gl_FragColor = vec4( 1.0, 0.0, 0.0, 1.0 );}这里的projectionMatrix、modelViewMatrix和position都是three为我们设置好的变量,可以直接拿来用,前两个变量我们之前已经说了,而position就是每一个顶点的坐标值,当着色器代码执行时,会循环执行gl_Position和gl_FragColor设置顶点位置,和颜色插值。并且我们最终要设置的就是gl_Position和gl_FragColor。多的先不说,下面看一个小例子。
var geom = new THREE.SphereGeometry(10, 30, 20);var mate = new THREE.ShaderMaterial({ vertexShader: ` varying vec3 vNormal; void main() { //将attributes的normal通过varying赋值给了向量vNormal vNormal = normal; //projectionMatrix是投影变换矩阵 modelViewMatrix是相机坐标系的变换矩阵 最后我们将y值乘以1.4得到了一个形如鸡蛋的几何体 gl_Position = projectionMatrix * modelViewMatrix * vec4( position.x, position.y * 1.4, position.z, 1.0 ); } `, fragmentShader: ` //片元着色器同样需要定义varying vec3 vNormal; varying vec3 vNormal; void main() { //vNormal是一个已经归一化的三维向量 float pr = (vNormal.x + 1.0) / 2.0; //pr红色通道值范围为0~1 float pg = (vNormal.y + 1.0) / 2.0; //pg绿色通道值范围为0~1 float pb = (vNormal.z + 1.0) / 2.0; //pb蓝色通道值范围为0~1 gl_FragColor=vec4(pr, pg, pb, 1.0); //最后设置顶点颜色,点与点之间会自动插值 } `})var mesh = new THREE.Mesh(geom, mate);scene.add(mesh)这篇我们简单的操作顶点着色器和片元着色器绘制了一个五彩的鸡蛋,但是这还仅仅是一个静态的着色器,下一篇我们让着色器材质动起来。
以上就是简单了解three.js 着色器材质的详细内容,更多关于three.js 着色器材质的资料请关注其它相关文章!
声明:本页内容来源网络,仅供用户参考;我单位不保证亦不表示资料全面及准确无误,也不保证亦不表示这些资料为最新信息,如因任何原因,本网内容或者用户因倚赖本网内容造成任何损失或损害,我单位将不会负任何法律责任。如涉及版权问题,请提交至online#300.cn邮箱联系删除。
Three.JS绘制3D图形。在应用过程中,three.JS就是通过WebGL来封装场景、着色器等内容,然后要通过封装来提高应用者在网页设计中的直观性,同时也能
vue中安装Three.js近来无聊顺便研究一些关于3D图形化库。three.js是JavaScript编写的WebGL第三方库。Three.js是一款运行在浏
前言之前我们已经简单的给大家介绍了关于three.js入门的一些案例,下面本文将详细介绍关于Three.js如何用轨迹球插件(trackball)增加对模型的交
three.js里的很多对象都有一个needsUpdate属性,文档中很少有写(不过three.js的文档本来就没多少,很多问题还得靠github上的issue
对着色器进行创建,这个着色器包括与顶点数组相关的顶点着色器和片元着色器,对着色器进行创建主要是为了其能够与其他数据进行组合,并且通过在GPU的连接,对场景、模型