1

現在、カスタム シェーダーでスカイドームにグラデーションを描画させており、(ユーザーの視点から) スカイドームの前に太陽/月を配置したいと考えています。これを行う最も簡単な方法は、太陽と月のスプライトを用意することですが、発生する問題は、スプライトがスカイドーム内に滞留することです (スプライトはスカイドームの前と後ろの途中にあります)。これを polygonoffset で解決しようとしましたが、スプライト オブジェクトではうまくいかないようです。

私の質問は、カスタム スカイドーム シェーダーを変更してグラデーション付きの太陽/月のテクスチャを追加することなく、スカイドームの上に太陽/月をセットアップするにはどうすればよいでしょうか (これは非常に困難になる可能性があります)。

以下は、スカイドーム用のスカイ シェーダーのコードです。

new THREE.ShaderMaterial({
    uniforms: {
        glow: {
            type: "t",
            value: THREE.ImageUtils.loadTexture(DEFAULT_PATH+"glow2.png")
        },
        color: {
            type: "t",
            value: THREE.ImageUtils.loadTexture(DEFAULT_PATH+"sky2.png")
        },
        lightDir: {
            type: "v3",
            value: self.lightPos
        }
    },
    vertexShader: [
        "varying vec3 vWorldPosition;",
        "varying vec3 vPosition;",
        "void main() {",
            "vec4 worldPosition = modelMatrix * vec4(position, 1.0);",
            "vWorldPosition = worldPosition.xyz;",
            "vPosition = position;",
            "gl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0);",
        "}"
    ].join("\n"),
    fragmentShader: [
        "uniform sampler2D glow;",
        "uniform sampler2D color;",
        "uniform vec3 lightDir;",
        "varying vec3 vWorldPosition;",
        "varying vec3 vPosition;",
        "void main() {",
            "vec3 V = normalize(vWorldPosition.xzy);",
            "vec3 L = normalize(lightDir.xzy);",
            "float vl = dot(V, L);",
            "vec4 Kc = texture2D(color, vec2((L.y + 1.0) / 2.0, V.y));",
            "vec4 Kg = texture2D(glow,  vec2((L.y + 1.0) / 2.0, vl));",
            "gl_FragColor = vec4(Kc.rgb + Kg.rgb * Kg.a / 2.0, Kc.a);",
        "}",
    ].join("\n")
});
4

1 に答える 1

5

スカイドームが他のオブジェクトの前に描画されていることを確認し、マテリアルのdepthWrite/depthTestフラグを無効にします (depthWriteここで重要なことです)。

yourmaterial = new THREE.ShaderMaterial({...});
yourmaterial.depthWrite = false;
yourmaterial.depthTest = false;
skydome.renderDepth = 1e20;

skydome、適用したメッシュですyourmaterial

于 2013-04-27T09:49:39.117 に答える