我正在尝试在几个已经构建的材料上实现剪裁。
在我看来,使用shaderMaterial
重新实现已经使用标准材料的所有内容太难了,所以我正在寻找更好的方法。
目前,我在三个webglrenderer中设置了一个回调函数initMaterial
var code = chunks.join();
// CSI - Custom Shader Injection
if (material.onCustomShaderBuild) material.onCustomShaderBuild (code, material);
// CSI - Custom Shader Injection
var program;
// Check if code has been already compiled
现在我的回调是
function myCsiFunction (code)
{
var myUniforms = {
uClipPlane: { type: "v4", value: new THREE.Vector4( 0.0, 0.0, -1.0, -300.0) },
clipOffset: { type: "f", value: -40.0 },
};
this.uniforms = THREE.UniformsUtils.merge ([this.uniforms, myUniforms]);
this.vertexShader = this.vertexShader.replace (
"#ifdef",
"varying float vClip;\n uniform vec4 uClipPlane;\n #ifdef");
this.vertexShader = this.vertexShader.replace (
"void main() {",
"void main() { vec4 pos4 = modelViewMatrix * vec4( position, 1.0 ); vClip = dot ( uClipPlane, pos4); ");
this.fragmentShader = this.fragmentShader.replace (
"#ifdef",
"varying float vClip;\n uniform float clipOffset;\n #ifdef");
this.fragmentShader = this.fragmentShader.replace (
"void main() {",
"void main() { if (vClip < clipOffset) discard; ");
}
现在它正在使用几种标准材料;但我不喜欢修改三个来源......
我三岁时很新,所以我可能会忽略一些内置的可能性。
我可以使用未经修改的标准三获得相同(或类似)的结果吗?