【发布时间】: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 着色器内容的更好文档的指针。 ShaderChunk、ShaderLib 和 UniformsLib 的官方文档并不是您所说的详尽无遗。
【问题讨论】:
标签: three.js