使用three.js我一直在尝试创建一个使用内置lambert着色器的ShaderMaterial,所以我可以扩展lambert着色器并添加我自己的着色器代码,例如在顶点着色器中做一些简单的波形,无需重写已经存在的所有便利照明代码。
我的代码如下:
var lambertShader = THREE.ShaderLib['lambert'];
lambertShader.uniforms.map = {type:"t", value:this.waterTexture};
this.seaMaterial = new THREE.ShaderMaterial({
vertexShader: "#define USE_MAP\n"+lambertShader.vertexShader,
fragmentShader: "#define USE_MAP\n"+lambertShader.fragmentShader,
uniforms: lambertShader.uniforms,
lights: true,
transparent: true,
opacity: 0.8,
depthTest: false,
depthWrite: false
});
首先,我从THREE.ShaderLib ['lambert']复制默认着色器程序和制服。
然后我将'map'统一设置为我想要使用的纹理。
最后,我使用lambert着色器程序创建了ShaderMaterial。
我遇到的问题:
我感觉有更多的#define预处理程序指令会自动为MeshLambertMaterials启用,但不适用于ShaderMaterials,或者它可能是一个不同的问题。
看起来照明工作正常,所以至少会发送到着色器。
有没有办法自动添加所需的预处理程序指令或以任何其他方式修复depthTest / depthWrite和纹理重复问题? (因为我认为这就是着色器无法正常运行的原因)
我查看了three.js源代码,看来在WebGLProgram.js中,从第127行开始,有一些代码将必要的#define语句添加到着色器程序中,但我不是确定为什么没有为THREE.ShaderMaterial调用代码。
提前致谢, 罗宾