gpt4 book ai didi

javascript - 强制 Sprite 对象始终位于 THREE.js 中的天穹对象前面

转载 作者:行者123 更新时间:2023-11-30 08:52:52 25 4
gpt4 key购买 nike

我目前有一个自定义着色器在天穹上绘制渐变,并希望在天穹前有一个太阳/月亮(从用户的 Angular 来看)。最简单的方法是为太阳和月亮设置 sprite,但出现的问题是 sprite 会卡在 skydome 内(sprite 部分位于 skydome 前面,部分位于 skydome 后面)。我试图用 polygonoffset 解决这个问题,但这似乎不适用于 sprite 对象。

所以我的问题是,我怎样才能在天穹顶部设置太阳/月亮,而不必修改我的自定义天穹着色器来添加带有渐变的太阳/月亮纹理(这最终可能会非常困难)?

下面是我的天穹天空着色器的代码。

new THREE.ShaderMaterial({
uniforms: {
glow: {
type: "t",
value: THREE.ImageUtils.loadTexture(DEFAULT_PATH+"glow2.png")
},
color: {
type: "t",
value: THREE.ImageUtils.loadTexture(DEFAULT_PATH+"sky2.png")
},
lightDir: {
type: "v3",
value: self.lightPos
}
},
vertexShader: [
"varying vec3 vWorldPosition;",
"varying vec3 vPosition;",
"void main() {",
"vec4 worldPosition = modelMatrix * vec4(position, 1.0);",
"vWorldPosition = worldPosition.xyz;",
"vPosition = position;",
"gl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0);",
"}"
].join("\n"),
fragmentShader: [
"uniform sampler2D glow;",
"uniform sampler2D color;",
"uniform vec3 lightDir;",
"varying vec3 vWorldPosition;",
"varying vec3 vPosition;",
"void main() {",
"vec3 V = normalize(vWorldPosition.xzy);",
"vec3 L = normalize(lightDir.xzy);",
"float vl = dot(V, L);",
"vec4 Kc = texture2D(color, vec2((L.y + 1.0) / 2.0, V.y));",
"vec4 Kg = texture2D(glow, vec2((L.y + 1.0) / 2.0, vl));",
"gl_FragColor = vec4(Kc.rgb + Kg.rgb * Kg.a / 2.0, Kc.a);",
"}",
].join("\n")
});

最佳答案

确保你的天穹在任何其他对象之前绘制,并禁用 Material 上的 depthWrite/depthTest 标志(depthWrite 是重要的事情此处):

yourmaterial = new THREE.ShaderMaterial({...});
yourmaterial.depthWrite = false;
yourmaterial.depthTest = false;
skydome.renderDepth = 1e20;

skydome 是您应用了您的 Material 的网格。

关于javascript - 强制 Sprite 对象始终位于 THREE.js 中的天穹对象前面,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16247280/

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