A opacidade RawShaderMaterial não é usada, mesmo quando o sinalizador de transparência é definido. Eu vi esse problema em r84 e versões já em r78. Tenho usado principalmente o Chrome versão 56.0.2924.87 (64 bits), mas também vi isso no Firefox para r84. Espero que meus objetos usem 50% de opacidade se a opacidade em RawShaderMaterial estiver definida.
Tenho uma página html de teste que mostra o problema. Observe que a opacidade e a transparência são passadas para o RawShaderMaterial, embora os pontos sejam renderizados como azul sólido:
https://jsfiddle.net/jg4ta1po/
<script src="https://cdnjs.cloudflare.com/ajax/libs/three.js/84/three.js"></script>
<style>
body { background-color: grey; }
#render canvas {border: 1px solid black; }
</style>
<div id="render"></div>
<script type="text/javascript">
function drawDots(scene) {
var vertices = new Float32Array( [-32, 0, 0, 32, 0, 0] );
var geometry = new THREE.BufferGeometry();
geometry.addAttribute( 'position', new THREE.BufferAttribute( vertices, 3 ) );
var shaders = {
vertex: document.getElementById('rasterVertexShader').textContent,
fragment: document.getElementById('rasterFragmentShader').textContent,
};
var material = new THREE.RawShaderMaterial({
uniforms: {},
vertexShader: shaders.vertex,
fragmentShader: shaders.fragment,
transparent: true,
depthTest: false,
opacity: 0.5,
});
material.side = THREE.DoubleSide;
var mesh = new THREE.Points(geometry, material);
mesh.frustumCulled = false;
//TODO: Use groups
scene.add(mesh);
}
function initRenderer() {
var renderer = new THREE.WebGLRenderer({ alpha: true, antialias: true });
var div = document.getElementById('render');
div.appendChild(renderer.domElement);
var camera = new THREE.PerspectiveCamera(90, 1, 1, 1000);
camera.position.z = 256;
var scene = new THREE.Scene();
//var dpr = window.devicePixelRatio ? window.devicePixelRatio : 1;
//renderer.setPixelRatio(dpr);
renderer.setSize(256, 256)
camera.aspect = 1.0;
camera.updateProjectionMatrix();
return {
renderer: renderer,
scene: scene,
camera: camera,
}
}
document.addEventListener("DOMContentLoaded", function() {
var renderer, scene, camera;
var r = initRenderer();
drawDots(r.scene);
r.renderer.render(r.scene, r.camera);
});
</script>
<script type="x-shader/x-vertex" id="rasterVertexShader">
attribute vec3 position;
uniform mat4 projectionMatrix;
uniform mat4 modelViewMatrix;
void main() {
vec4 mvPosition = modelViewMatrix * vec4(position, 1.0);
gl_Position = projectionMatrix * mvPosition;;
gl_PointSize = 64.0;
}
</script>
<script type="x-shader/x-fragment" id="rasterFragmentShader">
void main() {
gl_FragColor = vec4(0.0, 0.0, 1.0, 1.0);
}
</script>
Observado pela primeira vez em r78, nenhum dado antes desse ponto.
Provavelmente mais
Acredito ter visto isso no Linux (Fedora) também, mas isso foi há um tempo e não no meu computador.
Não acredito que seja significativo, mas estou executando um MacBook Pro (Retina, 15 polegadas, final de 2013) enquanto uso apenas gráficos discretos NVIDIA GeForce GT 750M.
@clawconduce Eu acho que é apenas para uso quando você inclui partes de ShaderChunk
/ ShaderLib
. É verdade, não há referência em RawShaderMaterial
& ShaderMaterial
. Mas é usado em Mater
O que eu encontrei:
Se você quiser ajustar a opacidade com RawShaderMaterial
você deve modificar o canal alfa em gl_FragColor
dentro de seu sombreador de fragmento
Entendo, obrigado!
Acho que os documentos precisam de alguns esclarecimentos. Por exemplo, "RawShaderMaterial (parâmetros)
parâmetros - (opcional) um objeto com uma ou mais propriedades que definem a aparência do material. Qualquer propriedade do material (incluindo qualquer propriedade herdada de Material e ShaderMaterial) pode ser passada aqui. "
Não tenho certeza da melhor maneira de atualizá-los, provavelmente apenas adicionaria uma exceção. Eu poderia fazer o PR, se isso soar bem.
Eu sou um pouco novo em WebGL, então você terá que desculpar minha terminologia. Isso também significa que a opacidade de um Material é aplicada por vértice? Se eu colocar 50% de opacidade no material, e tiver 2 pontos de sobreposição, onde eles se sobrepõem a cor terá> 50% de opacidade?
Sim, com RawShaderMaterial
você está por conta própria.
Comentários muito úteis
Sim, com
RawShaderMaterial
você está por conta própria.