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;
この例では、バグに気づきやすくなっています。
球を上から見ると、シェーダーは外側からしか見えません。横から見ると少しガタがあるように見えますが、下から見ると機能しているように見えます。
これらはさまざまな角度です (上 - 横 - 下):
私のフラグメントシェーダーの重要な部分は次のとおりです。
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);
}
では、なぜ途切れ途切れのエッジが表示され、視野角が重要なのですか?