상세 컨텐츠

본문 제목

[WebGL] Three.js - Dot-Screen Shader

WEB/WebGL

by AlrepondTech 2017. 11. 1. 19:30

본문

반응형

 

 

=================================

=================================

=================================

 

 

 

 

 

출처: http://cinema4dr12.tistory.com/793

[WebGL] Dot-Screen Shader

 
 
이번 예제는 Dot Screen Shader 구현에 관한 것이다.

 

또한 Shader Code는 Alfred Qualia에게 저작권이 있음을 알려둔다:Visit Alfred Qualia's Web Page.

 

[Download Project]

14-03-shader-dot-screen.zip
다운로드

 

FULL SCREEN

 

 

[Operations]

Mouse Left Button Click & Drag: Camera Rotating

Mouse Wheel: Camera Zoom In & Out

Mouse Right Button Click & Drag: Camera Panning


[main.js]

// standard global variables var container, scene, camera, renderer, controls, stats; var keyboard = new THREEx.KeyboardState(); var clock = new THREE.Clock(); // custom global variables var gui; var shaderActive = "none"; // variables for shader var composer, finalPass; init(); animate(); // FUNCTIONS function init() { // SCENE scene = new THREE.Scene(); // CAMERA var SCREEN_WIDTH = window.innerWidth, SCREEN_HEIGHT = window.innerHeight; var VIEW_ANGLE = 45, ASPECT = SCREEN_WIDTH / SCREEN_HEIGHT, NEAR = 0.1, FAR = 20000; camera = new THREE.PerspectiveCamera( VIEW_ANGLE, ASPECT, NEAR, FAR); scene.add(camera); camera.position.set(0,150,400); camera.lookAt(scene.position); // RENDERER if ( Detector.webgl ) renderer = new THREE.WebGLRenderer( {antialias:true} ); else renderer = new THREE.CanvasRenderer(); renderer.setSize(SCREEN_WIDTH, SCREEN_HEIGHT); container = document.getElementById( 'ThreeJS' ); container.appendChild( renderer.domElement ); renderer.shadowMapEnabled = true; renderer.shadowMapSoft = true; // EVENTS THREEx.WindowResize(renderer, camera); THREEx.FullScreen.bindKey({ charCode : 'f'.charCodeAt(0) }); // CONTROLS controls = new THREE.OrbitControls( camera, renderer.domElement ); // STATS stats = new Stats(); stats.domElement.style.position = 'absolute'; stats.domElement.style.bottom = '0px'; stats.domElement.style.zIndex = 100; container.appendChild( stats.domElement ); // LIGHT var light = new THREE.PointLight(0xffffff); light.position.set(0,250,0); scene.add(light); var dirLight = new THREE.DirectionalLight(0xffc051); dirLight.position.set(-250,500,-150); dirLight.shadowDarkness = 0.95; dirLight.intensity = 2; dirLight.castShadow = true; // enable shadow casting ability for the light scene.add(dirLight); // FLOOR var floorTexture = new THREE.ImageUtils.loadTexture( 'img/Wood_floor.jpg' ); floorTexture.wrapS = floorTexture.wrapT = THREE.RepeatWrapping; floorTexture.repeat.set( 1, 1 ); var floorMaterial = new THREE.MeshBasicMaterial( { map: floorTexture, side: THREE.DoubleSide } ); var floorGeometry = new THREE.PlaneGeometry(1000, 1000, 10, 10); var floor = new THREE.Mesh(floorGeometry, floorMaterial); floor.position.y = -0.5; floor.rotation.x = Math.PI / 2; floor.receiveShadow = true; scene.add(floor); // SKYBOX/FOG var materialArray = []; materialArray.push(new THREE.MeshBasicMaterial( { map: THREE.ImageUtils.loadTexture( 'img/px.jpg' ) })); materialArray.push(new THREE.MeshBasicMaterial( { map: THREE.ImageUtils.loadTexture( 'img/nx.jpg' ) })); materialArray.push(new THREE.MeshBasicMaterial( { map: THREE.ImageUtils.loadTexture( 'img/py.jpg' ) })); materialArray.push(new THREE.MeshBasicMaterial( { map: THREE.ImageUtils.loadTexture( 'img/ny.jpg' ) })); materialArray.push(new THREE.MeshBasicMaterial( { map: THREE.ImageUtils.loadTexture( 'img/pz.jpg' ) })); materialArray.push(new THREE.MeshBasicMaterial( { map: THREE.ImageUtils.loadTexture( 'img/nz.jpg' ) })); for (var i = 0; i < 6; i++) materialArray[i].side = THREE.BackSide; var skyboxMaterial = new THREE.MeshFaceMaterial( materialArray ); var skyboxGeom = new THREE.CubeGeometry( 5000, 5000, 5000, 1, 1, 1 ); var skybox = new THREE.Mesh( skyboxGeom, skyboxMaterial ); scene.add( skybox ); //////////// // CUSTOM // //////////// var cubeGeometry = new THREE.CubeGeometry( 50, 50, 50 ); var cubeTexture = new THREE.ImageUtils.loadTexture( 'img/0.png' ); var cubeMaterial = new THREE.MeshBasicMaterial( { map: cubeTexture } ); var cube = new THREE.Mesh( cubeGeometry, cubeMaterial ); cube.position.set(-50,25,0); cube.castShadow = true; scene.add(cube); var cubeGeometry1 = new THREE.CubeGeometry( 50, 50, 50 ); var cubeTexture1 = new THREE.ImageUtils.loadTexture( 'img/4.png' ); var cubeMaterial1 = new THREE.MeshBasicMaterial( { map: cubeTexture1 } ); var cube1 = new THREE.Mesh( cubeGeometry1, cubeMaterial1 ); cube1.position.set(-150,25,0); cube1.castShadow = true; scene.add(cube1); var cubeGeometry2 = new THREE.CubeGeometry( 50, 50, 50 ); var cubeTexture2 = new THREE.ImageUtils.loadTexture( 'img/9.png' ); var cubeMaterial2 = new THREE.MeshBasicMaterial( { map: cubeTexture2 } ); var cube2 = new THREE.Mesh( cubeGeometry2, cubeMaterial2 ); cube2.position.set(150,25,0); cube2.castShadow = true; scene.add(cube2); var sphereGeometry = new THREE.SphereGeometry( 50, 32, 16 ); var sphereTexture = new THREE.ImageUtils.loadTexture( 'img/8.png' ); var sphereMaterial = new THREE.MeshBasicMaterial( { map: sphereTexture } ); var sphere = new THREE.Mesh(sphereGeometry, sphereMaterial); sphere.position.set(50, 50, -50); sphere.castShadow = true; scene.add(sphere); ///////////////////// // POST-PROCESSING // ///////////////////// // GUI setup gui = new dat.GUI(); parameters = { dotscreenAngle: 0.5, dotscreenScale: 0.8, useShaderNone: function() { setupShaderNone(); }, useShaderDotScreen: function() { setupShaderDotScreen(); } }; gui.add( parameters, 'useShaderNone' ).name("Display Original Scene"); var folderDotScreen = gui.addFolder('Dot Screen'); var dotScreenAngleGUI = folderDotScreen.add( parameters, 'dotscreenAngle' ).min(0).max(3.14).step(0.01).name("Angle").listen(); dotScreenAngleGUI.onChange( function(value) { setupShaderDotScreen(); } ); var dotScreenScaleGUI = folderDotScreen.add( parameters, 'dotscreenScale' ).min(0).max(2).step(0.01).name("Scale").listen(); dotScreenScaleGUI.onChange( function(value) { setupShaderDotScreen(); } ); folderDotScreen.add( parameters, 'useShaderDotScreen' ).name("Use DotScreen Shader"); folderDotScreen.open(); setupShaderNone(); } function setupShaderNone() { shaderActive = "none"; } function setupShaderDotScreen() { composer = new THREE.EffectComposer( renderer ); composer.addPass( new THREE.RenderPass( scene, camera ) ); var effectDotScreen = new THREE.DotScreenPass( new THREE.Vector2(0,0), parameters.dotscreenAngle, parameters.dotscreenScale ); effectDotScreen.renderToScreen = true; composer.addPass(effectDotScreen); shaderActive = "dotscreen"; } function animate() { requestAnimationFrame( animate ); render(); update(); } function update() { if ( keyboard.pressed("z") ) { // do something } controls.update(); stats.update(); } function render() { if ( shaderActive == "none" ) renderer.render( scene, camera ); else composer.render(); }

 

