Three.js: RawShaderMaterial لا يستخدم العتامة

تم إنشاؤها على ٢٣ مارس ٢٠١٧  ·  3تعليقات  ·  مصدر: mrdoob/three.js

وصف المشكلة

لا يتم استخدام عتامة RawShaderMaterial ، حتى عند تعيين علامة الشفافية. لقد رأيت هذه المشكلة في إصدارات r84 بقدر ما يعود إلى r78. لقد كنت أستخدم إصدار Chrome 56.0.2924.87 (64 بت) بشكل أساسي ، لكنني رأيت ذلك في Firefox لـ r84 أيضًا. أتوقع أن تستخدم كائناتي عتامة بنسبة 50٪ إذا تم تعيين التعتيم في RawShaderMaterial.

لدي صفحة اختبار 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] ص 84

لوحظ لأول مرة في R78 ، لا توجد بيانات قبل تلك النقطة.

المستعرض
  • [x] كروم
  • [x] فايرفوكس

ربما أكثر

نظام التشغيل
  • [X] macOS

أعتقد أنني رأيت هذا على Linux (Fedora) أيضًا ، لكن ذلك كان منذ فترة وليس جهاز الكمبيوتر الخاص بي.

متطلبات الأجهزة (بطاقة الرسومات ، جهاز VR ، ...)

لا أعتقد أنها مهمة ، لكني أعمل على MacBook Pro (Retina ، 15 بوصة ، أواخر 2013) أثناء استخدام الرسومات المنفصلة فقط NVIDIA GeForce GT 750M.

التعليق الأكثر فائدة

نعم ، مع RawShaderMaterial أنت وحدك.

ال 3 كومينتر

clawconduce أعتقد أنه مخصص للاستخدام فقط عندما تقوم بتضمين أجزاء من ShaderChunk / ShaderLib . هذا صحيح ، لا يوجد مرجع في RawShaderMaterial و ShaderMaterial . ولكن يتم استخدامه في Mater

ماذا وجدت:

إذا كنت تريد ضبط التعتيم باستخدام RawShaderMaterial فيجب عليك تعديل قناة ألفا في gl_FragColor داخل تظليل الأجزاء

فهمت شكرا!

أعتقد أن المستندات يمكن أن تستخدم بعض التوضيح. على سبيل المثال ، "RawShaderMaterial (معلمات)

المعلمات - (اختياري) كائن له خاصية واحدة أو أكثر تحدد مظهر المادة. يمكن نقل أي ممتلكات للمادة (بما في ذلك أي ممتلكات موروثة من Material و ShaderMaterial) هنا ".

لست متأكدًا من أفضل طريقة لتحديثها ، ربما سأضيف استثناءً فقط. يمكنني جعل العلاقات العامة إذا كان هذا يبدو جيدًا.

أنا جديد قليلاً على WebGL ، لذا عليك أن تتعذر على المصطلحات الخاصة بي. هل هذا يعني أيضًا أن عتامة المادة مطبقة على كل رأس؟ إذا قمت بوضع عتامة بنسبة 50٪ على المادة ، ولديك نقطتان متداخلتان ، في حالة تداخلهما ، فهل سيكون للون عتامة أكبر من 50٪؟

نعم ، مع RawShaderMaterial أنت وحدك.

هل كانت هذه الصفحة مفيدة؟
0 / 5 - 0 التقييمات