Three.js: RawShaderMaterial no usa opacidad

Creado en 23 mar. 2017  ·  3Comentarios  ·  Fuente: mrdoob/three.js

Descripción del problema

La opacidad RawShaderMaterial no se usa, incluso cuando se establece la bandera de transparencia. He visto este problema en r84 y versiones desde r78. Principalmente he estado usando Chrome versión 56.0.2924.87 (64 bits), pero también vi esto en Firefox para r84. Espero que mis objetos usen un 50% de opacidad si se establece la opacidad en RawShaderMaterial.

Tengo una página html de prueba que muestra el problema. Tenga en cuenta que la opacidad y la transparencia se pasan al RawShaderMaterial, pero los puntos se muestran en 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>
Versión Three.js
  • [x] r84

Notado por primera vez en r78, no hay datos antes de ese punto.

Navegador
  • [x] Chrome
  • [x] Firefox

Probablemente mas

SO
  • [X] macOS

Creo que también he visto esto en Linux (Fedora), pero eso fue hace un tiempo y no en mi computadora.

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

No creo que sea significativo, pero estoy usando MacBook Pro (Retina, 15 pulgadas, finales de 2013) mientras uso solo gráficos discretos NVIDIA GeForce GT 750M.

Comentario más útil

Sí, con un RawShaderMaterial estás solo.

Todos 3 comentarios

@clawconduce Creo que es solo para usar cuando incluyes partes de ShaderChunk / ShaderLib . Es cierto, no hay ninguna referencia en RawShaderMaterial & ShaderMaterial . Pero se usa en Mater

Lo que encontré:

Si desea ajustar la opacidad con RawShaderMaterial , debe modificar el canal alfa en gl_FragColor dentro de su sombreador de fragmentos

Ya veo, gracias!

Creo que a los documentos les vendría bien una aclaración. Por ejemplo, "RawShaderMaterial (parámetros)

parámetros: (opcional) un objeto con una o más propiedades que definen la apariencia del material. Cualquier propiedad del material (incluida cualquier propiedad heredada de Material y ShaderMaterial) se puede pasar aquí ".

No estoy seguro de cuál es la mejor manera de actualizarlos, probablemente solo agregaría una excepción. Podría hacer las relaciones públicas si eso suena bien.

Soy un poco nuevo en WebGL, por lo que tendrá que disculpar mi terminología. ¿Esto también significa que la opacidad de un material se aplica por vértice? Si pongo 50% de opacidad en el material y tengo 2 puntos superpuestos, donde se superponen, ¿el color tendrá> 50% de opacidad?

Sí, con un RawShaderMaterial estás solo.

¿Fue útil esta página
0 / 5 - 0 calificaciones