【问题标题】:Three.js ShaderMaterial with lights on mesh imported from BlenderThree.js ShaderMaterial 与从 Blender 导入的网格上的灯光
【发布时间】:2016-10-09 11:09:06
【问题描述】:

我正在尝试使用在 Three.js r77 中工作的灯光的 ShaderMaterial。当应用到具有简单 BoxGeometry 的网格时,它可以正常工作,但当应用到从 Blender 导入的网格时,它的行为不正确。

说明问题的简单 jsfiddle 是 here。左侧的网格是从 Blender 导出创建的。右边的网格是从一个简单的 BoxGeometry 创建的。两者都使用相同的 ShaderMaterial。灯光的位置由 DirectionalLightHelper 指示。

右侧的网格被正确点亮,而左侧的网格则没有。显然问题出在我的着色器代码中。我最初认为问题出在导入网格上的 UV 贴图中,但事实并非如此。在 jsfiddle 示例中,UV 贴图直接从导入的几何体复制到 BoxGeometry 网格——由于 Blender 和 three.js 之间的坐标差异,它们相对于彼此旋转,但光照仍然在右侧的网格与导入的 UV。

着色器代码为:

THREE.TestShader = {
  uniforms: {
    "uDirLightPos": {
      type: "v3",
      value: new THREE.Vector3(20, 20, 20)
    },
    "uDirLightColor": {
      type: "c",
      value: new THREE.Color(0xffffff)
    },
    "uTexture": {
      type: "t",
      value: null
    },
  },
  vertexShader: [
    "varying vec3 vNormal;",
    "varying vec3 vViewPosition;",
    "varying vec2 vUv;",
    "void main() {",
    "vUv = uv;",
    "vNormal = normalize(normalMatrix * normal);",
    "vec4 mvPosition = modelViewMatrix * vec4(position, 1.0);",
    "vViewPosition = -mvPosition.xyz;",
    "gl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0);",
    "}"
  ].join("\n"),
  fragmentShader: [
    "uniform vec3 uDirLightPos;",
    "uniform vec3 uDirLightColor;",
    "varying vec2 vUv;",
    "varying vec3 vNormal;",
    "varying vec3 vViewPosition;",
    "varying vec4 mvPosition;",
    "uniform sampler2D uTexture;",

    "void main() {",
    "vec4 lDirection = viewMatrix * vec4(uDirLightPos, 0.0);",
    "vec3 lVector = normalize(lDirection.xyz);",
    "vec3 normal = normalize(vNormal);",
    "float diffuse = dot(normal, lVector);",
    "vec4 texel = texture2D( uTexture, vUv );",
    "gl_FragColor = vec4(uDirLightColor * diffuse, 1.0) * texel;",
    "}"
  ].join("\n")
};

除了这个特定问题的解决方案之外,我们将不胜感激提供有关three.js 着色器内容的更好文档的指针。 ShaderChunkShaderLibUniformsLib 的官方文档并不是您所说的详尽无遗。

【问题讨论】:

    标签: three.js


    【解决方案1】:

    您的 Blender 导出模型的法线不正确。

    vnh1 = new THREE.VertexNormalsHelper( mesh1, 1, 0xff0000, 1 );
    scene.add( vnh1 );
    

    小提琴:https://jsfiddle.net/5j0axcgz/1/

    three.js r.77

    【讨论】:

    • 啊,这似乎是三个.js 搅拌器导出器的问题---搅拌器中的法线是正确的。
    • 看起来是同一个问题,但在 master 的导出器中似乎没有修复。
    • 嗯...github.com/mrdoob/three.js/commit/… 如果您认为还存在three.js 错误,请联系bug report。会有帮助的。
    • 我不确定这是一个错误还是只是出口商非常非常脆弱——用几个非常简单的模型进行测试,不管它们是否有效,都是一个废话在 Blender 中显示正确的法线。我们真正需要的是正式的文件/出口商的清单,记录它期望/需要什么来产生正确的出口。
    • 如果您愿意承担这项任务,我希望许多用户会感激不尽。请不要太挑剔。厨房里有很多厨师。
    猜你喜欢
    • 1970-01-01
    • 2013-09-03
    • 2016-09-17
    • 1970-01-01
    • 1970-01-01
    • 2019-06-29
    • 2012-09-14
    • 2013-04-05
    • 2023-01-16
    相关资源
    最近更新 更多