gpt4 book ai didi

three.js - 实例形状内的透明度

转载 作者:行者123 更新时间:2023-12-02 20:47:54 25 4
gpt4 key购买 nike

我一直在玩THREE.InstancedBufferGeometry。我终于得到了一个可以使用的示例,现在已经开始使用着色器了。我尝试的第一件事是设置透明度。我的示例代码如下。

初始状态以及从许多其他摄像机角度(例如将鼠标拖动到左侧)来看,透明度似乎没有任何效果。但在其他摄像机角度(例如重新加载并将鼠标拖动到右侧),形状明显重叠,这正是我所期望的。

对于实例形状的深度排序处理是否不同,或者我做错了什么,或者遗漏了什么?我是否需要以某种方式更新形状,以便相机知道它们在场景中的正确深度?

var cubeGeo = new THREE.InstancedBufferGeometry().copy(new THREE.BoxBufferGeometry(10, 10, 10));
//cubeGeo.maxInstancedCount = 8;

cubeGeo.addAttribute("cubePos", new THREE.InstancedBufferAttribute(new Float32Array([
25, 25, 25,
25, 25, -25, -25, 25, 25, -25, 25, -25,
25, -25, 25,
25, -25, -25, -25, -25, 25, -25, -25, -25
]), 3, 1));

var vertexShader = [
"precision highp float;",
"",
"uniform mat4 modelViewMatrix;",
"uniform mat4 projectionMatrix;",
"",
"attribute vec3 position;",
"attribute vec3 cubePos;",
"",
"void main() {",
"",
" gl_Position = projectionMatrix * modelViewMatrix * vec4( cubePos + position, 1.0 );",
"",
"}"
].join("\n");
var fragmentShader = [
"precision highp float;",
"",
"void main() {",
"",
" gl_FragColor = vec4(1.0, 0.0, 0.0, 0.5);",
"",
"}"
].join("\n");

var mat = new THREE.RawShaderMaterial({
uniforms: {},
vertexShader: vertexShader,
fragmentShader: fragmentShader,
transparent: true
});

var mesh = new THREE.Mesh(cubeGeo, mat);

scene.add(mesh);
html * {
padding: 0;
margin: 0;
width: 100%;
overflow: hidden;
}

#host {
width: 100%;
height: 100%;
}
<script src="http://threejs.org/build/three.js"></script>
<script src="http://threejs.org/examples/js/controls/TrackballControls.js"></script>
<script src="http://threejs.org/examples/js/libs/stats.min.js"></script>
<div id="host"></div>

<script>
var WIDTH = window.innerWidth,
HEIGHT = window.innerHeight,
FOV = 35,
NEAR = 1,
FAR = 1000;

var renderer = new THREE.WebGLRenderer({
antialias: true
});
renderer.setSize(WIDTH, HEIGHT);
document.getElementById('host').appendChild(renderer.domElement);

var stats = new Stats();
stats.domElement.style.position = 'absolute';
stats.domElement.style.top = '0';
document.body.appendChild(stats.domElement);


var camera = new THREE.PerspectiveCamera(FOV, WIDTH / HEIGHT, NEAR, FAR);
camera.position.z = 250;

var trackballControl = new THREE.TrackballControls(camera, renderer.domElement);
trackballControl.rotateSpeed = 2.0; // need to speed it up a little

var scene = new THREE.Scene();

var light = new THREE.PointLight(0xffffff, 1, Infinity);
camera.add(light);

scene.add(light);

function render() {
if (typeof updateVertices !== "undefined") {
updateVertices();
}
renderer.render(scene, camera);
stats.update();
}

function animate() {
requestAnimationFrame(animate);
trackballControl.update();
render();
}

animate();
</script>

最佳答案

您正在将 InstancedBufferGeometry 与半透明的网格体一起使用。

实例按照它们在缓冲区中出现的顺序进行渲染。每个实例的面都按照几何图形指定的顺序进行渲染。

因此,如果您使用半透明实例,则可能会出现伪影,具体取决于视角。

根据您的使用案例,您可以尝试设置 material.depthWrite = false,但这可能会导致其他问题。

如果您的网格纹理具有完全透明(而不是部分)的区域,您应该能够使用 material.alphaTest 丢弃不需要的片段,而不会产生伪影。

三.js r.84

关于three.js - 实例形状内的透明度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43502415/

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