gpt4 book ai didi

javascript - THREE.js 基于高度的 vertexShader 颜色混合

转载 作者:行者123 更新时间:2023-12-04 07:18:30 24 4
gpt4 key购买 nike

仅当高度为零时,如何为网格设置颜色?
至于现在,我只是混合了颜色:
enter image description here
问题是这种混合并不精确。我只在高度为零时才想要蓝色(所以只在我用油漆制作的红色路径内)。
我为网格创建了一个自定义 Material ,如下所示:

material = new THREE.ShaderMaterial({

uniforms: THREE.UniformsUtils.merge([
THREE.UniformsLib['lights'],
{
lightIntensity: {type: 'f', value: 1.0},
diffuse: {type: 'c', value: new THREE.Color(0x0000ff)},
color0: {
value: new THREE.Color("blue")
},
color1: {
value: new THREE.Color("green")
},
color2: {
value: new THREE.Color("brown")
},
color3: {
value: new THREE.Color("black")
},
bboxMin: {
value: geom.boundingBox.min
},
bboxMax: {
value: geom.boundingBox.max
}

}
]),
vertexShader: `
uniform vec3 bboxMin;
uniform vec3 bboxMax;
varying vec2 vUv;
varying vec3 vPos;
varying vec3 vNormal;
void main() {
vPos = (modelMatrix * vec4(position, 1.0 )).xyz;
vNormal = normalMatrix * normal;
vUv.y = (position.y - bboxMin.y) / (bboxMax.y - bboxMin.y);
gl_Position = projectionMatrix * modelViewMatrix * vec4(position,1.0);
}
`,
fragmentShader: `
uniform vec3 color1;
uniform vec3 color2;
uniform vec3 color3;
uniform vec3 color0;
varying vec2 vUv;

uniform vec3 diffuse;
varying vec3 vPos;
varying vec3 vNormal;

struct PointLight {
vec3 position;
vec3 color;
};
uniform PointLight pointLights[ NUM_POINT_LIGHTS ];

void main() {
vec4 addedLights = vec4(0.1, 0.1, 0.1, 1.0);
for(int l = 0; l < NUM_POINT_LIGHTS; l++) {
vec3 adjustedLight = pointLights[l].position + cameraPosition;
vec3 lightDirection = normalize(vPos - adjustedLight);
addedLights.rgb += clamp(dot(-lightDirection, vNormal), 0.0, 1.0) * pointLights[l].color;
}


gl_FragColor = mix(vec4(mix(mix(mix(color0, color1, vUv.y), color1, vUv.y), mix(color1, color2, vUv.y), vUv.y), 1.0),addedLights, addedLights);
}
`,
lights: true
});

最佳答案

尝试使用 step()功能。 Here's a definition以帮助您理解它。这是它的工作原理:float step(float edge, float x)

  • 它需要一个常量来声明 edge , 和 x ,这是你的变量。
  • 如果 x 低于边缘,你会得到 0 ,如果 x 在边缘之​​上,你会得到 1 .

  • 这是它的简化用法。当高度低于 0.2 时,您将获得蓝色,而当高度高于 0.2 时,您将获得绿色。
    vec3 green = vec3(0.0, 1.0, 0.0);
    vec3 blue = vec3(0.0, 0.0, 1.0);

    float edge = 0.2;

    float colorMix = step(edge, height);
    vec3 finalColor = mix(blue, green, colorMix);
    我选择了 0.2 来给蓝色带一些厚度,否则它是不可见的。

    关于javascript - THREE.js 基于高度的 vertexShader 颜色混合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68649504/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com