首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >ShaderMaterial雾参数不起作用

ShaderMaterial雾参数不起作用
EN

Stack Overflow用户
提问于 2013-07-20 08:25:24
回答 2查看 3.6K关注 0票数 5

THREE.ShaderMaterial中启用场景雾时遇到问题。当前雾仅影响其他几何体,但使用THREE.ShaderMaterial创建的天穹不受雾的影响。

ShaderMaterial中似乎有一个布尔型fog参数,显然应该将其设置为true才能使用场景雾。但是,使用它会导致uniforms.fogColor is undefined错误。错误发生在WebGLRenderer函数refreshUniformsFog上。

是错误还是我使用了错误的参数?

基于webgl_materials_lightmap.html示例的测试用例:http://jsfiddle.net/HXhb4/如果您在第62行将fog设置为true并运行测试,则会得到错误。我想要发生的是天顶受到雾的影响,就像用普通MeshPhongMaterial创建的模型或天顶一样。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-07-20 09:32:43

如果要将雾与自定义ShaderMaterial一起使用,则需要确保指定所需的雾uniforms。例如,

代码语言:javascript
复制
var uniforms = {
    topColor:    { type: "c", value: new THREE.Color( 0x0077ff ) },
    bottomColor: { type: "c", value: new THREE.Color( 0xffffff ) },
    offset:      { type: "f", value: 33 },
    exponent:    { type: "f", value: 0.6 },
    fogColor:    { type: "c", value: scene.fog.color },
    fogNear:     { type: "f", value: scene.fog.near },
    fogFar:      { type: "f", value: scene.fog.far }
}

var skyMat = new THREE.ShaderMaterial( {
    vertexShader: vertexShader,
    fragmentShader: fragmentShader,
    uniforms: uniforms,
    side: THREE.BackSide,
    fog: true
} );

如果您决定使用fogDensity,还要指定它。您还必须将雾逻辑合并到着色器中。

three.js r.59

票数 9
EN

Stack Overflow用户

发布于 2015-09-14 19:53:27

在WestLangley提到的被接受的答案中:

您还必须将雾逻辑合并到着色器中。

我通过阅读示例NormalDisplacementShader.js了解了如何做到这一点。以下是步骤:

将着色器写入外部片段文件中,并在输出gl_FragColor中声明ShaderChunks

  • In

  • UniformsLib

  • Add

  • outgoingLight

示例如下:

代码语言:javascript
复制
THREE.YourCustomShader = {

uniforms: THREE.UniformsUtils.merge( [

    THREE.UniformsLib[ "fog" ],

    {

    "someCustomUniform" : { type: 'f', value: 1.0 }

    }

] ),

fragmentShader: [

    "varying float someCustomVarying;",

    THREE.ShaderChunk[ "common" ],
    THREE.ShaderChunk[ "fog_pars_fragment" ],

    "void main() {",

        "vec3 outgoingLight = vec3( 0.0 );",

        THREE.ShaderChunk[ "fog_fragment" ],

        "gl_FragColor = vec4(outgoingLight, 1.0);",

    "}"

].join("\n"),

vertexShader: [

    "uniform float someCustomUniform;",

    "varying float someCustomVarying;",

    "void main() {",

        "someCustomVarying = 1.0 * someCustomUniform;",

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

    "}"

].join("\n")

};
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17757391

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档