Three.js: RawShaderMaterialは不透明度を使用しません

作成日 2017年03月23日  ·  3コメント  ·  ソース: mrdoob/three.js

問題の説明

透明度フラグが設定されている場合でも、RawShaderMaterialの不透明度は使用されません。 私はこの問題をr84とr78までのバージョンで見ました。 私は主にChromeバージョン56.0.2924.87(64ビット)を使用していますが、これはFirefox forr84でも見られました。 RawShaderMaterialの不透明度が設定されている場合、オブジェクトは50%の不透明度を使用することを期待しています。

問題を示すテストHTMLページがあります。 不透明度と透明度はRawShaderMaterialに渡されますが、ポイントは青一色でレンダリングされることに注意してください。

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>
Three.jsバージョン
  • [x] r84

r78で最初に気づいたのは、それ以前のデータはありません。

ブラウザ
  • [x]クローム
  • [x] Firefox

おそらくもっと

OS
  • [X] macOS

Linux(Fedora)でもこれを見たことがあると思いますが、それは少し前のことであり、私のコンピューターではありません。

ハードウェア要件(グラフィックカード、VRデバイスなど)

重要だとは思いませんが、ディスクリートのみのグラフィックスNVIDIA GeForce GT 750Mを使用しながら、MacBook Pro(Retina、15インチ、2013年後半)で実行しています。

最も参考になるコメント

ええ、 RawShaderMaterialあなたはあなた自身です。

全てのコメント3件

@clawconduce ShaderChunk / ShaderLib一部を含める場合にのみ使用すると思います。 確かに、 RawShaderMaterialShaderMaterialには参照がありません。 しかし、それはMater使用されます

私が見つけたもの:

RawShaderMaterial不透明度を調整する場合は、フラグメントシェーダー内のgl_FragColorアルファチャネルを変更する必要があります。

なるほど、ありがとう!

ドキュメントはいくつかの説明を使用できると思います。 たとえば、「RawShaderMaterial(parameters)

パラメータ-(オプション)マテリアルの外観を定義する1つ以上のプロパティを持つオブジェクト。 マテリアルのすべてのプロパティ(MaterialおよびShaderMaterialから継承されたプロパティを含む)をここに渡すことができます。」

それらを更新する最善の方法がわかりません。おそらく例外を追加するだけです。 よろしければPRできます。

私はWebGLに少し慣れていないので、私の用語を許さなければなりません。 これは、マテリアルの不透明度が頂点ごとに適用されることも意味しますか? マテリアルに50%の不透明度を設定し、2つのオーバーラップするポイントがある場合、それらがオーバーラップする場所で、色の不透明度は50%を超えますか?

ええ、 RawShaderMaterialあなたはあなた自身です。

このページは役に立ちましたか?
0 / 5 - 0 評価