如何使用WebGL渲染一簇水晶

栏目: 编程工具 · 发布时间: 5年前

内容简介:本文示例用随机几何体、光照、纹理贴图、着色器整合起来绘制一个水晶簇。通过调整着色器,可以产生岩浆、蓝宝石等各种效果。示例效果图:很多三维库的几何体基本都是规则几何体,没有随机的美感,因此捣鼓了一个随机水晶生成器,源码地址:

本文示例用随机几何体、光照、纹理贴图、着色器整合起来绘制一个水晶簇。通过调整着色器,可以产生岩浆、蓝宝石等各种效果。

示例效果图:

27个单晶45度随机分布的蓝色水晶簇。

如何使用WebGL渲染一簇水晶
uv

77个单晶180度随机分布的红色水晶簇。

如何使用WebGL渲染一簇水晶
uv

制作随机水晶体生成器

很多三维库的几何体基本都是规则几何体,没有随机的美感,因此捣鼓了一个随机水晶生成器,源码地址: github.com/guoweish/ve…

实现思路如下:

  • 生成单个水晶顶点
如何使用WebGL渲染一簇水晶
uv
  • 生成水晶簇顶点
如何使用WebGL渲染一簇水晶
uv

实现步骤如下:

  • 一个圆周上取多边形点,使用随机角度,形成不同宽度面
...
  angle = i / faceNumber * PI * 2 + r * angleDithringFactor * angleDithringUnit;
  px = Math.sin(angle) * polygonCircleRadius;
  py = Math.cos(angle) * polygonCircleRadius;
  ...
复制代码
  • 随机缩放圆半径,圆周上同角度取多边形点,形成不同柱体半径
...
  pxd = Math.sin(angle) * polygonCircleRadius* (circleRadiusDithringFactor + radiusDithringDistance);
  pyd = Math.cos(angle) * polygonCircleRadius* (circleRadiusDithringFactor + radiusDithringDistance);
  ...
复制代码
  • 形成多边形棱柱的上下两层顶点
...
  vertexs.topPositions.push(px);
  vertexs.topPositions.push(py);
  ...
复制代码
  • 增加正对圆心的顶点,形成水晶柱顶点
...
  vertexsCon = [0, cylinderHeight+conHeight, 0];
  ...
复制代码
  • 生成一个水晶体几何体
...
  vertexs = [...vertexsCylinderDown, ...vertexsCylinderTop, ...vertexsCon];
  ...
复制代码
  • 矩阵变换缩放、旋转单个水晶体的顶点,并复制顶点
...
  let scaleMatrix = new Matrix4();
  scaleMatrix.setScale(scaleFactor, scaleFactor, scaleFactor);
  let rotateMatrix = new Matrix4();
  rotateMatrix.setRotate(rotateAngle, rotateCenter.x, rotateCenter.y, rotateCenter.z);
  ...
  let vScaledRotated = rotateMatrix.multiplyVector4(vScaled);
  ...
复制代码
  • 生成水晶簇几何体
...
  let extendedIndices = extendIndices(cristalTransformed.indices, currentIndicesLength);
  cluster.indices = cluster.indices.concat(extendedIndices);
  cluster.positions = cluster.positions.concat(cristalTransformed.positions);
  cluster.uvs = cluster.uvs.concat(cristal.uvs);
  ...
复制代码

渲染几何体

用纯色shader简单渲染一下是否顶点和索引正确;

  • 片元着色器
fragColor = vec4(0.6, 0.6, 0.6, 1.0);
复制代码
如何使用WebGL渲染一簇水晶
uv

添加光照

增加光照,使用Blinn-Phong模型;

  • 片元着色器
vec3 diffuse = max(dot(normal, ec_lightDirection), 0.0) * lightColor * lightIntensity * baseColor;

  vec3 viewDirection = -normalize(ec_position);
  vec3 halfAngle = normalize(viewDirection + ec_lightDirection);
  float specularFactor = clamp(dot(normal, halfAngle), 0.0, 1.0);
  float spec = pow(specularFactor, specularIntensity);
  vec3 specular = clamp(spec * specularColor, 0.0, 1.0);

  fragColor = vec4(diffuse + specular + ambient, 1.0);
复制代码
如何使用WebGL渲染一簇水晶

着色器添加渐变的祖母绿效果

为了看上去像祖母绿宝石效果,用纹理做一个渐变;用pow函数使得渐变非线性,用mix函数融合得颜色,看上去效果更自然;

  • 片元着色器
...
  float colorMixFactor = pow(v_uv.y, 3.0);
  ...
  vec3 baseColor = mix(CRISTAL_COLOR, GEM_COLOR_GREEN,  colorMixFactor);
  ...
复制代码
如何使用WebGL渲染一簇水晶
uv

使用贴图增强表面细节

为了表面有石头纹样效果,找一张大理石图片做贴图过滤一下颜色;魔改一下光照模型,贴图过滤diffuse而不过滤specular,这样使得表面反色不受影响而产生表面光滑的效果;

  • 片元着色器
...
  fragColor = vec4(diffuse + diffuse * textureFilter + specular + AMB_COLOR, 1.0);
复制代码
如何使用WebGL渲染一簇水晶
uv

以上所述就是小编给大家介绍的《如何使用WebGL渲染一簇水晶》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

参与的胜利

参与的胜利

亨利·詹金斯 / 高芳芳 / 浙江大学出版社 / 2017-9-30 / CNY 42.00

《参与的胜利:网络时代的参与文化》是一场学者之间的对话,三位学者(亨利·詹金斯、伊藤瑞子和丹娜·博伊德)虽然来自不同的代际、不同的学科背景,但他们在相同的参与文化项目中展开合作,并试图解决相似的问题。 希望《参与的胜利:网络时代的参与文化》能够进一步激发团体内部及团体之间的对话,这些团体包括教育者、政策制定者、学者、关注参与文化的公民、业内人士、粉丝及其他任何关心我们文化的未来的人。理想的参......一起来看看 《参与的胜利》 这本书的介绍吧!

图片转BASE64编码
图片转BASE64编码

在线图片转Base64编码工具

MD5 加密
MD5 加密

MD5 加密工具

html转js在线工具
html转js在线工具

html转js在线工具