我做了一个小测试,让您可以使用three.js在 3D 环境中试验着色器。
场景中有一个显示着色器的球体。
我创建的演示着色器是一个非常简单的着色器,它使用 2D 噪声实现。球体的很大一部分仍然是黑色的,我将其设置为透明的。我希望球体的另一侧也可见。所以我启用了透明度并将渲染面设置为双面。
material = new THREE.ShaderMaterial({
'uniforms': uniforms,
'fragmentShader': $('textarea#input-fragment').val(),
'vertexShader': $('textarea#input-vertex').val()
});
material.side = THREE.DoubleSide;
material.transparent = true;
在这个例子中,buggyness 更容易被注意到。
从顶部查看球体时,您只能从外侧看到着色器。从侧面看似乎有点波涛汹涌,从底部看似乎在工作。
这些是不同的角度(顶部 - 侧面 - 底部):
这是我的片段着色器的重要部分:
void main() {
float r = cnoise(vNormal.yz * 2.0 + t);
float g = cnoise(vNormal.xz * -1.0 + t);
float b = cnoise(vNormal.xy * -2.0 + t);
// opacity ranges assumable from 0 - 3, which is OK
gl_FragColor = vec4(r, g, b, r + g + b);
}
那么为什么我会看到断断续续的边缘,为什么视角很重要?