Three.js: RawShaderMaterial não usa opacidade

Criado em 23 mar. 2017  ·  3Comentários  ·  Fonte: mrdoob/three.js

Descrição do problema

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>
Versão Three.js
  • [x] r84

Observado pela primeira vez em r78, nenhum dado antes desse ponto.

Navegador
  • [x] Chrome
  • [x] Firefox

Provavelmente mais

SO
  • [X] macOS

Acredito ter visto isso no Linux (Fedora) também, mas isso foi há um tempo e não no meu computador.

Requisitos de hardware (placa gráfica, dispositivo VR, ...)

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.

Comentários muito úteis

Sim, com RawShaderMaterial você está por conta própria.

Todos 3 comentários

@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.

Esta página foi útil?
0 / 5 - 0 avaliações

Questões relacionadas

Horray picture Horray  ·  3Comentários

makc picture makc  ·  3Comentários

donmccurdy picture donmccurdy  ·  3Comentários

zsitro picture zsitro  ·  3Comentários

akshaysrin picture akshaysrin  ·  3Comentários