转换网格时,立方体贴图会扭曲

时间:2014-03-20 00:29:49

标签: three.js

尝试使用立方体贴图着色器创建天空盒(如示例中所示),并在转换网格时发现失真。

如果您创建一个1维宽度,高度和深度的立方体。将边设置为THREE.BackSide和depthWrite为false。然后将网格缩放为x,y和z字段中的1000个单位。

当网格位于世界的中心时,一切都很好。但是一旦你翻译了网格,立方体贴图开始变形很严重。

enter image description here

您可能希望将网格移动到与摄像机相同的位置,从而在用户四处走动时不会允许天空盒达到其极限。

我正在使用的着色器代码是:

'cube': {

    uniforms: { "tCube": { type: "t", value: null },
                "tFlip": { type: "f", value: -1 } },

    vertexShader: [

        "varying vec3 vWorldPosition;",

        "void main() {",

            "vec4 worldPosition = modelMatrix * vec4( position, 1.0 );",
            "vWorldPosition = worldPosition.xyz;",

            "gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );",

        "}"

    ].join("\n"),

    fragmentShader: [

        "uniform samplerCube tCube;",
        "uniform float tFlip;",

        "varying vec3 vWorldPosition;",

        "void main() {",

            "gl_FragColor = textureCube( tCube, vec3( tFlip * vWorldPosition.x, vWorldPosition.yz ) );",

        "}"

    ].join("\n")

}

有没有人知道是否可以修改着色器以防止这种失真?

非常感谢!

1 个答案:

答案 0 :(得分:0)

在做了一些研究后,我发现天空盒的立方体贴图着色器依赖于摄像机位于世界的中心。因此,要在上面描述的场景中使用它,而不是将天空盒的位置设置到摄像机,我只需将摄像机的世界位置设置为0。

在渲染天空盒之前,你需要这样做:

// Get the current position
this._prevCamPos.getPositionFromMatrix( camera.matrixWorldInverse );

// Now set the position of the camera to be 0,0,0
camera.matrixWorldInverse.elements[12] = 0;
camera.matrixWorldInverse.elements[13] = 0;
camera.matrixWorldInverse.elements[14] = 0;

然后在渲染之后它需要返回:

// Now revert the camera back
camera.matrixWorldInverse.elements[12] = this._prevCamPos.x;
camera.matrixWorldInverse.elements[13] = this._prevCamPos.y;
camera.matrixWorldInverse.elements[14] = this._prevCamPos.z;