一个对象上的两个纹理三个 js
Two Textures on one Object Three js
我的目标是在一个对象上渲染两种不同的纹理。
我正在尝试用夜间纹理和白天纹理渲染地球,类似于:http://stuffin.space .
问题是我仍然想使用 Three.js classes,这样我就可以使用 MeshPhongMaterial [=24 添加凹凸贴图和 phong 反射=],而不必编写整个着色器。
我想过有两个对象,其中一个在一侧是透明的,或者扩展 MeshPhongMaterial class,但这似乎很难。
是否有一个简单的解决方案可以用 three.js 解决这个问题?
您可以将功能分配给 material's onBeforeCompile
property。
它传递了一个对象,该对象具有顶点和片段着色器以及制服的源。如
someMaterial.onBeforeCompile = function(shader) {
console.log(shader.vertexShader);
console.log(shader.fragmentShader);
});
您修改着色器,如
someMaterial.onBeforeCompile = function(shader) {
shader.fragmentShader = shader.fragmentShader.replace(thingToReplace, replacement);
});
着色器源是 "pre expanded",这意味着它是 three.js 特定格式。例如,上面 运行 时的默认片段着色器源可能看起来像
#include <common>
#include <color_pars_fragment>
#include <uv_pars_fragment>
#include <uv2_pars_fragment>
#include <map_pars_fragment>
#include <alphamap_pars_fragment>
#include <aomap_pars_fragment>
#include <lightmap_pars_fragment>
#include <envmap_pars_fragment>
#include <fog_pars_fragment>
#include <specularmap_pars_fragment>
#include <logdepthbuf_pars_fragment>
#include <clipping_planes_pars_fragment>
void main() {
#include <clipping_planes_fragment>
vec4 diffuseColor = vec4( diffuse, opacity );
#include <logdepthbuf_fragment>
#include <map_fragment>
#include <color_fragment>
#include <alphamap_fragment>
#include <alphatest_fragment>
#include <specularmap_fragment>
ReflectedLight reflectedLight = ReflectedLight( vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ) );
#ifdef USE_LIGHTMAP
reflectedLight.indirectDiffuse += texture2D( lightMap, vUv2 ).xyz * lightMapIntensity;
#else
reflectedLight.indirectDiffuse += vec3( 1.0 );
#endif
#include <aomap_fragment>
reflectedLight.indirectDiffuse *= diffuseColor.rgb;
vec3 outgoingLight = reflectedLight.indirectDiffuse;
#include <envmap_fragment>
gl_FragColor = vec4( outgoingLight, diffuseColor.a );
#include <premultiplied_alpha_fragment>
#include <tonemapping_fragment>
#include <encodings_fragment>
#include <fog_fragment>
}
查看所有这些片段,您可以尝试找出要替换的部分。我对你的猜测是 #include <color_fragment>
部分基于 this article
我的目标是在一个对象上渲染两种不同的纹理。
我正在尝试用夜间纹理和白天纹理渲染地球,类似于:http://stuffin.space .
问题是我仍然想使用 Three.js classes,这样我就可以使用 MeshPhongMaterial [=24 添加凹凸贴图和 phong 反射=],而不必编写整个着色器。
我想过有两个对象,其中一个在一侧是透明的,或者扩展 MeshPhongMaterial class,但这似乎很难。
是否有一个简单的解决方案可以用 three.js 解决这个问题?
您可以将功能分配给 material's onBeforeCompile
property。
它传递了一个对象,该对象具有顶点和片段着色器以及制服的源。如
someMaterial.onBeforeCompile = function(shader) {
console.log(shader.vertexShader);
console.log(shader.fragmentShader);
});
您修改着色器,如
someMaterial.onBeforeCompile = function(shader) {
shader.fragmentShader = shader.fragmentShader.replace(thingToReplace, replacement);
});
着色器源是 "pre expanded",这意味着它是 three.js 特定格式。例如,上面 运行 时的默认片段着色器源可能看起来像
#include <common>
#include <color_pars_fragment>
#include <uv_pars_fragment>
#include <uv2_pars_fragment>
#include <map_pars_fragment>
#include <alphamap_pars_fragment>
#include <aomap_pars_fragment>
#include <lightmap_pars_fragment>
#include <envmap_pars_fragment>
#include <fog_pars_fragment>
#include <specularmap_pars_fragment>
#include <logdepthbuf_pars_fragment>
#include <clipping_planes_pars_fragment>
void main() {
#include <clipping_planes_fragment>
vec4 diffuseColor = vec4( diffuse, opacity );
#include <logdepthbuf_fragment>
#include <map_fragment>
#include <color_fragment>
#include <alphamap_fragment>
#include <alphatest_fragment>
#include <specularmap_fragment>
ReflectedLight reflectedLight = ReflectedLight( vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ) );
#ifdef USE_LIGHTMAP
reflectedLight.indirectDiffuse += texture2D( lightMap, vUv2 ).xyz * lightMapIntensity;
#else
reflectedLight.indirectDiffuse += vec3( 1.0 );
#endif
#include <aomap_fragment>
reflectedLight.indirectDiffuse *= diffuseColor.rgb;
vec3 outgoingLight = reflectedLight.indirectDiffuse;
#include <envmap_fragment>
gl_FragColor = vec4( outgoingLight, diffuseColor.a );
#include <premultiplied_alpha_fragment>
#include <tonemapping_fragment>
#include <encodings_fragment>
#include <fog_fragment>
}
查看所有这些片段,您可以尝试找出要替换的部分。我对你的猜测是 #include <color_fragment>
部分基于 this article