Three.js 关于着色器(顶点和片段着色器)的一些基本问题

Some basic questions About the Shaders (Vertex-and Fragment Shader) from Three.js

我问过自己一些关于片段和顶点着色器的一般理解问题。

我们在讲座中了解到,在 Tree.js 的自定义着色器中计算和使用透明度至少不是 possible/or 非常困难。

问题是:谁能向我解释为什么会这样,以及如何使用着色器使某些东西透明(例如 Material 处的 "normal" 透明度参数,您可以只说:transpareny:true).

这取决于您和讲师的意思 "transparency." 为了清楚起见,以下内容非常简单。

透明物体的第一部分是深度排序。当您创建 three.js material 时,material.transparent = true; 会启用深度排序,这会将场景对象置于基于相机深度的渲染顺序,而不是它们的添加顺序。这可确保透明对象正确混合其颜色。这大概就是讲师想说的在shader中很难做到的,因为shader专注于绘制当前片段,并没有太多关于周围场景的信息。

透明度的第二部分(您可能更熟悉)是为 material 设置不透明度值。如果您查看任何片段着色器,它所做的最后一件事就是设置片段的颜色,即 vec4.

gl_FragColor = something;

vec4 的第四个值是 alpha(不透明度)值。您可以像这样手动将片段设置为半透明红色:

gl_FragColor = vec4(1.0, 0.0, 0.0, 0.5);

但是,如果您的对象没有正确地进行深度排序,透明度可能无法达到您的预期。

关于你关于如何将值传递给着色器的问题,我同意上面的评论:你的第二个问题应该分成一个单独的post。

也就是说,uniforms、attributes 和 varyings 是着色器中的通用和基本类型限定符。每个都有非常具体的用途,听起来您不太了解其中的区别(没关系,您还在学习)。我建议多读一些书,了解如何适当地使用它们(当然,Whosebug 是寻找答案的好地方 like this one)。