RawShaderMaterial 与 ShaderMaterial

news/2025/3/1 3:54:22/

目录

自动添加的 Uniforms 和 Attributes

ShaderMaterial

RawShaderMaterial

GLSL 预处理

ShaderMaterial

RawShaderMaterial

 使用场景

ShaderMaterial

RawShaderMaterial

代码示例对比

使用 ShaderMaterial

使用 RawShaderMaterial

 常见问题与注意事项

总结


在 Three.js 中,RawShaderMaterial 和 ShaderMaterial 都是用于自定义着色器的材质类,但它们的核心区别在于 Three.js 对着色器代码的预处理程度。以下是它们的详细对比:


自动添加的 Uniforms 和 Attributes

ShaderMaterial
  • Three.js 会 自动添加 常用的内置 uniforms 和 attributes,例如:

    • projectionMatrix(相机投影矩阵)

    • modelViewMatrix(模型视图矩阵)

    • viewMatrix(视图矩阵)

    • normalMatrix(法线矩阵)

    • cameraPosition(相机位置)

    • 光照、雾效等参数(如果启用相关功能)。

  • 你不需要在着色器代码中手动声明这些变量,Three.js 会隐式注入它们。

RawShaderMaterial
  • 不会自动添加任何内置变量,所有 uniforms 和 attributes 必须手动声明。

  • 你需要自己传递所有必需的参数(如矩阵、相机位置等)。


GLSL 预处理

ShaderMaterial
  • Three.js 会自动在着色器代码顶部插入一些预定义内容,例如:

    javascript">precision highp float; // 自动设置精度
    #include <common>      // 包含 Three.js 的通用 GLSL 代码块
  • 支持 Three.js 的 GLSL 代码块(如 #include <fog_pars_vertex>)。

RawShaderMaterial
  • 不进行任何预处理,所有 GLSL 代码必须完整且自包含。

  • 必须手动设置精度(如 precision highp float;)。

  • 无法直接使用 Three.js 的内置 GLSL 代码块。


 使用场景

ShaderMaterial
  • 推荐大多数情况使用,尤其是需要 Three.js 内置功能(如光照、雾效)时。

  • 适合快速开发,减少重复代码。

RawShaderMaterial
  • 适用于需要 完全控制着色器代码 的高级场景。

  • 适合学习 WebGL 底层原理,或需要避免 Three.js 隐式行为干扰的情况。


代码示例对比

使用 ShaderMaterial
javascript">const material = new THREE.ShaderMaterial({vertexShader: `void main() {gl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0);}`,fragmentShader: `void main() {gl_FragColor = vec4(1.0, 0.0, 0.0, 1.0);}`,
});
  • 无需声明 projectionMatrix 或 modelViewMatrix,Three.js 已自动处理。

使用 RawShaderMaterial
javascript">const material = new THREE.RawShaderMaterial({vertexShader: `precision highp float;uniform mat4 projectionMatrix;uniform mat4 modelViewMatrix;attribute vec3 position;void main() {gl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0);}`,fragmentShader: `precision highp float;void main() {gl_FragColor = vec4(1.0, 0.0, 0.0, 1.0);}`,
});
  • 必须手动声明所有 uniforms 和 attributes(如 projectionMatrixposition)。

  • 必须手动设置精度(precision highp float;)。


 常见问题与注意事项

  • 错误处理
    使用 RawShaderMaterial 时,若忘记声明必要的 uniforms/attributes,会导致着色器编译失败,但 Three.js 可能不会明确提示具体原因。

  • 性能差异
    两者性能几乎无差异,最终都会被编译为 WebGL 着色器程序。

  • 兼容性
    如果从 ShaderMaterial 切换到 RawShaderMaterial,需确保着色器代码中不再依赖 Three.js 的隐式变量(如 vNormalvViewPosition 等)。


总结

特性ShaderMaterialRawShaderMaterial
内置变量支持自动添加需手动声明
GLSL 预处理自动插入精度、代码块完全手动编写
适合场景常规需求、快速开发完全控制、学习 WebGL 底层
代码复杂度

选择依据:

  • 如果需要快速实现常见效果(如光照、雾效),用 ShaderMaterial

  • 如果需要彻底掌控着色器逻辑,或避免 Three.js 的隐式行为,用 RawShaderMaterial


http://www.ppmy.cn/news/1575674.html

相关文章

视频编解码技术-3: H.264和VP9压缩效率和编码时延

一、引言 在前作《H.264和VP9视频编码质量评估》中&#xff0c;我们通过PSNR、SSIM等指标分析了二者在固定码率下的质量差异。本文聚焦实时应用场景的核心矛盾&#xff1a;在相同主观质量下&#xff0c;如何权衡压缩效率与编码延迟&#xff1f; 为此&#xff0c;本文采用“恒…

Imagination GPU 3D Graphics Wrokload

本次分享Imagination GPU 的3D 图像处理负载流程。 总的分为两个阶段 第一阶段&#xff1a;Geometry Processing Phase&#xff08;几何处理阶段&#xff09;是渲染管线中的一个关键环节&#xff0c;主要负责对三维几何数据进行处理和变换&#xff0c;以便后续在屏幕上进行显…

nodejs将pdf转换成图片并提取图片内容

pdf2pic 安装方法 安装文档地址&#xff1a;https://github.com/yakovmeister/pdf2image/blob/HEAD/docs/gm-installation.md Windows下载下面两个文件&#xff0c;安装时没有自动设置环境变量&#xff0c;要分别设置到环境变量 Download Ghostscript Windows: https://gith…

Maven+SSM+SpringBoot+Mybatis-Plus

SSM技术栈&#xff1a;spring6、springmvc、mybatis、springboot3、mybatis-plus、druid&#xff1b; 前端: node、npm、vue 快速掌握&#xff1a;全新SSMSpring BootMyBatis-Plus实战精讲

mapbox基础,使用geojson加载heatmap热力图层

👨‍⚕️ 主页: gis分享者 👨‍⚕️ 感谢各位大佬 点赞👍 收藏⭐ 留言📝 加关注✅! 👨‍⚕️ 收录于专栏:mapbox 从入门到精通 文章目录 一、🍀前言1.1 ☘️mapboxgl.Map 地图对象1.2 ☘️mapboxgl.Map style属性1.3 ☘️heatmap热力图层样式二、🍀使用geojs…

C高级——shell(3)

一、shell的选择结构 1.回顾&#xff1a;C语言的选择结构:if , if else if ,if else,switch &#xff08;switch的执行速度最快&#xff09; 2.shell的选择结构&#xff1a; 单分支if 双分支 if else 多分支if elif case..in 1.1 shell的选择结构的格式 --------C语言的格式--…

一个非常好用便捷的web自动化爬虫工具Playwright

相比于selenium&#xff0c;Playwright不需要在本地安装浏览器和对应版本的chromedriver&#xff0c;之前一度苦恼谷歌浏览器经常自动更新&#xff0c;需要更换旧的浏览器才有对应的driver&#xff0c;现在不需要考虑浏览器&#xff0c;这点非常nice&#xff0c;以及Playwright…

Ubuntu22上安装MySQL8启动成功,远程无法连接

解决步骤: 1.首先验证网络是否通 ping Linux服务器ip 2.如果网络通&#xff0c;验证是否开放了访问 2.1在服务器上使用 sudo mysql -u root -p 并输入密码连接到mysql 2.2执行 SELECT User, Host FROM mysql.user; 查找一个Host列为’%的用户&#xff0c;这表示允许从任何主机连…