Eps*_*lon 1 shader glsl coordinate-transformation ios scenekit
我正在尝试编写一个着色器来为 SceneKit 中的自定义几何图形着色。我想设置颜色,以便朝上的水平表面是白色,朝下的水平表面是黑色,而中间的所有其他表面都是基于其方向的灰色阴影。我使用材质的表面入口点来调用以下着色器
vec4 normal = vec4(_surface.normal, 1.0);
// Assume value is [-1, 1], scale to [0, 1]
float color = normal.z * 0.5 + 0.5;
_surface.diffuse = vec4(color, color, color, 1.0);
Run Code Online (Sandbox Code Playgroud)
似乎normal.z是相对于相机(或视图)。我假设我需要转换该值,以便它位于另一个空间中。我尝试了多种变换(和变换的组合),例如u_inverseViewTransform,但结果似乎都在视图空间中。有谁知道如何根据其表面的方向为几何体着色?
由于_surface.normal是视图空间中的向量,您必须将向量转换为世界空间。
点从世界空间到视图空间的变换是由 完成的u_viewTransform,因此逆操作(从视图空间到世界空间)可以由 完成u_inverseViewTransform。
_surface.normal是一个方向向量,但不是一个点。向量必须由法线矩阵转换,法线矩阵是 4*4 矩阵的左上角 3*3 矩阵的转置逆矩阵:
transpose(inverse(mat3(u_viewTransform)))
Run Code Online (Sandbox Code Playgroud)
请参阅为什么模型视图矩阵的转置逆矩阵用于变换法向量?,为什么用模型视图矩阵的逆的转置来转换法线?
但是由于u_viewTransform和u_inverseViewTransform是正交矩阵,所以可以跳过转置逆矩阵,因为逆矩阵和转置矩阵是相等的。请参阅在哪些情况下逆矩阵等于转置?.
这遵循您必须通过以下方式进行转换mat3(u_inverseViewTransform):
vec3 normal = mat3(u_inverseViewTransform) * _surface.normal;
float color = normal.z * 0.5 + 0.5;
_surface.diffuse = vec4(color, color, color, 1.0);
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
237 次 |
| 最近记录: |