简体   繁体   English

在THREE.js中混合几个片段着色器以获得一个THREE.ShaderMaterial

[英]Blending several fragment shaders in THREE.js to obtain one THREE.ShaderMaterial

I have a question about blending several fragment shaders in THREE.js Here I present a code for mixing one shader with different parameters, but I also need to mix different shaders. 我有一个关于在THREE.js中混合几个片段着色器的问题。在这里,我提供了一个代码,用于将一个着色器与不同的参数混合,但是我还需要混合不同的着色器。

My shader: 我的着色器:

uniform vec3 color;
  varying vec2 vUv;
  void main() {
    gl_FragColor = vec4(color,vUv.y);

  }

Then i define uniforms and materials: 然后定义制服和材料:

var uniforms1 = {
    "color" : {
        type : "c",
        value : new THREE.Color(0x00ff00)
    },
};
var uniforms2 = {
    "color" : {
        type : "c",
        value : new THREE.Color(0xff0000)
    },
};

var material1 = new THREE.ShaderMaterial({
    uniforms: uniforms1,
    vertexShader: vShader,
    fragmentShader: fShader,
    transparent: true
});
var material2 = new THREE.ShaderMaterial({
    uniforms: uniforms2,
    vertexShader: vShader,
    fragmentShader: fShader,
    transparent: true
});

Till now everything looks ok. 到现在为止一切看起来还不错。 But then I want to overlay them and do it in a strange way creating two objects: 但是然后我想覆盖它们,并以一种奇怪的方式创建两个对象:

var geometry = new THREE.CircleGeometry(50, 50);
mesh1 = new THREE.Mesh(geometry, material1);
mesh2 = new THREE.Mesh(geometry, material2);
mesh1.rotation.z = -0.25 * Math.PI;
mesh2.rotation.z = 0.25 * Math.PI;

Thus I have a result I need, but I understand, that it is not a good idea to create separate mesh for each shader. 因此,我有需要的结果,但我理解,为每个着色器创建单独的网格不是一个好主意。 Moreover, if my object will not be symmetric I will have troubles. 而且,如果我的对象不是对称的,我会遇到麻烦。 Is it possible to blend shaders and obtain one material? 是否可以混合着色器并获得一种材质?

您可以使用EffectComposer混合着色器,但是,如果要查找的结果是直接在单个着色器中直接混合颜色THREE.Color(0xffff00) ,这似乎很简单,但是您可能正在寻找更复杂的东西...

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM