使用ShaderMaterial的时候, tepthTest = true 的同时,还需要在着色器中包含两行代码才可以让 depthTest = true生效。
顶点着色器添加这两行代码。
片元着色器添加这两行代码
我对着色器不太懂,我把代码贴出来,可以帮忙看一下咋加吗
const creatShaderMaterial = (texture) => {
return new THREE.ShaderMaterial ({
vertexShader: `
varying vec2 vUv;
void main() {
gl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0);
vUv = uv;
}
`,
fragmentShader: `
uniform sampler2D heightMap;
uniform float uOpacity;
varying vec2 vUv;
void main() {
gl_FragColor = vec4(texture2D(heightMap, vUv.xy).rgb, uOpacity);
}
`,
uniforms: {
uOpacity: { value: 0.9 },
heightMap: { value: texture },
},
polygonOffsetUnits: 1,
polygonOffsetFactor: 1,
polygonOffset: true,
depthWrite: true,
depthTest: true,
transparent: true,
side: THREE.DoubleSide,
});
};
好像不能上传视频,那我截几张图
这个图片是从下向上看的
depthTest: true
这个属性我在ShaderMaterial 中加上了,在别的地方还需要加入吗,
你现在的问题 是网格穿透了嘛?
我不知道是不是,我现在感觉像这两个东西,没用在一个图层的原因
我把官网案例中的模型tojson()之后,后在我的代码中加载了这个json文件,还是会出现这个问题,按理说,您在官网的模型参数都是设置好的,我直接tojson()在重新加载,应该就是好的,但不是,所有我就感觉,是不是我的renderer、camera、Scene,哪里设置的不对,我对照看了一下,您的renderer中有一个matrixWorldNeedsUpdate设置的true,其他的基本上都差不多,是和这个有关系吗
@init 如果是网格穿透,那网格的材质 depthTest: true
说实话,我不知道我现在是什么情况,不知道属不属于网格穿透,这个应该怎么确认是不是这个问题
对了,忘了说了,如果我把 depthTest: false 那么就会出现和我现在一样的相反的问题,就是从上面看是没用问题的,但是从下面看就不对劲了