javascript - 您如何“组合”ShaderMaterial 和 LambertMaterial?
问题描述
首先,非常感谢这个伟大的工作和社区。
我正在尝试编写一个简单的低聚风格水材质。
我知道写这种东西有不同的方法,我想尽可能地用 js 脚本来做(我来自 C# dev',我对前端还不是很熟悉)。
经过数小时在网上编译信息后,我能理解的一种方法是:
var waterVertexShader =
"attribute float vertexDisplacement;" +
"uniform float time;" +
"varying vec3 vUv;" +
"void main() {" +
" vUv = position;" +
" vUv.y += sin(time) * 0.01;" +
" gl_Position = projectionMatrix * modelViewMatrix * vec4(vUv, 1.0);"+
"}"
;
var waterFragmentShader =
"void main() {" +
"gl_FragColor = vec4(0.65, 0.88, 1, 1);" +
"}";
},
flatShading : true,
vertexShader: waterVertexShader,
这给了我想要的行为的开始,但这不是我的问题。
现在,如果我想继承 Lambert 或 Phong 材料属性,那么正确的方法是什么?
这听起来很基本,但这是我发现的唯一相关链接: ThreeJS - Extend Lambert Shader with Custom VertexShader 并且没有答案。
感谢您的关注。
解决方案
有几种方法可以增强内置材质three.js
:
- 您可以使用回调Material.onBeforeCompile()。下面的示例演示了这种方法。如果您只想对着色器代码添加较小的增强功能,这应该是您的首选。
RawShaderMaterial
使用或ShaderMaterial
从头开始创建自定义材质,并重用库中的现有着色器块。three.js
这种方法非常灵活,但它需要对材料系统的内部有很好的了解。- 当然,您可以修改/猴子修补现有的着色器块,但这种方法通常是推荐的(您有效地更改库代码并带来所有后果)。
- 另一种方法是使用有前途但实验性的
NodeMaterial
. 然而,到目前为止,这种技术没有记录在案,也没有成为核心的一部分。有一些例子可以演示这样的用法。
推荐阅读
- java - Java如何在不考虑时区的情况下从给定时间字符串中删除第n分钟
- java - 我如何在同一个 ec2 实例上部署 1 个 python-django 应用程序和 1 个 java 应用程序,其中 java 一个为另一个应用程序服务?
- java - 尝试使用 spark shell 计算托管在本地 HDFS 上的文件中的行数时出现 HadoopRDD 错误
- gitpython - Python - 如何检查路径是否在 git repo 下?并提取 repo 名称
- java - 这个 JFrame 对象从哪里得到它的高度和宽度?
- firebase - 类型“AngularFireList<{}>”上不存在属性“订阅”
- ios - 如何让选项选择显示在新视图控制器的标签中
- javascript - 未捕获的错误:Reference.push 失败:
- mysql - Room 从生成的查询返回不正确的初始化对象
- python - 如何在 inplace = True 的选定列上应用 pandas.DataFrame.replace?