当前位置: 首页 > news >正文

学习threejs,使用自定义GLSL 着色器,实现抽象艺术特效 - 实践

学习threejs,使用自定义GLSL 着色器,实现抽象艺术特效 - 实践

‍⚕️ 主页: gis分享者
‍⚕️ 感谢各位大佬 点赞 收藏⭐ 留言 加关注✅!
‍⚕️ 收录于专栏:threejsgis工程师


文章目录

  • 一、前言
    • 1.1 ☘️GLSL着色器
      • 1.1.1 ☘️着色器类型
      • 1.1.2 ☘️工作原理
      • 1.1.3 ☘️核心特点
      • 1.1.4 ☘️应用场景
      • 1.1.5 ☘️实战示例
  • 二、使用自定义GLSL 着色器,实现抽象艺术特效
    • 1. ☘️实现思路
    • 2. ☘️代码样例


一、前言

本文详细介绍如何基于threejs在三维场景中使用自定义GLSL 着色器,实现抽象艺术特效。亲测可用。希望能帮助到您。一起学习,加油!加油!

1.1 ☘️GLSL着色器

GLSL(OpenGL Shading Language)是OpenGL的核心编程语言,用于编写图形渲染管线中可定制的计算逻辑。其核心设计目标是通过GPU并行计算实现高效的图形处理,支持从基础几何变换到复杂物理模拟的多样化需求。

1.1.1 ☘️着色器类型

顶点着色器(Vertex Shader)

  • 功能:处理每个顶点的坐标变换(如模型视图投影矩阵变换)、法线计算及顶点颜色传递。
  • 输出:裁剪空间坐标gl_Position,供后续光栅化阶段使用。

片段着色器(Fragment Shader)

  • 功能:计算每个像素的最终颜色,支持纹理采样、光照模型(如Phong、PBR)及后处理效果(如模糊、景深)。
  • 输出:像素颜色gl_FragColor或gl_FragColor(RGBA格式)。

计算着色器(Compute Shader,高级)

  • 功能:执行通用并行计算任务(如物理模拟、图像处理),不直接绑定渲染管线。
  • 特点:通过工作组(Work Group)实现高效数据并行处理。

1.1.2 ☘️工作原理

渲染管线流程

数据流动

1.1.3 ☘️核心特点

语法特性

  • C语言变体:支持条件语句、循环、函数等结构,天然适配图形算法。
  • 向量/矩阵运算:内置vec2/vec3/vec4及mat2/mat3/mat4类型,支持点乘、叉乘等操作。
  • 精度限定符:如precision mediump float,控制计算精度与性能平衡。

硬件加速

  • 并行计算:GPU数千个核心并行执行着色器代码,适合处理大规模数据(如粒子系统、体素渲染)。
  • 内存模型:支持常量内存(Uniform)、纹理内存(Sampler)及共享内存(计算着色器),优化数据访问效率。

灵活性

  • 可编程管线:完全替代固定渲染管线,支持自定义光照、阴影、后处理效果。
  • 跨平台兼容性:OpenGL ES(移动端)与WebGL(Web)均支持GLSL,代码可移植性强。

1.1.4 ☘️应用场景

游戏开发

数据可视化

艺术创作

教育与研究

1.1.5 ☘️实战示例

顶点着色器(传递法线与世界坐标):

#version 330 core
layout(location=0) in vec3 aPos;
layout(location=1) in vec3 aNormal;
out vec3 FragPos;
out vec3 Normal;
uniform mat4 model;
uniform mat4 view;
uniform mat4 projection;
void main() {
FragPos = vec3(model * vec4(aPos, 1.0));
Normal = mat3(transpose(inverse(model))) * aNormal; // 模型空间到世界空间的法线变换
gl_Position = projection * view * vec4(FragPos, 1.0);
}

片段着色器(实现Blinn-Phong光照):

#version 330 core
in vec3 FragPos;
in vec3 Normal;
out vec4 FragColor;
uniform vec3 lightPos;
uniform vec3 viewPos;
uniform vec3 lightColor;
uniform vec3 objectColor;
void main() {
// 环境光
vec3 ambient = 0.1 * lightColor;
// 漫反射
vec3 norm = normalize(Normal);
vec3 lightDir = normalize(lightPos - FragPos);
float diff = max(dot(norm, lightDir), 0.0);
vec3 diffuse = diff * lightColor;
// 镜面反射
vec3 viewDir = normalize(viewPos - FragPos);
vec3 reflectDir = reflect(-lightDir, norm);
float spec = pow(max(dot(viewDir, reflectDir), 0.0), 32);
vec3 specular = 0.5 * spec * lightColor;
// 最终颜色
vec3 result = (ambient + diffuse + specular) * objectColor;
FragColor = vec4(result, 1.0);
}

官方文档

二、使用自定义GLSL 着色器,实现抽象艺术特效

1. ☘️实现思路

使用自定义GLSL 着色器定义THREE.ShaderMaterial材质material,定义THREE.PlaneGeometry作为颜色渲染平面,实现抽象艺术特效。具体代码参考代码样例。可以直接运行。

2. ☘️代码样例

