Three.js: RawShaderMaterial์€ ๋ถˆํˆฌ๋ช…๋„๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์— ๋งŒ๋“  2017๋…„ 03์›” 23์ผ  ยท  3์ฝ”๋ฉ˜ํŠธ  ยท  ์ถœ์ฒ˜: mrdoob/three.js

๋ฌธ์ œ์— ๋Œ€ํ•œ ์„ค๋ช…

ํˆฌ๋ช…๋„ ํ”Œ๋ž˜๊ทธ๊ฐ€ ์„ค์ •๋˜์–ด ์žˆ์–ด๋„ RawShaderMaterial ๋ถˆํˆฌ๋ช…๋„๋Š” ์‚ฌ์šฉ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. r84 ๋ฐ r78๊นŒ์ง€ ๋ฒ„์ „์—์„œ ์ด ๋ฌธ์ œ๋ฅผ ๋ณด์•˜์Šต๋‹ˆ๋‹ค. ์ €๋Š” ์ฃผ๋กœ Chrome ๋ฒ„์ „ 56.0.2924.87(64๋น„ํŠธ)์„ ์‚ฌ์šฉํ–ˆ์ง€๋งŒ r84์šฉ Firefox์—์„œ๋„ ์ด๊ฒƒ์„ ๋ณด์•˜์Šต๋‹ˆ๋‹ค. 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] ํŒŒ์ด์–ดํญ์Šค

์•„๋งˆ ๋”

OS
  • [X] ๋งฅOS

๋‚˜๋Š” ์ด๊ฒƒ์„ Linux(Fedora)์—์„œ๋„ ๋ณธ ์ ์ด ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•˜์ง€๋งŒ ๊ทธ๊ฒƒ์€ ์–ผ๋งˆ ์ „์˜ ์ผ์ด๋ฉฐ ๋‚ด ์ปดํ“จํ„ฐ๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค.

ํ•˜๋“œ์›จ์–ด ์š”๊ตฌ ์‚ฌํ•ญ(๊ทธ๋ž˜ํ”ฝ ์นด๋“œ, VR ์žฅ์น˜, ...)

๋‚˜๋Š” ๊ทธ๊ฒƒ์ด ์ค‘์š”ํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ•˜์ง€ ์•Š์ง€๋งŒ ๊ฐœ๋ณ„ ๊ทธ๋ž˜ํ”ฝ NVIDIA GeForce GT 750M์„ ์‚ฌ์šฉํ•˜๋ฉด์„œ MacBook Pro(Retina, 15-inch, Late 2013)์—์„œ ์‹คํ–‰ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

๊ฐ€์žฅ ์œ ์šฉํ•œ ๋Œ“๊ธ€

์˜ˆ, RawShaderMaterial ์™€ ํ•จ๊ป˜๋ผ๋ฉด ํ˜ผ์ž์ž…๋‹ˆ๋‹ค.

๋ชจ๋“  3 ๋Œ“๊ธ€

@clawconduce ShaderChunk / ShaderLib ์ผ๋ถ€๋ฅผ ํฌํ•จํ•  ๋•Œ๋งŒ ์‚ฌ์šฉํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ์‚ฌ์‹ค, RawShaderMaterial & ShaderMaterial ์—๋Š” ์ฐธ์กฐ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ Mater

๋‚ด๊ฐ€ ์ฐพ์€ ๊ฒƒ:

RawShaderMaterial ๋ถˆํˆฌ๋ช…๋„๋ฅผ ์กฐ์ •ํ•˜๋ ค๋ฉด ํ”„๋ž˜๊ทธ๋จผํŠธ ์…ฐ์ด๋” ๋‚ด๋ถ€์—์„œ gl_FragColor ์•ŒํŒŒ ์ฑ„๋„์„ ์ˆ˜์ •ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์•Œ๊ฒ ์Šต๋‹ˆ๋‹ค, ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค!

๋ฌธ์„œ๊ฐ€ ์•ฝ๊ฐ„์˜ ์„ค๋ช…์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด "RawShaderMaterial(๋งค๊ฐœ๋ณ€์ˆ˜)

๋งค๊ฐœ๋ณ€์ˆ˜ - (์„ ํƒ ์‚ฌํ•ญ) ์žฌ๋ฃŒ์˜ ๋ชจ์–‘์„ ์ •์˜ํ•˜๋Š” ํ•˜๋‚˜ ์ด์ƒ์˜ ์†์„ฑ์ด ์žˆ๋Š” ๊ฐ์ฒด. ๋จธํ‹ฐ๋ฆฌ์–ผ์˜ ๋ชจ๋“  ์†์„ฑ(Material ๋ฐ ShaderMaterial์—์„œ ์ƒ์†๋œ ์†์„ฑ ํฌํ•จ)์€ ์—ฌ๊ธฐ์— ์ „๋‹ฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค."

๊ทธ๊ฒƒ๋“ค์„ ์—…๋ฐ์ดํŠธํ•˜๋Š” ๊ฐ€์žฅ ์ข‹์€ ๋ฐฉ๋ฒ•์€ ํ™•์‹คํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์•„๋งˆ๋„ ์˜ˆ์™ธ๋ฅผ ์ถ”๊ฐ€ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ดœ์ฐฎ๋‹ค๋ฉด ํ™๋ณด๋ฅผ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ €๋Š” WebGL์„ ์ฒ˜์Œ ์ ‘ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ œ ์šฉ์–ด๋ฅผ ์šฉ์„œํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ๋˜ํ•œ ๋จธํ‹ฐ๋ฆฌ์–ผ์˜ ๋ถˆํˆฌ๋ช…๋„๊ฐ€ ์ •์ ๋งˆ๋‹ค ์ ์šฉ๋œ๋‹ค๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๊นŒ? ์žฌ๋ฃŒ์— 50% ๋ถˆํˆฌ๋ช…๋„๋ฅผ ์ ์šฉํ•˜๊ณ  ๊ฒน์น˜๋Š” ์ ์ด 2๊ฐœ ์žˆ๋Š” ๊ฒฝ์šฐ ๊ฒน์น˜๋Š” ๋ถ€๋ถ„์—์„œ ์ƒ‰์ƒ์˜ ๋ถˆํˆฌ๋ช…๋„๊ฐ€ 50%๋ฅผ ์ดˆ๊ณผํ•ฉ๋‹ˆ๊นŒ?

์˜ˆ, RawShaderMaterial ์™€ ํ•จ๊ป˜๋ผ๋ฉด ํ˜ผ์ž์ž…๋‹ˆ๋‹ค.

์ด ํŽ˜์ด์ง€๊ฐ€ ๋„์›€์ด ๋˜์—ˆ๋‚˜์š”?
0 / 5 - 0 ๋“ฑ๊ธ‰