使用ShaderMaterial並設置兩個紋理制服,然後着色器中混合起來。
我做了這個例子:http://abstract-algorithm.com/three_sh/這真的應該夠了。
所以,你讓ShaderMaterial:
var vertShader = document.getElementById('vertex_shh').innerHTML;
var fragShader = document.getElementById('fragment_shh').innerHTML;
var attributes = {}; // custom attributes
var uniforms = { // custom uniforms (your textures)
tOne: { type: "t", value: THREE.ImageUtils.loadTexture("cover.png") },
tSec: { type: "t", value: THREE.ImageUtils.loadTexture("grass.jpg") }
};
var material_shh = new THREE.ShaderMaterial({
uniforms: uniforms,
attributes: attributes,
vertexShader: vertShader,
fragmentShader: fragShader
});
有了這樣的材料製作網:
var me = new THREE.Mesh(new THREE.CubeGeometry(80,80,80), material_shh);
你可以把最簡單的頂點着色器:
varying vec2 vUv;
void main()
{
vUv = uv;
vec4 mvPosition = modelViewMatrix * vec4(position, 1.0);
gl_Position = projectionMatrix * mvPosition;
}
和片段着色器會怎麼做混合:
#ifdef GL_ES
precision highp float;
#endif
uniform sampler2D tOne;
uniform sampler2D tSec;
varying vec2 vUv;
void main(void)
{
vec3 c;
vec4 Ca = texture2D(tOne, vUv);
vec4 Cb = texture2D(tSec, vUv);
c = Ca.rgb * Ca.a + Cb.rgb * Cb.a * (1.0 - Ca.a); // blending equation
gl_FragColor= vec4(c, 1.0);
}
如果你需要融入更多的紋理,你用同樣的公式只是多次混合。
所以這裏的結果:
你可以嘗試的辦法,答案[這裏](http://stackoverflow.com/questions/13309289/three-js-geometry-in-top -of-another/13309722#13309722) – WestLangley 2013-04-30 20:21:09
謝謝。似乎是一個好方法。並可能處理也呈現多個紋理彼此之上。但迄今尚未測試。 – 2013-05-01 08:53:17