<!DOCTYPE html><html lang="en"><head><meta charset="UTF-8"><title>glsl颜色_抽象艺术作品</title><style>body {margin: 0;overflow: hidden;background: #020010;}canvas {display: block;width: 100vw;height: 100vh;}</style></head><body></body><script type="importmap">{"imports": {"three": "https://cdn.jsdelivr.net/npm/three@0.160.0/build/three.module.js"}}</script><script type="module">import * as THREE from 'three';const scene = new THREE.Scene();scene.background = new THREE.Color(0x000000);const camera = new THREE.OrthographicCamera(-1, 1, 1, -1, 0, 1);const renderer = new THREE.WebGLRenderer({ antialias: true });renderer.setSize(window.innerWidth, window.innerHeight);document.body.appendChild(renderer.domElement);const material = new THREE.ShaderMaterial({uniforms: {time: { value: 0 },resolution: { value: new THREE.Vector2(window.innerWidth, window.innerHeight) },mouse: { value: new THREE.Vector2(0.5, 0.5) }},vertexShader: `varying vec2 vUv;void main() {vUv = uv;gl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0);}`,fragmentShader: `uniform float time;uniform vec2 resolution;uniform vec2 mouse;varying vec2 vUv;mat2 rot(float a) {float s = sin(a);float c = cos(a);return mat2(c, -s, s, c);}void main() {vec2 FC = gl_FragCoord.xy;vec2 r = resolution;float t = time;vec4 o = vec4(0.0);vec2 uv = (FC * 2.0 - r.xy) / r.y;vec3 rayDir = normalize(vec3(uv, 1.0));for(float i = 0.0; i < 20.0; i++) {float z = i * 0.5 + 0.1;vec3 p = z * rayDir;vec2 mouseOffset = (mouse - 0.5) * 1.0;p.xz *= rot(t * 0.2 + mouseOffset.x);p.yz *= rot(t * 0.15 + mouseOffset.y);vec3 a = p;float d;for(d = 1.0; d < 4.0; d += 1.0) {a -= sin(a * d + t + i*0.1).yzx / (d * 0.8);}vec3 q = abs(a);float mx = max(max(q.x, q.y), q.z);float s = a.z + a.y - t;d = abs(2.0 - mx) + abs(cos(s)) / 7.0;float z_col = z + d;vec4 colorPhase = vec4(0.0, 2.0 + mouse.y * 2.0, 4.0 - mouse.y * 2.0, 0.0);o += (cos(s - z_col + colorPhase) + 1.0) / (d*0.5 + 0.01);}o = o / 20.0;o = o / (1.0 + o);o = smoothstep(0.15, 0.85, o);gl_FragColor = o;gl_FragColor.a = 1.0;}`});const geometry = new THREE.PlaneGeometry(2, 2);const mesh = new THREE.Mesh(geometry, material);scene.add(mesh);window.addEventListener('resize', () => {const width = window.innerWidth;const height = window.innerHeight;renderer.setSize(width, height);material.uniforms.resolution.value.set(width, height);});window.addEventListener('mousemove', (event) => {material.uniforms.mouse.value.x = event.clientX / window.innerWidth;material.uniforms.mouse.value.y = 1.0 - (event.clientY / window.innerHeight);});function animate() {requestAnimationFrame(animate);material.uniforms.time.value += 0.02;renderer.render(scene, camera);}window.onload = function () {animate();}</script></html>

效果如下
在这里插入图片描述
参考:源码

http://www.jsqmd.com/news/176543/

相关文章:

  • 通俗解释为何未激活的Multisim打不开主数据库
  • Mathtype公式识别升级之路:多模态大模型加持OCR精准解析
  • 广西省来宾市自建房设计公司哪家强?2025最新评测排行榜 + 5 星企业推荐 - 苏木2025
  • 广西省南宁市自建房设计公司评测排行榜:6 家主流企业实地测评,哪家更靠谱? - 苏木2025
  • 一文搞懂YOLOv8:从Git下载、环境配置到模型推理全流程
  • InfoQ专题约稿:争取被收录进AI频道头条推荐
  • 广西省柳州市自建房设计公司排行榜出炉!权威评测 + 真实案例,建房选对不踩坑 - 苏木2025
  • 广西省崇左市自建房设计公司权威评测排行榜:多维度打分+5星企业全解析 - 苏木2025
  • 想在广西省玉林市农村盖房子,靠谱的自建房设计公司口碑推荐 - 苏木2025
  • 技术博客引流实操:用高质量内容吸引潜在客户购买Token
  • CPO偏好优化进阶:控制模型输出风格与伦理边界
  • Yomiuri Shimbun日媒接触:进入日本市场的第一步
  • USBlyzer抓包机制深度剖析:系统学习数据过滤策略
  • 广西省百色市自建房设计公司/机构权威测评推荐排行榜 - 苏木2025
  • ACL/EMNLP会议投稿:以研究成果推动工具影响力
  • 广东省潮州市自建房设计公司哪家强?2026年最新权威靠谱测评榜单抢先看 - 苏木2025
  • 广西省防城港市自建房设计靠谱机构评测排行榜:5星平台优势及适配人群 - 苏木2025
  • 快速理解续流二极管在H桥中的保护机制
  • 想在广东省揭阳市农村盖房子,靠谱的自建房设计公司口碑推荐 - 苏木2025
  • GitHub镜像加速神器!轻松下载HuggingFace大模型权重
  • 谁是TOP1?广西省北海市自建房设计公司评测排行榜 + 真实建房案例参考 - 苏木2025
  • 广西省河池市自建房设计公司排行榜出炉!权威评测 + 真实案例,建房选对不踩坑 - 苏木2025
  • C语言如何实现边缘设备极致省电?:深入剖析功耗控制的5大关键技术
  • Linux 下开机自启动设置
  • 广东省云浮市自建房设计公司/机构权威测评推荐排行榜 - 苏木2025
  • 从零开始掌握启明910控制逻辑,C语言模拟计算实战全解析
  • 进阶指南:基于流媒体协议逆向的 Naver 视频自动化提取架构实战
  • 掌握C17泛型选择只需这4步:从入门到精通的完整代码路径
  • C#开发者也能玩转大模型?一锤定音提供全栈AI支持
  • 进阶架构:从 Bilibili 视频解析探讨高性能在线下载器的全栈技术实现