From 697641789e571aa50ddf5e24cfd95a02d1d07437 Mon Sep 17 00:00:00 2001 From: Jianqiao Date: Sat, 15 Nov 2014 01:04:11 -0500 Subject: [PATCH 01/23] diffuse and toon working --- assets/shader/deferred/diffuse.frag | 85 +++++++++++++++- assets/shader/deferred/post.frag | 20 +++- index.html | 2 +- js/core/camera.js | 5 +- js/core/fbo-util.js | 2 +- js/ext/Stats.js | 149 ++++++++++++++++++++++++++++ js/ext/stats.min.js | 6 ++ js/main.js | 109 ++++++++++++++++---- 8 files changed, 350 insertions(+), 28 deletions(-) create mode 100644 js/ext/Stats.js create mode 100644 js/ext/stats.min.js diff --git a/assets/shader/deferred/diffuse.frag b/assets/shader/deferred/diffuse.frag index ef0c5fc..af1befa 100644 --- a/assets/shader/deferred/diffuse.frag +++ b/assets/shader/deferred/diffuse.frag @@ -1,10 +1,15 @@ precision highp float; - +#define DISPLAY_DIFFUSE 5 +#define DISPLAY_TOON 6 +#define DISPLAY_BLOOM 7 +#define DISPLAY_SSAO 8 uniform sampler2D u_positionTex; uniform sampler2D u_normalTex; uniform sampler2D u_colorTex; uniform sampler2D u_depthTex; +uniform mat4 u_mvp; +uniform vec3 u_eye; uniform float u_zFar; uniform float u_zNear; uniform int u_displayType; @@ -12,12 +17,82 @@ uniform int u_displayType; varying vec2 v_texcoord; float linearizeDepth( float exp_depth, float near, float far ){ - return ( 2.0 * near ) / ( far + near - exp_depth * ( far - near ) ); + return ( 2.0 * near ) / ( far + near - exp_depth * ( far - near ) ); } + void main() { - // Write a diffuse shader and a Blinn-Phong shader - // NOTE : You may need to add your own normals to fulfill the second's requirements - gl_FragColor = vec4(texture2D(u_colorTex, v_texcoord).rgb, 1.0); + // Write a diffuse shader and a Blinn-Phong shader + // NOTE : You may need to add your own normals to fulfill the second's requirements + vec3 lightPos=vec3(u_mvp*vec4(2.0,3.0,6.0,1.0)); + vec3 lightCol=vec3(0.8,1.0,1.0); + vec3 normal=texture2D(u_normalTex,v_texcoord).xyz; + vec3 position=texture2D(u_positionTex,v_texcoord).xyz; + vec3 color=texture2D(u_colorTex,v_texcoord).rgb; + float depth=texture2D(u_depthTex,v_texcoord).x; + depth=linearizeDepth(depth,u_zNear,u_zFar); + vec3 L=normalize(lightPos-position); + vec3 N=normalize(normal); + vec3 V=normalize(u_eye-position); + vec3 H=normalize(V+L); + float diffuse=clamp(dot(N,L),0.0,1.0); + float specular=pow(max(dot(N,H),0.0),10.0); + if (u_displayType==DISPLAY_DIFFUSE||u_displayType==DISPLAY_BLOOM) { + + vec3 final_color=0.6*lightCol*diffuse*color+0.4*lightCol*specular; + + if(depth<0.99) + { + gl_FragColor = vec4(final_color, 1.0); + } + else + { + //background color + gl_FragColor=vec4(0.8,0.8,0.8,1.0); + } + } + else if(u_displayType==DISPLAY_TOON)//reference:http://www.lighthouse3d.com/tutorials/glsl-tutorial/toon-shader-version-ii/ + { + float intensity=dot(L,N); + vec4 color; + if (depth<0.99) { + if (intensity>0.8) { + color=vec4(0.6,0.8,0.6,1.0); + } else if(intensity>0.6) { + color=vec4(0.5,0.7,0.5,1.0); + } else if(intensity>0.4) + { + color=vec4(0.4,0.6,0.4,1.0); + }else if(intensity>0.2) + { + color=vec4(0.3,0.5,0.3,1.0); + } + else + { + color=vec4(0.2,0.4,0.2,1.0); + } + + } else { + //background color + color=vec4(0.8,0.8,0.8,1.0); + } + //edge + float c=0.002; + float threshold=0.999; + for (int i=-2; i<=2; i++) { + for (int j=-2;j<=2;j++) { + float depthdiff=texture2D(u_depthTex,v_texcoord+vec2(float(i)*c,float(j)*c)).x; + if (depthdiff>threshold) { + color=vec4(0.0,0.0,0.0,1.0); + break; + } + } + } + if(depth>0.9) + { + color=vec4(0.8,0.8,0.8,1.0); + } + gl_FragColor=color; + } } diff --git a/assets/shader/deferred/post.frag b/assets/shader/deferred/post.frag index 52edda2..75ba666 100644 --- a/assets/shader/deferred/post.frag +++ b/assets/shader/deferred/post.frag @@ -1,9 +1,12 @@ precision highp float; - +#define DISPLAY_DIFFUSE 5 +#define DISPLAY_TOON 6 +#define DISPLAY_BLOOM 7 +#define DISPLAY_SSAO 8 uniform sampler2D u_shadeTex; varying vec2 v_texcoord; - +uniform int u_displayType; float linearizeDepth( float exp_depth, float near, float far ){ return ( 2.0 * near ) / ( far + near - exp_depth * ( far - near ) ); } @@ -13,5 +16,16 @@ void main() // Currently acts as a pass filter that immmediately renders the shaded texture // Fill in post-processing as necessary HERE // NOTE : You may choose to use a key-controlled switch system to display one feature at a time - gl_FragColor = vec4(texture2D( u_shadeTex, v_texcoord).rgb, 1.0); + if (u_displayType==DISPLAY_DIFFUSE||u_displayType==DISPLAY_TOON) { + gl_FragColor = vec4(texture2D(u_shadeTex, v_texcoord).rgb, 1.0); + } + else if(u_displayType==DISPLAY_BLOOM) + { + + } + gl_FragColor = vec4(texture2D(u_shadeTex, v_texcoord).rgb, 1.0); + + + + } diff --git a/index.html b/index.html index dd0ffef..bc8f2fe 100644 --- a/index.html +++ b/index.html @@ -14,7 +14,7 @@ - + diff --git a/js/core/camera.js b/js/core/camera.js index 11a995d..f793036 100644 --- a/js/core/camera.js +++ b/js/core/camera.js @@ -132,6 +132,9 @@ CIS565WEBGLCORE.createCamera = function(t){ mat4.invert( m, matrix ); return m; }; + getPos=function(){ + return position; + }; moveForward = function(){ vec3.scaleAndAdd( position, position, normal, -1.1 ); @@ -180,6 +183,6 @@ CIS565WEBGLCORE.createCamera = function(t){ newObj.moveRight = moveRight; newObj.moveUp = moveUp; newObj.moveDown = moveDown; - + newObj.getPos=getPos; return newObj; }; diff --git a/js/core/fbo-util.js b/js/core/fbo-util.js index 32f745a..fe9afbf 100644 --- a/js/core/fbo-util.js +++ b/js/core/fbo-util.js @@ -18,7 +18,7 @@ CIS565WEBGLCORE.createFBO = function(){ var depthTex = null; var fbo = []; - var multipleTargets = true; + var multipleTargets = false; function init( gl, width, height ){ gl.getExtension( "OES_texture_float" ); diff --git a/js/ext/Stats.js b/js/ext/Stats.js new file mode 100644 index 0000000..90b2a27 --- /dev/null +++ b/js/ext/Stats.js @@ -0,0 +1,149 @@ +/** + * @author mrdoob / http://mrdoob.com/ + */ + +var Stats = function () { + + var startTime = Date.now(), prevTime = startTime; + var ms = 0, msMin = Infinity, msMax = 0; + var fps = 0, fpsMin = Infinity, fpsMax = 0; + var frames = 0, mode = 0; + + var container = document.createElement( 'div' ); + container.id = 'stats'; + container.addEventListener( 'mousedown', function ( event ) { event.preventDefault(); setMode( ++ mode % 2 ) }, false ); + container.style.cssText = 'width:80px;opacity:0.9;cursor:pointer'; + + var fpsDiv = document.createElement( 'div' ); + fpsDiv.id = 'fps'; + fpsDiv.style.cssText = 'padding:0 0 3px 3px;text-align:left;background-color:#002'; + container.appendChild( fpsDiv ); + + var fpsText = document.createElement( 'div' ); + fpsText.id = 'fpsText'; + fpsText.style.cssText = 'color:#0ff;font-family:Helvetica,Arial,sans-serif;font-size:9px;font-weight:bold;line-height:15px'; + fpsText.innerHTML = 'FPS'; + fpsDiv.appendChild( fpsText ); + + var fpsGraph = document.createElement( 'div' ); + fpsGraph.id = 'fpsGraph'; + fpsGraph.style.cssText = 'position:relative;width:74px;height:30px;background-color:#0ff'; + fpsDiv.appendChild( fpsGraph ); + + while ( fpsGraph.children.length < 74 ) { + + var bar = document.createElement( 'span' ); + bar.style.cssText = 'width:1px;height:30px;float:left;background-color:#113'; + fpsGraph.appendChild( bar ); + + } + + var msDiv = document.createElement( 'div' ); + msDiv.id = 'ms'; + msDiv.style.cssText = 'padding:0 0 3px 3px;text-align:left;background-color:#020;display:none'; + container.appendChild( msDiv ); + + var msText = document.createElement( 'div' ); + msText.id = 'msText'; + msText.style.cssText = 'color:#0f0;font-family:Helvetica,Arial,sans-serif;font-size:9px;font-weight:bold;line-height:15px'; + msText.innerHTML = 'MS'; + msDiv.appendChild( msText ); + + var msGraph = document.createElement( 'div' ); + msGraph.id = 'msGraph'; + msGraph.style.cssText = 'position:relative;width:74px;height:30px;background-color:#0f0'; + msDiv.appendChild( msGraph ); + + while ( msGraph.children.length < 74 ) { + + var bar = document.createElement( 'span' ); + bar.style.cssText = 'width:1px;height:30px;float:left;background-color:#131'; + msGraph.appendChild( bar ); + + } + + var setMode = function ( value ) { + + mode = value; + + switch ( mode ) { + + case 0: + fpsDiv.style.display = 'block'; + msDiv.style.display = 'none'; + break; + case 1: + fpsDiv.style.display = 'none'; + msDiv.style.display = 'block'; + break; + } + + }; + + var updateGraph = function ( dom, value ) { + + var child = dom.appendChild( dom.firstChild ); + child.style.height = value + 'px'; + + }; + + return { + + REVISION: 12, + + domElement: container, + + setMode: setMode, + + begin: function () { + + startTime = Date.now(); + + }, + + end: function () { + + var time = Date.now(); + + ms = time - startTime; + msMin = Math.min( msMin, ms ); + msMax = Math.max( msMax, ms ); + + msText.textContent = ms + ' MS (' + msMin + '-' + msMax + ')'; + updateGraph( msGraph, Math.min( 30, 30 - ( ms / 200 ) * 30 ) ); + + frames ++; + + if ( time > prevTime + 1000 ) { + + fps = Math.round( ( frames * 1000 ) / ( time - prevTime ) ); + fpsMin = Math.min( fpsMin, fps ); + fpsMax = Math.max( fpsMax, fps ); + + fpsText.textContent = fps + ' FPS (' + fpsMin + '-' + fpsMax + ')'; + updateGraph( fpsGraph, Math.min( 30, 30 - ( fps / 100 ) * 30 ) ); + + prevTime = time; + frames = 0; + + } + + return time; + + }, + + update: function () { + + startTime = this.end(); + + } + + } + +}; + +if ( typeof module === 'object' ) { + + module.exports = Stats; + +} \ No newline at end of file diff --git a/js/ext/stats.min.js b/js/ext/stats.min.js new file mode 100644 index 0000000..52539f4 --- /dev/null +++ b/js/ext/stats.min.js @@ -0,0 +1,6 @@ +// stats.js - http://github.com/mrdoob/stats.js +var Stats=function(){var l=Date.now(),m=l,g=0,n=Infinity,o=0,h=0,p=Infinity,q=0,r=0,s=0,f=document.createElement("div");f.id="stats";f.addEventListener("mousedown",function(b){b.preventDefault();t(++s%2)},!1);f.style.cssText="width:80px;opacity:0.9;cursor:pointer";var a=document.createElement("div");a.id="fps";a.style.cssText="padding:0 0 3px 3px;text-align:left;background-color:#002";f.appendChild(a);var i=document.createElement("div");i.id="fpsText";i.style.cssText="color:#0ff;font-family:Helvetica,Arial,sans-serif;font-size:9px;font-weight:bold;line-height:15px"; +i.innerHTML="FPS";a.appendChild(i);var c=document.createElement("div");c.id="fpsGraph";c.style.cssText="position:relative;width:74px;height:30px;background-color:#0ff";for(a.appendChild(c);74>c.children.length;){var j=document.createElement("span");j.style.cssText="width:1px;height:30px;float:left;background-color:#113";c.appendChild(j)}var d=document.createElement("div");d.id="ms";d.style.cssText="padding:0 0 3px 3px;text-align:left;background-color:#020;display:none";f.appendChild(d);var k=document.createElement("div"); +k.id="msText";k.style.cssText="color:#0f0;font-family:Helvetica,Arial,sans-serif;font-size:9px;font-weight:bold;line-height:15px";k.innerHTML="MS";d.appendChild(k);var e=document.createElement("div");e.id="msGraph";e.style.cssText="position:relative;width:74px;height:30px;background-color:#0f0";for(d.appendChild(e);74>e.children.length;)j=document.createElement("span"),j.style.cssText="width:1px;height:30px;float:left;background-color:#131",e.appendChild(j);var t=function(b){s=b;switch(s){case 0:a.style.display= +"block";d.style.display="none";break;case 1:a.style.display="none",d.style.display="block"}};return{REVISION:12,domElement:f,setMode:t,begin:function(){l=Date.now()},end:function(){var b=Date.now();g=b-l;n=Math.min(n,g);o=Math.max(o,g);k.textContent=g+" MS ("+n+"-"+o+")";var a=Math.min(30,30-30*(g/200));e.appendChild(e.firstChild).style.height=a+"px";r++;b>m+1E3&&(h=Math.round(1E3*r/(b-m)),p=Math.min(p,h),q=Math.max(q,h),i.textContent=h+" FPS ("+p+"-"+q+")",a=Math.min(30,30-30*(h/100)),c.appendChild(c.firstChild).style.height= +a+"px",m=b,r=0);return b},update:function(){l=this.end()}}};"object"===typeof module&&(module.exports=Stats); diff --git a/js/main.js b/js/main.js index bf701d9..5143dd9 100644 --- a/js/main.js +++ b/js/main.js @@ -32,9 +32,11 @@ var zNear = 20; var zFar = 2000; var texToDisplay = 1; + + var main = function (canvasId, messageId) { var canvas; - + stats=initStats(); // Initialize WebGL initGL(canvasId, messageId); @@ -57,6 +59,20 @@ var main = function (canvasId, messageId) { // Start the rendering loop CIS565WEBGLCORE.run(gl); }; +function initStats() { + stats = new Stats(); + stats.setMode(0); // 0: fps, 1: ms + + // Align top-left + stats.domElement.style.position = 'absolute'; + stats.domElement.style.left = '0px'; + stats.domElement.style.bottom = '0px'; + + document.body.appendChild(stats.domElement); + + + return stats; +} var renderLoop = function () { window.requestAnimationFrame(renderLoop); @@ -64,6 +80,10 @@ var renderLoop = function () { }; var render = function () { + if(stats) + { + stats.update(); + } if (fbo.isMultipleTargets()) { renderPass(); } else { @@ -217,26 +237,29 @@ var renderShade = function () { gl.clear(gl.COLOR_BUFFER_BIT); // Bind necessary textures - //gl.activeTexture( gl.TEXTURE0 ); //position - //gl.bindTexture( gl.TEXTURE_2D, fbo.texture(0) ); - //gl.uniform1i( shadeProg.uPosSamplerLoc, 0 ); + gl.activeTexture( gl.TEXTURE0 ); //position + gl.bindTexture( gl.TEXTURE_2D, fbo.texture(0) ); + gl.uniform1i( shadeProg.uPosSamplerLoc, 0 ); - //gl.activeTexture( gl.TEXTURE1 ); //normal - //gl.bindTexture( gl.TEXTURE_2D, fbo.texture(1) ); - //gl.uniform1i( shadeProg.uNormalSamplerLoc, 1 ); + gl.activeTexture( gl.TEXTURE1 ); //normal + gl.bindTexture( gl.TEXTURE_2D, fbo.texture(1) ); + gl.uniform1i( shadeProg.uNormalSamplerLoc, 1 ); gl.activeTexture( gl.TEXTURE2 ); //color gl.bindTexture( gl.TEXTURE_2D, fbo.texture(2) ); gl.uniform1i( shadeProg.uColorSamplerLoc, 2 ); - //gl.activeTexture( gl.TEXTURE3 ); //depth - //gl.bindTexture( gl.TEXTURE_2D, fbo.depthTexture() ); - //gl.uniform1i( shadeProg.uDepthSamplerLoc, 3 ); + gl.activeTexture( gl.TEXTURE3 ); //depth + gl.bindTexture( gl.TEXTURE_2D, fbo.depthTexture() ); + gl.uniform1i( shadeProg.uDepthSamplerLoc, 3 ); // Bind necessary uniforms - //gl.uniform1f( shadeProg.uZNearLoc, zNear ); - //gl.uniform1f( shadeProg.uZFarLoc, zFar ); - + gl.uniform1f( shadeProg.uZNearLoc, zNear ); + gl.uniform1f( shadeProg.uZFarLoc, zFar ); + //new + gl.uniform1i(shadeProg.uDisplayTypeLoc,texToDisplay); + gl.uniform3fv(shadeProg.uEyeLoc,camera.getPos()); + gl.uniformMatrix4fv(shadeProg.uMVPLoc, false, camera.getViewTransform()); drawQuad(shadeProg); // Unbind FBO @@ -269,8 +292,8 @@ var renderDiagnostic = function () { // Bind necessary uniforms gl.uniform1f( diagProg.uZNearLoc, zNear ); gl.uniform1f( diagProg.uZFarLoc, zFar ); - gl.uniform1i( diagProg.uDisplayTypeLoc, texToDisplay ); - + gl.uniform1i( diagProg.uDisplayTypeLoc, texToDisplay ); + drawQuad(diagProg); }; @@ -285,6 +308,30 @@ var renderPost = function () { gl.bindTexture( gl.TEXTURE_2D, fbo.texture(4) ); gl.uniform1i(postProg.uShadeSamplerLoc, 4 ); + //new + // Bind necessary textures + gl.activeTexture( gl.TEXTURE0 ); //position + gl.bindTexture( gl.TEXTURE_2D, fbo.texture(0) ); + gl.uniform1i( postProg.uPosSamplerLoc, 0 ); + + gl.activeTexture( gl.TEXTURE1 ); //normal + gl.bindTexture( gl.TEXTURE_2D, fbo.texture(1) ); + gl.uniform1i( postProg.uNormalSamplerLoc, 1 ); + + gl.activeTexture( gl.TEXTURE2 ); //color + gl.bindTexture( gl.TEXTURE_2D, fbo.texture(2) ); + gl.uniform1i( postProg.uColorSamplerLoc, 2 ); + + gl.activeTexture( gl.TEXTURE3 ); //depth + gl.bindTexture( gl.TEXTURE_2D, fbo.depthTexture() ); + gl.uniform1i( postProg.uDepthSamplerLoc, 3 ); + + // Bind necessary uniforms + gl.uniform1f( postProg.uZNearLoc, zNear ); + gl.uniform1f( postProg.uZFarLoc, zFar ); + gl.uniform1i( postProg.uDisplayTypeLoc, texToDisplay ); + + drawQuad(postProg); }; @@ -322,6 +369,7 @@ var initCamera = function () { switch(e.keyCode) { case 48: isDiagnostic = false; + texToDisplay=5; break; case 49: isDiagnostic = true; @@ -339,6 +387,22 @@ var initCamera = function () { isDiagnostic = true; texToDisplay = 4; break; + case 53://blinn-phong + isDiagnostic=false; + texToDisplay=5; + break; + case 54://toon + isDiagnostic=false; + texToDisplay=6; + break; + case 55://bloom + isDiagnostic=false; + texToDisplay=7; + break; + case 56://SSAO + isDiagnostic=false; + texToDisplay=8; + break; } } }; @@ -348,7 +412,7 @@ var initObjs = function () { objloader = CIS565WEBGLCORE.createOBJLoader(); // Load the OBJ from file - objloader.loadFromFile(gl, "assets/models/crytek-sponza/sponza.obj", null); + objloader.loadFromFile(gl, "assets/models/suzanne.obj", null); // Add callback to upload the vertices once loaded objloader.addCallback(function () { @@ -468,6 +532,9 @@ var initShaders = function () { shadeProg.uZNearLoc = gl.getUniformLocation( shadeProg.ref(), "u_zNear" ); shadeProg.uZFarLoc = gl.getUniformLocation( shadeProg.ref(), "u_zFar" ); shadeProg.uDisplayTypeLoc = gl.getUniformLocation( shadeProg.ref(), "u_displayType" ); + shadeProg.uMVPLoc = gl.getUniformLocation(shadeProg.ref(), "u_mvp"); + shadeProg.uEyeLoc=gl.getUniformLocation(shadeProg.ref(),"u_eye"); + }); CIS565WEBGLCORE.registerAsyncObj(gl, shadeProg); @@ -477,8 +544,16 @@ var initShaders = function () { postProg.addCallback( function() { postProg.aVertexPosLoc = gl.getAttribLocation( postProg.ref(), "a_pos" ); postProg.aVertexTexcoordLoc = gl.getAttribLocation( postProg.ref(), "a_texcoord" ); - postProg.uShadeSamplerLoc = gl.getUniformLocation( postProg.ref(), "u_shadeTex"); + postProg.uDisplayTypeLoc=gl.getUniformLocation(postProg.ref(),"u_displayType"); + postProg.uPosSamplerLoc = gl.getUniformLocation( postProg.ref(), "u_positionTex"); + postProg.uNormalSamplerLoc = gl.getUniformLocation( postProg.ref(), "u_normalTex"); + postProg.uColorSamplerLoc = gl.getUniformLocation( postProg.ref(), "u_colorTex"); + postProg.uDepthSamplerLoc = gl.getUniformLocation( postProg.ref(), "u_depthTex"); + postProg.uZNearLoc = gl.getUniformLocation( postProg.ref(), "u_zNear" ); + postProg.uZFarLoc = gl.getUniformLocation( postProg.ref(), "u_zFar" ); + + }); CIS565WEBGLCORE.registerAsyncObj(gl, postProg); }; From 2a292cb5056d9858f3937e31272c0ca35c1eb715 Mon Sep 17 00:00:00 2001 From: Jianqiao Date: Sat, 15 Nov 2014 01:35:40 -0500 Subject: [PATCH 02/23] add picture --- Toon.png | Bin 0 -> 19237 bytes assets/shader/deferred/post.frag | 10 +++++++++- diffuse_blinn-phong.png | Bin 0 -> 39973 bytes 3 files changed, 9 insertions(+), 1 deletion(-) create mode 100644 Toon.png create mode 100644 diffuse_blinn-phong.png diff --git a/Toon.png b/Toon.png new file mode 100644 index 0000000000000000000000000000000000000000..3e8c53a368161cd51a049061a5f73cc9600a2a7f GIT binary patch literal 19237 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 literal 0 HcmV?d00001 From 94bd8efaf640fc0cff08541f406532a6575719af Mon Sep 17 00:00:00 2001 From: jianqiaol Date: Sat, 15 Nov 2014 01:37:37 -0500 Subject: [PATCH 03/23] Update README.md --- README.md | 37 ++++--------------------------------- 1 file changed, 4 insertions(+), 33 deletions(-) diff --git a/README.md b/README.md index da4c7e1..a95846c 100644 --- a/README.md +++ b/README.md @@ -2,39 +2,8 @@ CIS565: Project 6 -- Deferred Shader ------------------------------------------------------------------------------- Fall 2014 -------------------------------------------------------------------------------- -Due Wed, 11/12/2014 at Noon -------------------------------------------------------------------------------- - -------------------------------------------------------------------------------- -NOTE: -------------------------------------------------------------------------------- -This project requires any graphics card with support for a modern OpenGL -pipeline. Any AMD, NVIDIA, or Intel card from the past few years should work -fine, and every machine in the SIG Lab and Moore 100 is capable of running -this project. - -This project also requires a WebGL capable browser. The project is known to -have issues with Chrome on windows, but Firefox seems to run it fine. - -------------------------------------------------------------------------------- -INTRODUCTION: -------------------------------------------------------------------------------- - -In this project, you will get introduced to the basics of deferred shading. You will write GLSL and OpenGL code to perform various tasks in a deferred lighting pipeline such as creating and writing to a G-Buffer. - -------------------------------------------------------------------------------- -CONTENTS: -------------------------------------------------------------------------------- -The Project5 root directory contains the following subdirectories: - -* js/ contains the javascript files, including external libraries, necessary. -* assets/ contains the textures that will be used in the second half of the - assignment. -* resources/ contains the screenshots found in this readme file. - - This Readme file edited as described above in the README section. - +Diffuse & Blinn-Phong lighting +![](diffuse_blinn-phong.png) ------------------------------------------------------------------------------- OVERVIEW: ------------------------------------------------------------------------------- @@ -69,6 +38,8 @@ WASDRF - Movement (along w the arrow keys) * 2 - Normals * 3 - Color * 4 - Depth +* 5 - Diffuse&Blinn-Phong +* 6 - Toon shading * 0 - Full deferred pipeline There are also mouse controls for camera rotation. From de06ab2319e61b3a26e2f4c5f1c6193926db2c77 Mon Sep 17 00:00:00 2001 From: jianqiaol Date: Sat, 15 Nov 2014 01:38:26 -0500 Subject: [PATCH 04/23] Update README.md --- README.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index a95846c..339a646 100644 --- a/README.md +++ b/README.md @@ -1,9 +1,11 @@ ------------------------------------------------------------------------------ CIS565: Project 6 -- Deferred Shader ------------------------------------------------------------------------------- -Fall 2014 Diffuse & Blinn-Phong lighting ![](diffuse_blinn-phong.png) + +Toon Shading +![](toon.png) ------------------------------------------------------------------------------- OVERVIEW: ------------------------------------------------------------------------------- From ec1accfa4932a829b2e4858ddf6de4ec7a1e4109 Mon Sep 17 00:00:00 2001 From: jianqiaol Date: Sat, 15 Nov 2014 01:38:39 -0500 Subject: [PATCH 05/23] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 339a646..3fa205b 100644 --- a/README.md +++ b/README.md @@ -5,7 +5,7 @@ Diffuse & Blinn-Phong lighting ![](diffuse_blinn-phong.png) Toon Shading -![](toon.png) +![](Toon.png) ------------------------------------------------------------------------------- OVERVIEW: ------------------------------------------------------------------------------- From 239d2a205390691c343540a0d491ff2f5964eaf5 Mon Sep 17 00:00:00 2001 From: jianqiaol Date: Sat, 15 Nov 2014 01:38:54 -0500 Subject: [PATCH 06/23] Update README.md --- README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/README.md b/README.md index 3fa205b..e4f90b4 100644 --- a/README.md +++ b/README.md @@ -2,9 +2,11 @@ CIS565: Project 6 -- Deferred Shader ------------------------------------------------------------------------------- Diffuse & Blinn-Phong lighting + ![](diffuse_blinn-phong.png) Toon Shading + ![](Toon.png) ------------------------------------------------------------------------------- OVERVIEW: From eb7c2325908301977a888e38945177596af0da07 Mon Sep 17 00:00:00 2001 From: jianqiaol Date: Sat, 15 Nov 2014 01:39:43 -0500 Subject: [PATCH 07/23] Update README.md --- README.md | 28 ---------------------------- 1 file changed, 28 deletions(-) diff --git a/README.md b/README.md index e4f90b4..d82d5d8 100644 --- a/README.md +++ b/README.md @@ -76,34 +76,6 @@ You must implement two of the following extras: * Must be accompanied with a performance analysis to count * Additional lighting and pre/post processing effects! (email first please, if they are good you may add multiple). -------------------------------------------------------------------------------- -RUNNING THE CODE: -------------------------------------------------------------------------------- - -Since the code attempts to access files that are local to your computer, you -will either need to: - -* Run your browser under modified security settings, or -* Create a simple local server that serves the files - - -FIREFOX: change ``strict_origin_policy`` to false in about:config - -CHROME: run with the following argument : `--allow-file-access-from-files` - -(You can do this on OSX by running Chrome from /Applications/Google -Chrome/Contents/MacOS with `open -a "Google Chrome" --args ---allow-file-access-from-files`) - -* To check if you have set the flag properly, you can open chrome://version and - check under the flags - -RUNNING A SIMPLE SERVER: - -If you have Python installed, you can simply run a simple HTTP server off your -machine from the root directory of this repository with the following command: - -`python -m SimpleHTTPServer` ------------------------------------------------------------------------------- RESOURCES: From 3c58dab58aa90e390d55a2afc6aad803b184ca64 Mon Sep 17 00:00:00 2001 From: Jianqiao Date: Sat, 15 Nov 2014 02:09:17 -0500 Subject: [PATCH 08/23] add bloom --- Bloom.png | Bin 0 -> 53423 bytes assets/shader/deferred/post.frag | 39 +++++++++++++++++++++++++++---- 2 files changed, 34 insertions(+), 5 deletions(-) create mode 100644 Bloom.png diff --git a/Bloom.png b/Bloom.png new file mode 100644 index 0000000000000000000000000000000000000000..8b067316bd8df7dd1a812cf0b3c6e84ead4ba74f GIT binary patch literal 53423 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 literal 0 HcmV?d00001 diff --git a/assets/shader/deferred/post.frag b/assets/shader/deferred/post.frag index ee89b78..258b161 100644 --- a/assets/shader/deferred/post.frag +++ b/assets/shader/deferred/post.frag @@ -1,9 +1,10 @@ precision highp float; -#define DISPLAY_DIFFUSE 5 -#define DISPLAY_TOON 6 -#define DISPLAY_BLOOM 7 -#define DISPLAY_SSAO 8 +#define DISPLAY_DIFFUSE 5 +#define DISPLAY_TOON 6 +#define DISPLAY_BLOOM 7 +#define DISPLAY_SSAO 8 +#define KernelSize 11 uniform sampler2D u_shadeTex; uniform sampler2D u_positionTex; uniform sampler2D u_normalTex; @@ -19,6 +20,33 @@ float linearizeDepth( float exp_depth, float near, float far ){ return ( 2.0 * near ) / ( far + near - exp_depth * ( far - near ) ); } +//SSAO +float rand(float co){ + return fract(sin(dot(vec2(co,co) ,vec2(12.9898,78.233))) * 43758.5453); +} + +float Gblur(int x,int y,int n) { + float sigma = 1.0; + float fx = float(x) - (float(n) - 1.0) / 2.0; + float fy = float(y) - (float(n) - 1.0) / 2.0; + return (exp(-abs(fx*fy)/ (2.0*sigma*sigma)))/ (2.0 * 3.1415926 *sigma*sigma); +} + +vec4 bloom() { + float offset=0.001; + vec3 color=vec3(0.0,0.0,0.0); + for (int i=0; i<=KernelSize; i++) { + for (int j=0;j<=KernelSize;j++) { + vec2 temp=v_texcoord; + temp.x=temp.x+(float(i)-float(KernelSize)/2.0+0.5)*offset; + temp.y=temp.y+(float(j)-float(KernelSize)/2.0+0.5)*offset; + color=color+Gblur(i,j,KernelSize)*texture2D(u_shadeTex,temp).rgb; + } + } + return vec4(color,1.0); +} + + void main() { // Currently acts as a pass filter that immmediately renders the shaded texture @@ -29,9 +57,10 @@ void main() } else if(u_displayType==DISPLAY_BLOOM) { + gl_FragColor=bloom(); } - gl_FragColor = vec4(texture2D(u_shadeTex, v_texcoord).rgb, 1.0); + //gl_FragColor = vec4(texture2D(u_shadeTex, v_texcoord).rgb, 1.0); From 8db7510190166e1889db0ea484d1c08f8e5cf52b Mon Sep 17 00:00:00 2001 From: jianqiaol Date: Sat, 15 Nov 2014 02:09:40 -0500 Subject: [PATCH 09/23] Update README.md --- README.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/README.md b/README.md index d82d5d8..12711ea 100644 --- a/README.md +++ b/README.md @@ -8,6 +8,10 @@ Diffuse & Blinn-Phong lighting Toon Shading ![](Toon.png) + +Bloom + +![](Bloom.png) ------------------------------------------------------------------------------- OVERVIEW: ------------------------------------------------------------------------------- From d2015b50569b9d5b0931cc398c6a94db9616c3cf Mon Sep 17 00:00:00 2001 From: jianqiaol Date: Sat, 15 Nov 2014 02:10:47 -0500 Subject: [PATCH 10/23] Update README.md --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index 12711ea..24fc109 100644 --- a/README.md +++ b/README.md @@ -48,6 +48,7 @@ WASDRF - Movement (along w the arrow keys) * 4 - Depth * 5 - Diffuse&Blinn-Phong * 6 - Toon shading +* 7 - Bloom shading * 0 - Full deferred pipeline There are also mouse controls for camera rotation. From 0baf793a4a112fbbb15dd35ac56cfd266ef7d338 Mon Sep 17 00:00:00 2001 From: Jianqiao Date: Sat, 15 Nov 2014 04:02:30 -0500 Subject: [PATCH 11/23] add SSAO --- SSAO.png | Bin 0 -> 57078 bytes assets/shader/deferred/post.frag | 42 +++++++++++++++++++++++++++---- js/main.js | 14 ++++++++++- 3 files changed, 50 insertions(+), 6 deletions(-) create mode 100644 SSAO.png diff --git a/SSAO.png b/SSAO.png new file mode 100644 index 0000000000000000000000000000000000000000..1dec625634bb64153aa503338952ba32bf83eace GIT binary patch literal 57078 zcmeFYWpJD^lP)@DW_HZXV|L6uW_HZX%*+&1%rQHrn3SP%OM28TsRiAVA{6B%kl^v*0RRA!l%$w4005Tp`L}@u|BOkp4Mqk4a8)fuMHQt) zMM)H$?9D7~OaTB5xC%{o4a|w3mn$n`lS)p>B-}st3B+qj7`VeI!^0{5DuN|ZM3RIX z0U%W=O2W~_AkmbBFfqj_!YRbXFe`ET9^1Sx-`jk%(tMj*TMsKvPfsfK0F5&Vy?wzf zQGk#TP`qvQJ>;)nx{$E;0HkgRHzAl1Nxk@;R!&ar?T=RoBLCH>Dj+J|q@;JoJz!7^oLpLp~D}4Ss*a zct%2AZC}8(6#&&zilUYna0ji(gt~VCb207R$9brD6`;7xh`p<;_fA2xXBWaVOG;{p z`ATF2H}z4y_eh*7_UG05r`VsDAO3&Ay?bH4K#GOJ{6w~Sd-`bq4k^*+Ve1RIlew5} zV}#J9X}BI4)H_a_ioJW5o29mh$|mZ=1@OB2^7t%~u`DV(Lwp-KA665xhZqOkq=0Y^ z_XKn+O2Dj~y$>2uu!?Cv<8}nlsI+Y@2NIaQtO-ytvoA*`5KkjhZEg+Sp-kRHu&+ZL z#6eI^b9E168huquEpvQ#i$N95N*zoEz|e=EklMu}u8Qsm)yxqeRVl>VpTy8Imyt>!11Wf7xL%_7bO>8NQko+ao@42r*?al++tVU9Baji?XfWg^Aa=Jtp5 z9(}0>Ja+?N11vl|gP2ia!M%>~54WrI89@P%!`&!PfV8ayL4JZJEs-5xlyHb_A)5J! z*EI$EvIUrap}$jIv--ZK0at3)<7%-a*I)vqkYmvs-xvC|y4#T3F{`aK?gif*zz;9(3sI25aA{ z{j;X>7=ZbQ7}}pvJBY>NLS5CzpkJhCoS3j2*Q6q9q0dVAJ&re-a16<$T6!8ox194% z4o~_+EVh^D8QA1+{FnOD|Bj{{>b-Ah%gIa1>tKt4@52L1;*SEwdr^|VHh2KnJnKhx z`ms_y_JtU6j_$E;Js4~bqXqeDFsI73{Uk_x=H}&veXSxKT9_F8{doA>=)~~b)9qPR z6$MQ$b50c4_ylCCnOCELHi$!n7GH$|+P__HW)ez`I09P@7?uAsK@>0>#3~^3mX7mtYw~{CX*NzQl(PE2xs-qv?j{_G20e)C76N zE-U;Zt5ji8j!?E#)Ku|QAvoDcWQNte2R8D z#m>$y!hXu$W(jVQU@4Stx?n^>EDF_u^vSe9D}UQwvs zG9fnknCuzL9oy-1jLJ*T%QjAO{!)ZogksKPj&uY#a%Tc#60Ibuw5f!yRI+1eqIk5s zd|Mw_CtP=4(`d4^yIoE0yf|!B=ffqEBGS$Z=EL#y@=){m>k;kQ=ZWC4=5h42{MY3P z{O_Nq%bSVoy6dZ5ln=Xx6*HBs^Y5rsy|f2 z<~0^<=2;hrO7`aO=P?$pN~=QXAiXAo!0r+;nIcFvibuS~)*k}@W!l`JkZ z1?m#DOQDO>k(cjPIBS|qySLfpTyku9@^kao>Sb=0c80!_zP&&f2i6F; z3RjWV<#z07_HltkKz^Vk(2v2PjBVL*xmvkUSx>nR*)chs3DpVYw1$ki^eYxY z>-R~K*&rLoHFRT3vovdNBT6eQs|5q3a=8lU3JKeOTQZx=^TDge72W2S;EHzJcH1MO zWd2KUx(AFKkaH zuM_Xghv(ypz04#2y}W~;du#_~2N`?37exmtXIy(#7ui>WI61@)oCdVh6x9?C9K$@v z($i+u#tw3@EdAv9w29p8H1+&ZKnBip&1O{(ttX8TP=86dcrEu|Ckpfv>=oPrc&;h_ z8T6UYm1O8Vk~ZpZ;T??E>AfBv1>Jl9<$QUb@0Rg?uth_WL1{t>PCjQ7(#+GB)9%vp zsMUK-zUcVZ$UC~i*-L>&9&f>p^po*Z7WGlv;{4J4Sq^u@Si@>3Wvo(0fzJAq&9Ar8 z$4ND1jp}P--^Rx1J?P}sjOg;{%`02<&dOMet;&;2m?{jbMw*c;CG@j9b{vhb3;#|m zYBj8$YX5GEJk>azJ&S*axc`Clj$|A?89kLgo~~tYy;<2-w>O#87UYhQv68N^nb(=( zWnV{GX?o!I^wt97heD;bp{?J<-OypNwXwNoxOsD&JJZ)FzcHCCp%r`SX6eGgujaiz zT`{Y>mA9_)DE3!Mw@TXnO=Y1d+V|AADf`05txCV`qsKY;2t_}&^O&d_--FXa@X2Y| z)#AM1aqMJgd#6C1rD{>1I(i#4D}g6*yLH{(a_#oAmd=t?bLbd+ljZKc*^zaf{`4g9 z=Ph<*9>sP<}2>Iqc771#$3^F&xpU;2s{Yl-Vzs zI2fPO$*%HIdY)}Hs{3^l zW^=P=FsD4xS_*gyn7&{8oc0PLSZ2qJ6J-i;CJAKTusH8LEn#G6&aV(~8@14R78d#Z zVN=-Rxh*xQQ!JMJASiiK97((7l5S&a?`U?4IAwjrDk;N1D8!0M(p%~+MOH29j+$sw za;YnCJXo~Y(1K9Ov-tVPHj@|RE|(sCc~W1zmExVVZZ(HJoi!i-SY2LssHCgjx2L_a zz;CJm?=_b_cn`(re9q;;^buqZ5M&no`qky};QJ1F)vNxOXxM0*n3#4;uM9zK4!ak5 zyCB2extFYw1e8D(c$Km_B({Cch?NxLpGRUxJOZ9RTG>EdX5FWDjarkMJL8sTwiAS* zl+7e^{e{k$a-OOO-@5k)AI59miO0)(dcjD4HCw)o^^m>T-qk1=8VHFv@Y5a~F%;Tf z17@XEQ+A@UsE%la(6($%5yBhhB#Z`lB#a4kLaYw-U>IZQIsU_|a(J7WbN8<$Ex($p zZcsgZpIRZ^U=QK*$Z~)C?*2hPS=*AiNSsVgi`yW@q17*{&Y>u@DM~2U%3Uma*Zk>4 zoq>JDWM~UVh^Onx@9E18p(%<-4rfe?L8OAr26F!W7v%@#7;PEanP0|Go3`!Mc}ZPa zBha13neR$<-)E50-oEfm&@Sv@pgGL*>E}8>VLL+yk`KGj!E3*v9W&JLKzd=7o<7oz z+zG>l9ZEFK{r%x^8s&Q1sCT~>jZFwun9kl;59}?cVxHWuH)6`ltlR@f)iR}Tf|Hgn zF&;$s{Me~PztGb0-1v6I_D71#Q_mr|;aX@tCFD&Hv-vWesj9Z;S6+MP#LXwMFmaN9 z@%nev@AXa(oYXFirP8yjr;TxcPI6F{aOzU3^h+8#kF99#wDr3SwoP$Fe)e ztC-4xq+^KL-#aZToBjA}z3h>0H~iif6*i;CD{h7WWPDht(5Kx*ix5XWDv+^X$+(!$ zQ`s?vV~xeDQ5;F1Y@djFNq>_$#*_x}q)|mBiycYY4;YMEjGBzt4DI&dPbLrQjnDM| zO|bUOK#irf$JOWj;0ToOaThrw8~^>=2!5BB60z}%)M<~8VjS8=59yDex{2PjA40i0 zED|RX5Vq<$aUqL zekpr7N5q)#Go=V5w->mY5{UKr@kaJ02kx=s_0C+({FSetIg!_ew4A)1nJmEun-;SL zdjZFno64_Cu3YlG34-5|5@zHk@&+M{4kHL13!Up{7PWej386sT>BrP2`x^P71X9d} ztomr&_`cwz$Lmo93Uyl@U0v*c^AX*_P3G6=tAbfAl78k&Jt@WU0L@0_*PCAt**7(SktA0uT)>=V2YgnRrS_4 z+lN;7!h;cr{BJcAWp5@DdwnyL(M+2|_#1ZoOWvMYL}xFnS8wh9LhjdtGPyhLOHc93 zT)oCxSM6KbAJseODL7zIWx%xwXYXMkiVfoaGn337_J9v0QO zdh2#DN@Q+KW!6~G?YlELRMgVw(ahbkVA6_3&J(N&(jd1%<@~Z1;2YexW8(18Ore8x z$(V&!^&_@de;^iJ1NJaPRYSW1V<7@2+&w%)6T^4Ox?f@oHH#%!)~ z#wHmYITvC)1 z3zM_rTAKEL*#r?tZE6Us#mm4|)fc`>9b}%$H0a%j;ZLNy@|M*zUC=EGRQ#;S$i=C; zvfnnau*tV9Hz2d6v!t?Rvd=ZNG%>ZmFvsZPU3xgo@@uO?=8FNz$4{Cv0d?^<#vce> z{l$LY)Za)ybndX73>|d=a~K@Bmnrt8aebe1!w-hziWOM2UK9rX!smEBPEdVCly|+H zb`4kO5iEHmHi^eZr^j@7l`^o>@{+@{yc}D9lT=JU{?d$)FL@BplnGU57$v0RFB|44 z;exlapJ!xG->9@zv+-O_--v%I&hf5xe_c8L(UUu=&IMA47MEN08GfUw>-RKUn8V zzbX}E=M-z&Bo-0E@dyxeK+eLA3djxz{Emer(HwToN6`$r@1QdSQlUA+Endse;FJbK z=Wt(B96}_+wPBpa@_)DOW7>IgTy$u+-zmKD@ql@SdnE^#o+hP0)e6Ve5G1BXR)SL! zSLDwzD?rZaROpk#kYEE@i)hPG3%Mr{<;DhbR0#G_=#UYH9UT1Kg&OOmAX#Yjma++krlkQ$u^!3sjCC4>R;PkcU>BtM>cr32RmZ- z^>%7@OU|&abg$}mi%zp~r!o482{8Wf$+En<^n>#C=j(89-fn6j9Gzh5cDpFfWqcCK zvu6`Z9~B6w@&ZGgpG0yl*}FPJWFPqaGZg7dU`Eh zHNCA)6{lo6zG`;K>#Swwwz$@%ofum-i@mP?r460@_qiA3xs?Z(jnwxF8CeZ{SGdP` z__##AZ-y>67mx1EkFvy#a?Vq%Q-%U^z?POvNcQ`ov0EQ zsE}_qV)A$tn*Dne$VaZHs9UV4s$H%)t61u~qm=emP(lwgmPSukh4-zaOscu&!fcPR ztu-EcYH($Z#rIcH^V8PU#gN3q*2d16$Ah2jKRI|l zzyC!8$w>Z_#l@PROhZnQMAY8Nl!Swcor#%D0G@<|gwM&uj7M1v^xyDLil5BF#l?XK z2y}OMXL4s_vUf5EvT$>A1DRQYtgMWmIT)Qi?OY5!810hc@!-@ zOl>s8ENxBgoIiO8u(Po6{U`tbE9L)k{9j1T|BGbfWdGmD|CRFJNIu}d3jD7M{a0)K zC-$?s1mO9A|I_pW@S77~9smF#fRvc9st4HlhI{#i=C^J~OSgeY!lW8ziaxjMcIEFQQr^;p+$T(IxsyaM8H3zaXW`Pdun;)tveiQ zdF=GG_pm?QynT2#o?5l8>Ri$?|L{9n=R#@Ti{aI?kH!l87dpbbAs%~w9P~$a{|my9 zY7*L>)nuPR5KV*7)_>B;v-TgwvpV{p{BIH6rxq{H$zwnNp%-S^1M$z`{}1>6>)?;cKgzW}34$J+9{dI46Zde$kV5^BD$A=N&_L5bTh9K6 z6Ett()BL19Ss(mIpm(uP+#C1U!N@=HPA%wR)F9O$AE-ZZ7gL%{3je52k-7hWk^jGF zWrs+z>#dKst)k&{(^0&r?%=7MiLw2T=%fmk{||G&Ixg?J4p$Fu zw*vA{B}j@nPHRvXS=Q&@7ipxWg_dgHF#kU|3J%pv*!{P+WewTZSB zB{t(|j#vYy0zZr4%v~lH(x1kx5A}a(^7roJ^64Wedq0A!B+7Th-Q%VJZwC!~jiM4j zDT16aze>xhCxF?%4%+iooYGLH4R*bsb**{@b9n^khJ;xD)&IEH4_InHQw|M98K+x?c8J#B`*5+{MJB}}q>6=O^J;}UCG4V8M!Y>+j zX(j$|Oa2=w)qn3lJ3>7;!y`-SA2Tlp_lyhdho;XC?gT5Awl-nD=GyYP<#XPcxL%!h zVZy5X6Wv4di<3oCNRAE=y=03or!Q;}R+3TxbA$ETF~Ao{<-@BYSM>uodTr6Nq|4eF zaA!6#R@}q?cSKNY@&G}-AM08ZGW_=Zpr7Am7sl{u->mTNyh<~Vde9x z3-O%td#F=D^`z$ULbx+S$3=N>>w4j(dopeAUjbhqse5-G{Wo>e^2Uv^n6Iv=0u5F* z6G}V0CTeQYRJ$dvENmNiO~|n~r-AI?DD9&}fIT(IMEbS0_KCG_1CxcC(kqTxw(=sI zOY1GweE||;884 z|6{k7CVk0>mA~VbY&xoN5m*!ut3`kW&Y`oG{u^o8P|83j@l@YqBj8vZ?>%$tZ{{9h zn&U-y>ypgHIm*X1N(cCy8te$PIw!MC=Yw^Z8@;Cw@lWtjv-Bkc=;?v}WLddro~Q5~ zb%_j`OuEmmRB#@>bVdU@$C3X; zKEF%xf{U!aeL%Z?V69_gjgs1Rn}JX2rK8(hU9urJ`uQX@1{yoM#)p9V*TadX_<1cm zx;O&x31OR7mT*FLd%)ORvlaX1jOcR-(tE_+L_vSwMtL`gtixAXD7BMLkxO3d?F>&E zmiz)9)l)+a(+>+(A&gOkj@ZDHl zoZs%e$o;5oL)F+Mb|beP6M(}i%-L3AxfKuxAY5`-#tQ8nbuv3T;ID-%-byDPEOnB8RRz2L zc9#1x7F6(9OSWwrv&q7tiK8MPU~9Y@Uqa>1%ouB$hFuNScs@^S+|K`fBAGr4zKP&= zbyXAjtph;gDlCm}@?Z`_Kr`Ei#Wy^yxmuPj6B%8S?cuO`&%d`4!m1 zqzIDs>=N$o;XushLh||v$n!JW2AgqRO1hH-K{P%fKVTtFf&yu^Zy1!*korD2*B0{tNzhV1^ z{xGIi8hJQ2k(#uUXpKwBo7Zmd+Rqk z)MNZc`PPJfaqz!2IYk}GhAEZTIB6}M=i02&Ez^u8AZSn=aLWJvmhsF5gCN<45|Lo+ ze6ddc)LP=^WMSTiFHUor<3{jpPEc3QHpr(7P?om=H0I-;!4zea;HD1L7Mei*a8voc| zO|GT3W#G1QFar86veINGN3wj8gjP&pf*g0Y-;F2Yu^p?VEJ95Adc6oG1KAk9kq#d! z>*OI5ASz6oFsI#9R-*fCsYf}wFjJ{)P?frDyrwyeWs+pp^1Z3`Z6W6L?PBZwBBkr~ z!0#B~u=Fz4^(teO)Vj-lrs)UBeF3;|1*`zylW5xUK*11YCQz^cW*OJMir;}8ozIf@ zC{RSMdvEHU&5S{ zA?D}%N9AnG56Z*5X2=brUj#lklpBvMU5L>VYiVb(=~Dfw@dwyyA*GY&Tt@iQ_HT>! zB`ms#d8Zt7;*cXHf2_Y{ofnf-6c$cyxVW%Wp2nX-2y8>#C7xgoc?ALVU?@zEZ1MRn z);1l>LyY73oty$+RZ)|Kx}CFM)|(?Cz_nWWd$RMDUU=P>ri9^Ra(th{{J*BtkQQY^ znMC-@si;7ly+=9nV~RRZRs8LY`rP?Gn$`mqmIl^V)}`G-N_oCr=sjGA39i$#rLcB% zlNaGd;Tk*$wC%#EcZ?_{<0oSqRElj3>$EZHG+z%(2>kKgdh|7peadg?rOF2}nL%^RB*96F#?Q@5zb^N(%1tCwvLSvhN^M=dtG4&^vN55i*h1>7 z5`xb&5gV4~6y0|>IVGg>n0>{AyFU#=fZLt_41-6xUqJ1#fi*nG1r2diJOk)9Jz4|* zzr{KoU)k1Y)~iXrWv=~{3CZ>)p%RlTbwENk5V9iR0O#yp{hn2>*hWn8DvQSGU@+{)!bb-dx z5C-hR*Ujfaq07XsN^iNu&$*Z@l+-|Y5A4PH=ifper1v_v&&fGY>nXSY)tuj!_#5jW z7ZQSsg4>t8J5m}8FgJ!1i`~toXOwAw-&_}G)gZpXt|Zfd*oiX98cpF!6ju&M)o>*5 zXYdYMoR3=H<8pGNcrHjRC0gWrr^QRK2jfq~G*j^!QkM;9p@eL5_9fdcOLdC57jws# zoiT`(G$fG`LBs!clpi@L&m`I>4GrHS3kwem)ylr-TKL{;E?r59n3Z=n7MiRY%YpKdmSI88?4OFli9(+C5 z&IT)(MQ~IV9*>CubR52&JYQJ(PrrLi$%%__AA*_2#?b)KuV#(LgWe&zJku`{p#Vn@ z5@Y}pB3W3*Ta^8(Veb{@?g2xLG9Fr0;_98*8Ct#wO_EHYuwGV@>5}*e=JzQf$#6=p z$hY&?OW6fa5q2N65}V=lSwevFMkyu#+0^^_)cc|R`(T0W+t1L!Hc}3$aw`{W5((i& zodiYq;$anGl4$1sQiZ09cT~cHXD&J?Nb0|fDY-;F)yJis)P&ZCpfRa)?RI%FC9j^w z+0Ub9OxfNY2^o`Qmz&<&#%1Ea+W4M^c9tN8aN$fEI1(X@keajAGgGpTxutCtun3ad zMmag+B6r_=ZnVzTPt8>4?Mqx5fz0bhUx2i;KXS5918;mRLF&@=g``# z)m^(Dy}OFqIartAZNu5^hg`7FSJPU*X>G#yh%U|#e$@(sBc{+0erO=P7|n24!hXcJ z50@-{5A%aby@G*`6?evyfc8fNuzXq8(HM^k>oFRG9ey_(b_~05C1&iblIUNo1WfX+ z8a9U#BB_AQM^H$FAZyyLVlB)Sm?nS?kDC}_7BF9|qSqV2b`37X{I}o~U2ccp>cOX7 zRFxEdq?Ta^ctO|$G2=!D-P5fWF2>8}{XcCkeM?I)e9a3)1Xj@>^#v9`K_uM)1UW=A zvpRca!y_!qp=bj5*T`enwZh-&&2TTDI*l3u&4U4qelTVgN-A^s=h&!qJG_Cp#DNhF zCX5BU5y~m%3WdFUyByNNuVer-#*Ddy*yimG7VB?X83h*qrUviQn?Z3IBc)mEG_paJ zz_KzU9qUf%PviZ94(dU9;QiCQs0S6=jK4Elu2h*CTrwG#(9vN@eq(VpDjBb@(EppH zuOvbgZewY69Dkw@sPmeG9rxwVsU}tGjWXfTDdGCb2hh-_K;_RL%%4muL%(0pD_q@} zHBQ^%VS~1}JjEAvLyrS#!Lk6Dje>{_Ogs-MA!pIgjVMEXZ-?DU$#SdX`ZAB9z*ZPY zN5tSzgrw48#Q>Tw7+@(zXv;iCIBib`!l6`HW{zx+W1YfG+gAUa4P|HxGD#(PC#F{0 zvnKC(814JC^liYvuDBeJ8g(_M#=cR~$;Q2aHc{1%;qWl@Csn(l+xm zY54&7PKk5%b)KiHKaZuZ=PfJG%la^Fca%CH3@CI^$f8YjL-|iJm_=eZIlkMfF4Jse zfXZXyD1*7-x4)PB&R;gsozlVKb@ZYe~l4?rX^1@ikOiUw)qLv5bXoIi}+3|%b zBMFtEIL*J=!Xg>rnwB)4;hWT&M^!zUbDw*hQCaRFR0>~CPocBu`i$_^nMLCSRzOE< zd&wj_GY>WR-H@7iXVwqkN+!MzOadP?VrZ%X@KucLH5il7?8zZd?BIR4eh^>VwE=j+ z9R#Swt2`ZLCAOk213RCa7!OGxRkdE>>?`yek@pI$vW&oK$4_PPPjg+cD!18|7M%;> zdxb!RGT*5pRQf#$!`fJSr@`3XET1dg{Ao0{_Hpz~GgP(eg~l>KZ5I9;rHaxLu9rwE zy9~g3B5Iyy;r8JIop1N&om1orW_-6wKRYMHGjAXvT!T8c^3qcLZ?WN2lQ9Fql$#(+ z`$iiRtEoRUmP=8oO25Pbp+detO_<%d?DV-}liMf=UzeDy3A06SN)z>d6NEI|j$r!~ zkU2aa%_b!@@BhLC`$&!D`s$VTdgw`lkm?U zhErms6Kg0Y2za&$bssA($yJqXjR@jWOlZ6y*Y+sGU%xFs9VnnIsKi#0P%GeNkSM5u zG&WhQ%^s>DgiCH5HfIAd@cc-#ZUhX%$`VGA%omLZg(g5|gOzW@U$w;Y4qtOZpysi| zbaRO@z+Kk|)X80QP=#`%Nj4q&+14$5UrH!}#@Cg_fXwi1w57%QtVH#tg*sgV&d)qN zsogJj&BA!NIOH4Wv@#qyaL+?*^TDG^Z0U)!BHudX;~$C-GzU+_k%CT?X6Oh)C>$UF}03^!;YAOaSf%uA>QhOtIfXWu(c~nw=(}3K{;g>Cz@jhibq4H&?pG?(j=qFKrx6W~yjmP4O!d z+bxZ)$G%#q?VOliYFcRn%fL=(InV~6)zaWY;TL}6Bbk`>o}XGrqRK7RN22oMw^@XP zlc&b8f!toKBbIH)WND2_YKl#4=gBu?+{H`*tlE5|2CLqAiL#O+K@-V{5ZCnx>86Cg z+^b_If0j$J^hlHGOZie`&Pk zbN7NF)}2PR0BN&QDVZpWg>yHrD4UEA7w3hu*ld@?A4JWp4(IpE0>KT1b;kCz+)aKT zBFLSK=i#wz9zObAJw8Mn;LLRL99L{5JM}y=fund$I%hdweZ^TCAkRVEe6HAf7W}mK zFF#%AKU5m&?`5p3(){C0D;&B~Jj0k#fwbAx6RwMGSFnNPo26^ZyEgmNWi zzzs8j0rNKC8UeqgJwp!Pu>lIL2_uMNw^9ya%X$qGLSS_x3%37(I>?60kA-V(g-OcX zCU0fs_JcZuLyQqfJjcs6GG7yDHSwssd7%5;kG_+u+1(M--I}*?Hk~_3|^9T+`QD!0A9}~xUaK?=c7KyCE{7gEnSP<1eIPtwW z80=A`P~E~P6^}6vEO8urzrW>knOYD)rV+S5^E7uZstXw(fnSRMb5-C7^Tvxa>Z$=% zATCW4*4PTA6~j)4_LM1wqZ8Q5k{K1_`v8gSGlhfDrc#ooQaNPjB`VQ|QnkC~`4cpx zh7Mr(*P*?fTi@Gm3vj&#Y}6u~6S+o+8cumd3F0)=Q?+m@gvh7KX4Xv6l?>isa|i?8 zhR3+*3^=C98Ejsjt3JE{3n2#UbV2j@2B~5mc6M;kR72fa`tpWiH)P^o$#o877PyL2 z;7bF?y}hNl-&5Sz9m6e141K6bAyQ*)A8m?nz#uiL$_qKoU8+7^T9>ZJdOwt)^z48? z4`w%rMM}u-_c$6`jMUKKMQzI}0i)2<6~{p*0=0AVr)aR#d0@rPNubO{Y$w^KUtVhJ z*Q#@0z?OwD043EUFf>k2t8tMN6k6Rkm*W(1v4qAO$$E^Ukj+ucvRdx+8(=n1T<>rD z;;6rcp$D^0m4q>)gb{B0osYwy_qqYZ5Y34A6U^V!`R{t?qq?KUt=alQ&=QbT=g-ho zPN7SqS-a7}0?$eN3%=y3T%R3RfI*NK;s;WjCO&V!BE3#CY|oNcZ|3QGmB$n%PK4?_ zYVCVOl4~efF>!R=@^bVEmvSgyz_Da{783^F^DcZDDrAF@R4%?n#8j~jG3+%y#_HNs)KSMP&^Lw6g@ z^dPY(^s{a?4F+fqLnk1y-$_Gn*oN6K0x3VwFWhLAc(Oo(ryJ8ZYeR+`r7mEUbf!r^ zkH|R?*zzx2w9#p!D7WBTPHNFkZjDLHKr!WWun4%QQG~+ zjfwVd*p!CcLKq}SvMzHyoAO#I$-xkFV7qZ}o$WvnW<;cBO=dDP7$y(-nXQ}Nk+QiSEuk`{1Xb2)39(Zr0I8-JgYHx<%ir2+ z0jsV-i7+yfAwqn{icDG_Cr9gBSpgql-fOy#hK=Fa8XJp<58un$yi%PxnP#CPWnD_r z;MPF$8YyRuz^nHn2t}*cP^GwsWu#IwXSn^OFeAe--ME;GrX?JqEsToIZAvUM8&Y(XjxOML zt3<%OMWc`|V&QIf0aZcktCz|Rv(Q1arefHqC%i!Ui%}|(3A1tQm$c`+u5a^R4*Zvn zu`esxZ<>;NWwz+mOQ?q3?TWM9%6p>igu`09;-O3GX<8L)kpkZd12uU;iUuv)dJ$)b z8TLd`Sq;7elY|f9&NT&It8;2EO3eoUEVNJW|12XpZlDEh5aT%y<{ILl_Ub|gE}|JV zoB^%_Bm+zD@&OgXOq?uzM}bOE7qU|B}N5+|@#@DyRH#NH}IfYz@l zD=zH!+l$b9g@+%FaH7ch@*U;4}G@GAit{;tSb`VYZ>9%5;PHKHnJ`d*poQ(aw z-Z6s%JuMqKO9~_TW2j;K`lGUkfxCUk1)kBin1)63HYpl4yZE}~*~&`0-Xab$CeX(CUT|i2_a|6%T@ShwkD> zg?a$%rhIQLh9!{q55*Gv@I+=q1~P7kR7>k)uem|~`+3<(it67#Zxb-7xnc}x?l`I~ zHU3DbWVeERcO}H_%>dKP_`C`kV(@o{_)Y0fCnsFiIkR`DdoJsN-Go#k1|H^!+zs%u zQhw4*P4z+MY&P9{c=djHCGhYpnx|5BFf-8JGI}4%V!TZ&qQ+ZyzEamY&Z(uS9D;}l zvE8s@$%8Ws2!h_+|NUaozR@&6GD1<)R~24;ceK7b(2twvn{nV zD5WFd2V&;B|D^2S9;>ziGntHe(>SKw8iHP8a3yn&nV%Tx8S{|wMe4{%#~YUr+4c+^ zlVdX`s1HO02E-o{8rO1{A=~&4iw>{kuB^6iTX*Ey+MCSE6OM{_lCv>@&Egk^$<-m7 zo@8f>(>CSjOn#T;5-xe??|R~sFa|M@ANV36#5p)Wfl=^8t8_ysVj{q$<$qV&_w7o* zD=xNv`lzT50gD2o;bc@WH~iKSS|9LpwnMti{2<3)J;BF6ET8u%B`w|}yyN}(>{Jm>eaP;v%&$%YFJZDw-e@NDoaGgd#c7Q`c9w>O$(kIq8KO4z>!VcF&qUI zW}15XR)oUl#T&xFVy@u^&)oc#4O-Fag)%YJ7%)h6vX^PxCUdyxlvsOUr6nV%m3~e) z&7TJwrqC{^O}wW?GKS8hox;RoO43L8dE*rbPBLweTs^h~nUJ@UYB&s&Iv0*$1IV|L zaSo^&Ja&4VQGQz!doC_te`9jIE@r^IucG*b(VFGiI!p@z6I4hfX&axJ@$y zhceMvo(`b?X;@+w@pE=%kAr-S@H~n%(5ljMQScABAUG|!1~?zH+fFYy_bE6JZwClf zk_r;Z&8R_1PFhxRaF|)!2dq0MyK~S$lCBoUW+@>=KqLe~sFRT$H`+#slW0Y}&*^;k zaK>+FyP@5UHyu8OU0Du2k*rqnbR1oIR+3OuEv+E^H^*AS8CG>-iZxv=OSsg{Q~RhQvM-Wr+BYsrlh*j^H;}>c$kAJJokPcPtc2f7_7$eU z^J!@hHj0dZAVm{$p3R8K|0KoFvW=IG6~r3r174KL64jvPe78S`U0pYh|dL2A@_fSOQHnKsvZg<1WdwHy{(YcukSPAKe&8`Rys07WJ{C!O8g8SVLr%5g@5N3W79$ zueF8kFu&ulL{v*?x0LuIB4nZA%$9a_QfVW*AN&4SkAA?u)X47F8{&_fdnjlXI@s&P zghE~#o64Sj0dD*-88Ywb@GpF%;b*|3scfK^7f%3ioE%0DEtEpe@Jhp4ifU)wMeZf* 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 { + occlusion+=1.0/float(SampleSize); + } + } + if(depth>0.99) + { + occlusion=1.0; + } + return vec4(occlusion,occlusion,occlusion,1.0); +} void main() @@ -60,7 +89,10 @@ void main() gl_FragColor=bloom(); } - //gl_FragColor = vec4(texture2D(u_shadeTex, v_texcoord).rgb, 1.0); + else if(u_displayType==DISPLAY_SSAO) + { + gl_FragColor=SSAO(); + } diff --git a/js/main.js b/js/main.js index 5143dd9..deb5df2 100644 --- a/js/main.js +++ b/js/main.js @@ -32,6 +32,8 @@ var zNear = 20; var zFar = 2000; var texToDisplay = 1; +var kernelSize=100; +var kernel=[]; var main = function (canvasId, messageId) { @@ -43,6 +45,8 @@ var main = function (canvasId, messageId) { // Set up camera initCamera(canvas); + initKernel(); + // Set up FBOs initFramebuffer(); @@ -74,6 +78,13 @@ function initStats() { return stats; } +var initKernel = function () { + for (var i = 0; i < kernelSize; i++) { + kernel[i] = [Math.random()*2.0-1.0 , Math.random()*2.0-1.0 , Math.random() ]; + } +}; + + var renderLoop = function () { window.requestAnimationFrame(renderLoop); render(); @@ -330,6 +341,7 @@ var renderPost = function () { gl.uniform1f( postProg.uZNearLoc, zNear ); gl.uniform1f( postProg.uZFarLoc, zFar ); gl.uniform1i( postProg.uDisplayTypeLoc, texToDisplay ); + gl.uniform3fv(postProg.uKernelLoc,kernel); drawQuad(postProg); @@ -552,7 +564,7 @@ var initShaders = function () { postProg.uDepthSamplerLoc = gl.getUniformLocation( postProg.ref(), "u_depthTex"); postProg.uZNearLoc = gl.getUniformLocation( postProg.ref(), "u_zNear" ); postProg.uZFarLoc = gl.getUniformLocation( postProg.ref(), "u_zFar" ); - + postProg.uKernelLoc=gl.getUniformLocation(postProg.ref(),"u_kernel"); }); CIS565WEBGLCORE.registerAsyncObj(gl, postProg); From be6fd2b7cd6a80b29b7b45c1e205fff08ecce583 Mon Sep 17 00:00:00 2001 From: jianqiaol Date: Sat, 15 Nov 2014 04:03:17 -0500 Subject: [PATCH 12/23] Update README.md --- README.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/README.md b/README.md index 24fc109..0ed6a27 100644 --- a/README.md +++ b/README.md @@ -12,6 +12,10 @@ Toon Shading Bloom ![](Bloom.png) + +Screen Space Ambient Occlusion + +![](SSAO.png) ------------------------------------------------------------------------------- OVERVIEW: ------------------------------------------------------------------------------- From 0fc8b81c5aa4ab6ad33079ea0de74dc0060c4a49 Mon Sep 17 00:00:00 2001 From: jianqiaol Date: Sat, 15 Nov 2014 04:06:24 -0500 Subject: [PATCH 13/23] Update README.md --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index 0ed6a27..62ffd94 100644 --- a/README.md +++ b/README.md @@ -7,6 +7,7 @@ Diffuse & Blinn-Phong lighting Toon Shading +To implement toon shader, I calculated the dot product of the light and the normal of each screen point. Then I assigned different colors according to their dot product value, which is divided into 5 bins. ![](Toon.png) Bloom From 6c29854ed0f144c4bedc49a62b284c4e4470dc1e Mon Sep 17 00:00:00 2001 From: jianqiaol Date: Sat, 15 Nov 2014 04:06:54 -0500 Subject: [PATCH 14/23] Update README.md --- README.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 62ffd94..c730534 100644 --- a/README.md +++ b/README.md @@ -1,7 +1,9 @@ ------------------------------------------------------------------------------ CIS565: Project 6 -- Deferred Shader ------------------------------------------------------------------------------- -Diffuse & Blinn-Phong lighting + + +*Diffuse & Blinn-Phong lighting ![](diffuse_blinn-phong.png) From a00b0e63310d68de56b4843b0b56e1f7a99a9bdd Mon Sep 17 00:00:00 2001 From: jianqiaol Date: Sat, 15 Nov 2014 04:07:35 -0500 Subject: [PATCH 15/23] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index c730534..350f0c3 100644 --- a/README.md +++ b/README.md @@ -3,7 +3,7 @@ CIS565: Project 6 -- Deferred Shader ------------------------------------------------------------------------------- -*Diffuse & Blinn-Phong lighting +###Diffuse & Blinn-Phong lighting ![](diffuse_blinn-phong.png) From ddd72eca4dd1294c695dca76a41a67cf7b7ee7e6 Mon Sep 17 00:00:00 2001 From: jianqiaol Date: Sat, 15 Nov 2014 04:12:41 -0500 Subject: [PATCH 16/23] Update README.md --- README.md | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/README.md b/README.md index 350f0c3..6d914d6 100644 --- a/README.md +++ b/README.md @@ -7,17 +7,17 @@ CIS565: Project 6 -- Deferred Shader ![](diffuse_blinn-phong.png) -Toon Shading +###Toon Shading with silhouetting -To implement toon shader, I calculated the dot product of the light and the normal of each screen point. Then I assigned different colors according to their dot product value, which is divided into 5 bins. +To implement toon shader, I calculated the dot product of the light and the normal of each screen point. Then I assigned different colors according to their dot product value, which is divided into 5 bins. For silhouetting, I just check the depth of each neighbours of a pixel, and make it black if the depth is larger than a threshold. ![](Toon.png) -Bloom - +###Bloom +I used the color from Diffuse and Blinn-Phong and made a gaussian convolution to add glow. ![](Bloom.png) Screen Space Ambient Occlusion - +For SSAO, I sampled 100 points around each screen points and check if their depth is larger than the screen point's depth. The ratio of points has larger depth is used as the color. ![](SSAO.png) ------------------------------------------------------------------------------- OVERVIEW: From 8edb01b346580fe16e0c4265fd0bc5caf6459cb9 Mon Sep 17 00:00:00 2001 From: jianqiaol Date: Sat, 15 Nov 2014 04:16:28 -0500 Subject: [PATCH 17/23] Update README.md --- README.md | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/README.md b/README.md index 6d914d6..4ae2aee 100644 --- a/README.md +++ b/README.md @@ -19,6 +19,17 @@ I used the color from Diffuse and Blinn-Phong and made a gaussian convolution to Screen Space Ambient Occlusion For SSAO, I sampled 100 points around each screen points and check if their depth is larger than the screen point's depth. The ratio of points has larger depth is used as the color. ![](SSAO.png) + + +###Performance +| planets #| Block Size=128 | Block Size=256 | Block Size=512| +|:---------:|:-----------------:|:-----------------:|:-----------:| +| 1000 | 60 | 60 | 60| +| 2000 | 40 | 40 | 40| +| 5000 | 20 | 20 | 20| + + + ------------------------------------------------------------------------------- OVERVIEW: ------------------------------------------------------------------------------- From b89b371bfbafb8cf5007d42a59c08e3964e4ab94 Mon Sep 17 00:00:00 2001 From: jianqiaol Date: Sat, 15 Nov 2014 04:18:25 -0500 Subject: [PATCH 18/23] Update README.md --- README.md | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/README.md b/README.md index 4ae2aee..1a9c99a 100644 --- a/README.md +++ b/README.md @@ -22,11 +22,12 @@ For SSAO, I sampled 100 points around each screen points and check if their dept ###Performance -| planets #| Block Size=128 | Block Size=256 | Block Size=512| -|:---------:|:-----------------:|:-----------------:|:-----------:| -| 1000 | 60 | 60 | 60| -| 2000 | 40 | 40 | 40| -| 5000 | 20 | 20 | 20| +| shader| FPS | +|:---------:|:-----------------:| +| Diffuse Blinn-Phong | 60 | +| Toon | 59 | +| Bloom | 13 | +| SSAO | 18| From 79481adf3fc13ec873f7ccf9d659c3da55c6c73e Mon Sep 17 00:00:00 2001 From: jianqiaol Date: Sat, 15 Nov 2014 04:19:47 -0500 Subject: [PATCH 19/23] Update README.md --- README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/README.md b/README.md index 1a9c99a..01db471 100644 --- a/README.md +++ b/README.md @@ -2,6 +2,8 @@ CIS565: Project 6 -- Deferred Shader ------------------------------------------------------------------------------- +![Video demo](https://www.youtube.com/watch?v=rO3hkOwMkNg&feature=youtu.be) + ###Diffuse & Blinn-Phong lighting From e675504ec6f729b07d83dfe75cee33b4c101d660 Mon Sep 17 00:00:00 2001 From: jianqiaol Date: Sat, 15 Nov 2014 04:21:46 -0500 Subject: [PATCH 20/23] Update README.md --- README.md | 113 +----------------------------------------------------- 1 file changed, 1 insertion(+), 112 deletions(-) diff --git a/README.md b/README.md index 01db471..c0d0a4a 100644 --- a/README.md +++ b/README.md @@ -70,122 +70,11 @@ WASDRF - Movement (along w the arrow keys) * 5 - Diffuse&Blinn-Phong * 6 - Toon shading * 7 - Bloom shading +* 8 - SSAO * 0 - Full deferred pipeline There are also mouse controls for camera rotation. -------------------------------------------------------------------------------- -REQUIREMENTS: -------------------------------------------------------------------------------- - -In this project, you are given code for: -* Loading .obj file -* Deferred shading pipeline -* GBuffer pass - -You are required to implement: -* Either of the following effects - * Bloom - * "Toon" Shading (with basic silhouetting) -* Screen Space Ambient Occlusion -* Diffuse and Blinn-Phong shading - -**NOTE**: Implementing separable convolution will require another link in your pipeline and will count as an extra feature if you do performance analysis with a standard one-pass 2D convolution. The overhead of rendering and reading from a texture _may_ offset the extra computations for smaller 2D kernels. - -You must implement two of the following extras: -* The effect you did not choose above -* Compare performance to a normal forward renderer with - * No optimizations - * Coarse sort geometry front-to-back for early-z - * Z-prepass for early-z -* Optimize g-buffer format, e.g., pack things together, quantize, reconstruct z from normal x and y (because it is normalized), etc. - * Must be accompanied with a performance analysis to count -* Additional lighting and pre/post processing effects! (email first please, if they are good you may add multiple). - - -------------------------------------------------------------------------------- -RESOURCES: -------------------------------------------------------------------------------- - -The following are articles and resources that have been chosen to help give you -a sense of each of the effects: - -* Bloom : [GPU Gems](http://http.developer.nvidia.com/GPUGems/gpugems_ch21.html) -* Screen Space Ambient Occlusion : [Floored - Article](http://floored.com/blog/2013/ssao-screen-space-ambient-occlusion.html) - -------------------------------------------------------------------------------- -README -------------------------------------------------------------------------------- -All students must replace or augment the contents of this Readme.md in a clear -manner with the following: - -* A brief description of the project and the specific features you implemented. -* At least one screenshot of your project running. -* A 30 second or longer video of your project running. To create the video you - can use [Open Broadcaster Software](http://obsproject.com) -* A performance evaluation (described in detail below). - -------------------------------------------------------------------------------- -PERFORMANCE EVALUATION -------------------------------------------------------------------------------- -The performance evaluation is where you will investigate how to make your -program more efficient using the skills you've learned in class. You must have -performed at least one experiment on your code to investigate the positive or -negative effects on performance. - -We encourage you to get creative with your tweaks. Consider places in your code -that could be considered bottlenecks and try to improve them. - -Each student should provide no more than a one page summary of their -optimizations along with tables and or graphs to visually explain any -performance differences. - -------------------------------------------------------------------------------- -THIRD PARTY CODE POLICY -------------------------------------------------------------------------------- -* Use of any third-party code must be approved by asking on the Google groups. - If it is approved, all students are welcome to use it. Generally, we approve - use of third-party code that is not a core part of the project. For example, - for the ray tracer, we would approve using a third-party library for loading - models, but would not approve copying and pasting a CUDA function for doing - refraction. -* Third-party code must be credited in README.md. -* Using third-party code without its approval, including using another - student's code, is an academic integrity violation, and will result in you - receiving an F for the semester. - -------------------------------------------------------------------------------- -SELF-GRADING -------------------------------------------------------------------------------- -* On the submission date, email your grade, on a scale of 0 to 100, to Harmony, - harmoli+cis565@seas.upenn.edu, with a one paragraph explanation. Be concise and - realistic. Recall that we reserve 30 points as a sanity check to adjust your - grade. Your actual grade will be (0.7 * your grade) + (0.3 * our grade). We - hope to only use this in extreme cases when your grade does not realistically - reflect your work - it is either too high or too low. In most cases, we plan - to give you the exact grade you suggest. -* Projects are not weighted evenly, e.g., Project 0 doesn't count as much as - the path tracer. We will determine the weighting at the end of the semester - based on the size of each project. - - ---- -SUBMISSION ---- -As with the previous projects, you should fork this project and work inside of -your fork. Upon completion, commit your finished project back to your fork, and -make a pull request to the master repository. You should include a README.md -file in the root directory detailing the following - -* A brief description of the project and specific features you implemented -* At least one screenshot of your project running. -* A link to a video of your project running. -* Instructions for building and running your project if they differ from the - base code. -* A performance writeup as detailed above. -* A list of all third-party code used. -* This Readme file edited as described above in the README section. --- ACKNOWLEDGEMENTS From d05662a53d3433a354ac001ffa732816ad458a0c Mon Sep 17 00:00:00 2001 From: jianqiaol Date: Sat, 15 Nov 2014 04:22:15 -0500 Subject: [PATCH 21/23] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index c0d0a4a..2d32a88 100644 --- a/README.md +++ b/README.md @@ -2,7 +2,7 @@ CIS565: Project 6 -- Deferred Shader ------------------------------------------------------------------------------- -![Video demo](https://www.youtube.com/watch?v=rO3hkOwMkNg&feature=youtu.be) +[Video demo](https://www.youtube.com/watch?v=rO3hkOwMkNg&feature=youtu.be) ###Diffuse & Blinn-Phong lighting From f4f77b0f79e68148f456410308815e2c3fc90a9f Mon Sep 17 00:00:00 2001 From: jianqiaol Date: Sat, 15 Nov 2014 04:23:03 -0500 Subject: [PATCH 22/23] Update README.md --- README.md | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/README.md b/README.md index 2d32a88..6418931 100644 --- a/README.md +++ b/README.md @@ -6,12 +6,11 @@ CIS565: Project 6 -- Deferred Shader ###Diffuse & Blinn-Phong lighting - ![](diffuse_blinn-phong.png) ###Toon Shading with silhouetting - To implement toon shader, I calculated the dot product of the light and the normal of each screen point. Then I assigned different colors according to their dot product value, which is divided into 5 bins. For silhouetting, I just check the depth of each neighbours of a pixel, and make it black if the depth is larger than a threshold. + ![](Toon.png) ###Bloom From dbd75e7e252eeabd0aa3fc370acfb5b73029a2ff Mon Sep 17 00:00:00 2001 From: jianqiaol Date: Sat, 15 Nov 2014 04:23:32 -0500 Subject: [PATCH 23/23] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 6418931..4947c80 100644 --- a/README.md +++ b/README.md @@ -17,7 +17,7 @@ To implement toon shader, I calculated the dot product of the light and the norm I used the color from Diffuse and Blinn-Phong and made a gaussian convolution to add glow. ![](Bloom.png) -Screen Space Ambient Occlusion +###Screen Space Ambient Occlusion For SSAO, I sampled 100 points around each screen points and check if their depth is larger than the screen point's depth. The ratio of points has larger depth is used as the color. ![](SSAO.png)