ํฌ๋ช ๋ ํ๋๊ทธ๊ฐ ์ค์ ๋์ด ์์ด๋ 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>
r78์์ ์ฒ์ ๋ฐ๊ฒฌ๋์์ผ๋ฉฐ ๊ทธ ์์ ์ด์ ์๋ ๋ฐ์ดํฐ๊ฐ ์์ต๋๋ค.
์๋ง ๋
๋๋ ์ด๊ฒ์ Linux(Fedora)์์๋ ๋ณธ ์ ์ด ์๋ค๊ณ ์๊ฐํ์ง๋ง ๊ทธ๊ฒ์ ์ผ๋ง ์ ์ ์ผ์ด๋ฉฐ ๋ด ์ปดํจํฐ๊ฐ ์๋๋๋ค.
๋๋ ๊ทธ๊ฒ์ด ์ค์ํ๋ค๊ณ ์๊ฐํ์ง ์์ง๋ง ๊ฐ๋ณ ๊ทธ๋ํฝ NVIDIA GeForce GT 750M์ ์ฌ์ฉํ๋ฉด์ MacBook Pro(Retina, 15-inch, Late 2013)์์ ์คํํ๊ณ ์์ต๋๋ค.
@clawconduce ShaderChunk
/ ShaderLib
์ผ๋ถ๋ฅผ ํฌํจํ ๋๋ง ์ฌ์ฉํ๋ค๊ณ ์๊ฐํฉ๋๋ค. ์ฌ์ค, RawShaderMaterial
& ShaderMaterial
์๋ ์ฐธ์กฐ๊ฐ ์์ต๋๋ค. ํ์ง๋ง Mater
๋ด๊ฐ ์ฐพ์ ๊ฒ:
RawShaderMaterial
๋ถํฌ๋ช
๋๋ฅผ ์กฐ์ ํ๋ ค๋ฉด ํ๋๊ทธ๋จผํธ ์
ฐ์ด๋ ๋ด๋ถ์์ gl_FragColor
์ํ ์ฑ๋์ ์์ ํด์ผ ํฉ๋๋ค.
์๊ฒ ์ต๋๋ค, ๊ฐ์ฌํฉ๋๋ค!
๋ฌธ์๊ฐ ์ฝ๊ฐ์ ์ค๋ช ์ ์ฌ์ฉํ ์ ์๋ค๊ณ ์๊ฐํฉ๋๋ค. ์๋ฅผ ๋ค์ด "RawShaderMaterial(๋งค๊ฐ๋ณ์)
๋งค๊ฐ๋ณ์ - (์ ํ ์ฌํญ) ์ฌ๋ฃ์ ๋ชจ์์ ์ ์ํ๋ ํ๋ ์ด์์ ์์ฑ์ด ์๋ ๊ฐ์ฒด. ๋จธํฐ๋ฆฌ์ผ์ ๋ชจ๋ ์์ฑ(Material ๋ฐ ShaderMaterial์์ ์์๋ ์์ฑ ํฌํจ)์ ์ฌ๊ธฐ์ ์ ๋ฌํ ์ ์์ต๋๋ค."
๊ทธ๊ฒ๋ค์ ์ ๋ฐ์ดํธํ๋ ๊ฐ์ฅ ์ข์ ๋ฐฉ๋ฒ์ ํ์คํ์ง ์์ต๋๋ค. ์๋ง๋ ์์ธ๋ฅผ ์ถ๊ฐํ ๊ฒ์ ๋๋ค. ๊ด์ฐฎ๋ค๋ฉด ํ๋ณด๋ฅผ ํ ์ ์์ต๋๋ค.
์ ๋ WebGL์ ์ฒ์ ์ ํ๊ธฐ ๋๋ฌธ์ ์ ์ฉ์ด๋ฅผ ์ฉ์ํด์ผ ํฉ๋๋ค. ์ด๊ฒ์ ๋ํ ๋จธํฐ๋ฆฌ์ผ์ ๋ถํฌ๋ช ๋๊ฐ ์ ์ ๋ง๋ค ์ ์ฉ๋๋ค๋ ๊ฒ์ ์๋ฏธํฉ๋๊น? ์ฌ๋ฃ์ 50% ๋ถํฌ๋ช ๋๋ฅผ ์ ์ฉํ๊ณ ๊ฒน์น๋ ์ ์ด 2๊ฐ ์๋ ๊ฒฝ์ฐ ๊ฒน์น๋ ๋ถ๋ถ์์ ์์์ ๋ถํฌ๋ช ๋๊ฐ 50%๋ฅผ ์ด๊ณผํฉ๋๊น?
์, RawShaderMaterial
์ ํจ๊ป๋ผ๋ฉด ํผ์์
๋๋ค.
๊ฐ์ฅ ์ ์ฉํ ๋๊ธ
์,
RawShaderMaterial
์ ํจ๊ป๋ผ๋ฉด ํผ์์ ๋๋ค.