[DotScreenShader.js]

/** * @author alteredq / http://alteredqualia.com/ * * Dot screen shader * based on glfx.js sepia shader * https://github.com/evanw/glfx.js */ THREE.DotScreenShader = { uniforms: { "tDiffuse": { type: "t", value: null }, "tSize": { type: "v2", value: new THREE.Vector2( 256, 256 ) }, "center": { type: "v2", value: new THREE.Vector2( 0.5, 0.5 ) }, "angle": { type: "f", value: 1.57 }, "scale": { type: "f", value: 1.0 } }, vertexShader: [ "varying vec2 vUv;", "void main() {", "vUv = uv;", "gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );", "}" ].join("\n"), fragmentShader: [ "uniform vec2 center;", "uniform float angle;", "uniform float scale;", "uniform vec2 tSize;", "uniform sampler2D tDiffuse;", "varying vec2 vUv;", "float pattern() {", "float s = sin( angle ), c = cos( angle );", "vec2 tex = vUv * tSize - center;", "vec2 point = vec2( c * tex.x - s * tex.y, s * tex.x + c * tex.y ) * scale;", "return ( sin( point.x ) * sin( point.y ) ) * 4.0;", "}", "void main() {", "vec4 color = texture2D( tDiffuse, vUv );", "float average = ( color.r + color.g + color.b ) / 3.0;", "gl_FragColor = vec4( vec3( average * 10.0 - 5.0 + pattern() ), color.a );", "}" ].join("\n") };
 

 

 

=================================

=================================

=================================

 

 

 

반응형


관련글 더보기

댓글 영역