Я рисую две геометрии рядом друг с другом и поворачиваю их. Проблема в том, что первая обратная сторона препятствует второму, где прозрачность должна вступить в силу. Эти два объекта должны иметь одинаковую прозрачность, независимо от того, кто был нарисован первым. Вот почему смешение включено, и проверка глубины отключена. Вот изображения:Три прозрачности JS с ShaderMaterial
обе геометрии облако точек с помощью THREE.ShaderMaterial как следует:
var shaderMaterial = new THREE.ShaderMaterial({
uniforms: uniforms,
attributes: attributes,
vertexShader: document.getElementById('vertexshader').textContent,
fragmentShader: document.getElementById('fragmentshader').textContent,
blending: THREE.NormalBlending,
depthTest: false,
transparent: true
});
где
// attributes
attributes = {
size: { type: 'f', value: null },
alpha: { type: 'f', value: [] },
customColor: { type: 'c', value: null }
};
// uniforms
uniforms = {
color: { type: "c", value: new THREE.Color(0x00ff00) },
texture: { type: "t", value: THREE.ImageUtils.loadTexture("../textures/sprites/circle.png") }
};
и
<script type="x-shader/x-vertex" id="vertexshader">
attribute float alpha;
attribute float size;
attribute vec3 customColor;
varying float vAlpha;
varying vec3 vColor;
void main() {
vAlpha = alpha;
vColor = customColor;
vec4 mvPosition = modelViewMatrix * vec4(position, 1.0);
gl_PointSize = size * (120.0/length(mvPosition.xyz));
gl_Position = projectionMatrix * mvPosition;
}
</script>
<script type="x-shader/x-fragment" id="fragmentshader">
uniform vec3 color;
uniform sampler2D texture;
varying float vAlpha;
varying vec3 vColor;
void main() {
gl_FragColor = vec4(vColor, vAlpha);
gl_FragColor = gl_FragColor * texture2D(texture, gl_PointCoord);
}
</script>
Try 'material.alphaTest = 0.5'. Если это не сработает, вы можете предоставить ссылку _simple_ live? – WestLangley
Где я могу добавить material.alphaTest = 0,5 to? –
Извините. Поскольку вы используете 'ShaderMaterial', вы должны сами это обработать:' if (gl_FragColor.a <0.5) discard; ' – WestLangley