diff --git a/1.jpg b/1.jpg deleted file mode 100644 index 7dcab8a..0000000 Binary files a/1.jpg and /dev/null differ diff --git a/2.jpg b/2.jpg deleted file mode 100644 index 9d787d8..0000000 Binary files a/2.jpg and /dev/null differ diff --git a/3.jpg b/3.jpg deleted file mode 100644 index 0b0545c..0000000 Binary files a/3.jpg and /dev/null differ diff --git a/4.jpg b/4.jpg deleted file mode 100644 index 9bb2c0b..0000000 Binary files a/4.jpg and /dev/null differ diff --git a/5.jpg b/5.jpg deleted file mode 100644 index c6ba47e..0000000 Binary files a/5.jpg and /dev/null differ diff --git a/RTXoff.svg b/RTXoff.svg deleted file mode 100644 index 80488f7..0000000 --- a/RTXoff.svg +++ /dev/null @@ -1,103 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/RTXon.svg b/RTXon.svg deleted file mode 100644 index d3124d7..0000000 --- a/RTXon.svg +++ /dev/null @@ -1,105 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/img.jpg b/img.jpg deleted file mode 100644 index d5be235..0000000 Binary files a/img.jpg and /dev/null differ diff --git a/lib3.js b/lib3.js deleted file mode 100644 index 7a08045..0000000 --- a/lib3.js +++ /dev/null @@ -1,206 +0,0 @@ - -////////////////////////////////////////////////////////////////////////////////////////// -// -// THIS IS THE SUPPORT LIBRARY. YOU PROBABLY DON'T WANT TO CHANGE ANYTHING HERE JUST YET. -// -////////////////////////////////////////////////////////////////////////////////////////// - -let fragmentShaderHeader = ['' // WHATEVER CODE WE WANT TO PREDEFINE FOR FRAGMENT SHADERS - , 'precision highp float;' - , 'float noise(vec3 point) { float r = 0.; for (int i=0;i<16;i++) {' - , ' vec3 D, p = point + mod(vec3(i,i/4,i/8) , vec3(4.0,2.0,2.0)) +' - , ' 1.7*sin(vec3(i,5*i,8*i)), C=floor(p), P=p-C-.5, A=abs(P);' - , ' C += mod(C.x+C.y+C.z,2.) * step(max(A.yzx,A.zxy),A) * sign(P);' - , ' D=34.*sin(987.*float(i)+876.*C+76.*C.yzx+765.*C.zxy);P=p-C-.5;' - , ' r+=sin(6.3*dot(P,fract(D)-.5))*pow(max(0.,1.-2.*dot(P,P)),4.);' - , '} return .5 * sin(r); }' -].join('\n'); -let ns = 5, cns = 3; -fragmentShaderHeader+= 'const int ns = ' + ns + ';\n'; -let fragmentShaderDefs = 'const int cns = ' + cns + ';\n'; -let nfsh = fragmentShaderHeader.split('\n').length + 1; // NUMBER OF LINES OF CODE IN fragmentShaderHeader - -let isFirefox = navigator.userAgent.indexOf('Firefox') > 0; // IS THIS THE FIREFOX BROWSER? -let errorMsg = ''; -// -// Initialize a texture and load an image. -// When the image finished loading copy it into the texture. -// -function getBlob(data) { - let bytes = new Array(data.length); - for (let i = 0; i < data.length; i++) { - bytes[i] = data.charCodeAt(i); - } - return new Blob([new Uint8Array(bytes)]); - } -let texture = [], gl, program; -let textures = []; -let lock = false; -function loadTexture(gl, url, i) { - const level = 0; - const internalFormat = gl.RGBA; - const width = 1; - const height = 1; - const border = 0; - const srcFormat = gl.RGBA; - const srcType = gl.UNSIGNED_BYTE; - if (texture[i] == null) - { - texture[i] = gl.createTexture(); - const pixel = new Uint8Array([0, 0, 255, 255]); // opaque blue - gl.activeTexture(gl.TEXTURE0+i); - gl.bindTexture(gl.TEXTURE_2D, texture[i]); - gl.texImage2D(gl.TEXTURE_2D, level, internalFormat, - width, height, border, srcFormat, srcType, - pixel); - } - // Because images have to be downloaded over the internet - // they might take a moment until they are ready. - // Until then put a single pixel in the texture so we can - // use it immediately. When the image has finished downloading - // we'll update the texture with the contents of the image. - - const image = new Image(); - image.onload = function () { - gl.activeTexture(gl.TEXTURE0+i); - gl.bindTexture(gl.TEXTURE_2D, texture[i]); - gl.texImage2D(gl.TEXTURE_2D, level, internalFormat, - srcFormat, srcType, image); - - // WebGL1 has different requirements for power of 2 images - // vs non power of 2 images so check if the image is a - // power of 2 in both dimensions. - if (isPowerOf2(image.width) && isPowerOf2(image.height)) { - // Yes, it's a power of 2. Generate mips. - gl.generateMipmap(gl.TEXTURE_2D); - gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR_MIPMAP_LINEAR); - } else { - // No, it's not a power of 2. Turn off mips and set - // wrapping to clamp to edge - gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE); - gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE); - gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR); - } - }; - image.src = url; -} - -function isPowerOf2(value) { - return (value & (value - 1)) == 0; -} -function gl_start(canvas, vertexShader, fragmentShader) { // START WEBGL RUNNING IN A CANVAS - - setTimeout(function () { - try { - canvas.gl = canvas.getContext('experimental-webgl'); // Make sure WebGl is supported. IT WOULD BE GREAT TO USE WEBGL2 INSTEAD. - } catch (e) { throw 'Sorry, your browser does not support WebGL.'; } - - canvas.setShaders = function (vertexShader, fragmentShader) { // Add the vertex and fragment shaders: - - gl = this.gl; - program = gl.createProgram(); // Create the WebGL program. - - function addshader(type, src) { // Create and attach a WebGL shader. - function spacer(color, width, height) { - return '
 
'; - } - errorMessage.innerHTML = '
'; - // errorMarker.innerHTML = spacer('white', 1, 1) + '\u25B6'; - let shader = gl.createShader(type); - gl.shaderSource(shader, src); - gl.compileShader(shader); - if (!gl.getShaderParameter(shader, gl.COMPILE_STATUS)) { - let msg = gl.getShaderInfoLog(shader); - console.log('Cannot compile shader:\n\n' + msg); - - let a = msg.substring(6, msg.length); - let line = 0; - if (a.substring(0, 3) == ' 0:') { - a = a.substring(3, a.length); - line = parseInt(a) - nfsh; - - editor.session.setAnnotations([{ - row: line, - column: 0, - text: msg, - type: "error" - }]); - } - let j = a.indexOf(':'); - a = 'line ' + (line+1) + a.substring(j, a.length); - if ((j = a.indexOf('\n')) > 0) - a = a.substring(0, j); - errorMessage.innerHTML = a; - } - else - editor.session.clearAnnotations(); - gl.attachShader(program, shader); - }; - - addshader(gl.VERTEX_SHADER, vertexShader); // Add the vertex and fragment shaders. - addshader(gl.FRAGMENT_SHADER, fragmentShaderHeader +fragmentShaderDefs+ fragmentShader); - - gl.linkProgram(program); // Link the program, report any errors. - if (!gl.getProgramParameter(program, gl.LINK_STATUS)) - console.log('Could not link the shader program!'); - gl.useProgram(program); - gl.program = program; - for(let i = 0; i < ns; ++i){ - loadTexture(gl, './'+(i+1)+'.jpg', i); //Texture loading. - textures[i] = i; - } - gl.uniform1iv(gl.getUniformLocation(program, 'uSampler'), textures); - let cx = Math.cos(mousedx), cy = Math.cos(mousedy), sx = Math.sin(mousedx), sy = Math.sin(mousedy); - setUniform('Matrix3fv', 'transformation', false, [cx, sy*sx, sx*cy, 0, cy, -sy, -sx, cx*sy, cx*cy]); - let attribs = [ - .05,.05,.1, .5,.5,1., 1.,.5,.5,20., 0., .0, 1.3, - .1,.05,.05, 1.,.5,.5, 1.,.5,.5,10., .2,0.8,1.3, - .1,.05,.05, .71,.71,.71, .71,.71,.71,10., 0.3,.0,1.5, - .1,.1,.1, .71,.71,.71, .71,.71,.71,10., 0.05,0., 1. - ] - var offset = 0; - for(let i = 0; i < ns-1; i++){ - setUniform('3fv', 'Ambient['+i+']', attribs.slice(offset, offset += 3)); - setUniform('3fv', 'Diffuse['+i+']', attribs.slice(offset, offset += 3)); - setUniform('4fv', 'Specular['+i+']', attribs.slice(offset, offset += 4)); - setUniform('1fv', 'ks['+i+']', attribs.slice(offset, offset += 1)); - setUniform('1fv', 'kr['+i+']', attribs.slice(offset, offset += 1)); - setUniform('1fv', 'kf['+i+']', attribs.slice(offset, offset += 1)); - } - - - gl.bindBuffer(gl.ARRAY_BUFFER, gl.createBuffer()); // Create a square as a triangle strip - gl.bufferData(gl.ARRAY_BUFFER, new Float32Array( // consisting of two triangles. - [-1, 1, 0, 1, 1, 0, -1, -1, 0, 1, -1, 0]), gl.STATIC_DRAW); - - let aPos = gl.getAttribLocation(program, 'aPos'); // Set aPos attribute for each vertex. - gl.enableVertexAttribArray(aPos); - gl.vertexAttribPointer(aPos, 3, gl.FLOAT, false, 0, 0); - } - - canvas.setShaders(vertexShader, fragmentShader); // Initialize everything, - setInterval(function () { // Start the animation loop. - gl = canvas.gl; - if (gl.startTime === undefined) // First time through, - gl.startTime = Date.now(); // record the start time. - animate(gl); - gl.drawArrays(gl.TRIANGLE_STRIP, 0, 4); // Render the square. - }, 30); - - }, 100); // Wait 100 milliseconds after page has loaded before starting WebGL. -} - -// THE animate() CALLBACK FUNCTION CAN BE REDEFINED IN index.html. - -function animate() { } - -function setUniform(type, name, a, b, c, d, e, f) { - if(gl) - { - let loc = gl.getUniformLocation(gl.program, name); - (gl['uniform' + type])(loc, a, b, c, d, e, f); - } -} - diff --git a/shader.frag b/shader.frag deleted file mode 100644 index 4fde7c8..0000000 --- a/shader.frag +++ /dev/null @@ -1,252 +0,0 @@ - -#define _DEBUG_BREAK {gl_FragColor=vec4(1,0,0,1); return;} -#define REFRACTION normalize(eta*W + (eta*c1 - sqrt(1.-eta*eta*(1.-c1*c1)))*N) -vec3 foregroundColor = vec3(.0841, .5329, .9604); -vec3 groundColor = vec3(.2, .3, .5); -vec4 groundSpecular = vec4(.71, .71, .71, 10.); -uniform float uTime;// TIME, IN SECONDS -uniform int f_tex, f_rt, f_moved; -uniform float dFL; //DELTA on FOCAL LENGTH -uniform mat3 transformation, invTr; -uniform vec3 Ambient[ns], Diffuse[ns]; -uniform vec4 Specular[ns]; -uniform float ks[ns], kr[ns], kf[ns]; -uniform vec4 Sph[ns]; -uniform sampler2D uSampler[ns]; - -const float kf_air = 1.000293; -varying vec3 vPos; -float fl=3.;//ORIGINAL FOCAL LENGTH -const float pi=3.14159265359; -const float _2pi=2.*pi; - -/***********PLEASE DO INCREASE n_ref(RT DEPTH) FOR BETTER RESULTS************/ -/*---->*/const int n_ref=31; //2^n-1 because each hit now spawn at most 2 rays. -/**BUT BE CAUTIOUS IF YOU DON'T HAVE A DECENT GRAPHICS CARD (below GTX 950M)**/ - -const int max_stack = (n_ref+1)/4; - -vec3 scolor = vec3(0,0,0); //Actually 2^n_ref -struct Ray{ - vec3 V; - vec3 W; - float kf, cumulativeK; -} stack1[max_stack], stack2[max_stack]; -bool modulo2(int n){ - return n-2*(n/2) == 1; -} -vec2 getTextCoord(vec3 tex_sph, float R){ - float tex_x=acos(abs(tex_sph.x)/sqrt(R*R-tex_sph.y*tex_sph.y)); - if(tex_sph.x>0.) - tex_x=pi-tex_x; - tex_x*=1.5708;//*Correct aspect ratio of texture 2:1 -> 2pir:2r - tex_x=tex_x+float(uTime); - float quo=float(int(tex_x/_2pi)); - tex_x=tex_x/_2pi - quo; - return vec2(tex_x,((R-tex_sph.y)/(2.*R))); -} -void main(){ - vec3 LDir=vec3(.5,.5,.5); - vec3 LCol=vec3(1.,1.,1.); - float currKf = kf_air; - vec3 color=vec3(.2, .3, .5); - vec3 trPos = transformation*((dFL+fl+1.)/(fl+1.))*vec3(vPos.xy, -1); - vec3 V0=transformation*vec3(0.,0.,fl+dFL), V = V0; - vec3 W=(trPos-V); - bool rtxoff = false, showtexture = true, moved = false; - float currentK = 1.; - int curr_ptr = 0, curr_top = 0, next_top = 0; - bool final = false, stackswap = false; - for(int j=0;j 0){ - Ray currR; - if(stackswap) - currR = stack1[curr]; - else - currR = stack2[curr]; - currKf = currR.kf; - currentK = currR.cumulativeK; - if(currKf <= 0.001 || currentK <= 0.001) - skip = true; - V = currR.V; - W = currR.W; - } - else - W = normalize(W); - if(!skip){ - float tMin=10000.; - int iMin = -1; - for(int i=0;i0.){ - float t=-B-sqrt(D); - if(t >= 0.01 && t < tMin){ - tMin = t; // This is an optimization, we don't have to do lighting/tex - iMin = i; // for objects that are occuluded, which is expensive! - } - else if (t >= -0.01 && t <0.01){ - t = -(t + 2.*B); - if(t > 0.01 && t < tMin){ - tMin = t; - iMin = i; - } - } - } - } - - if(iMin >= 0){ - float t = tMin; - vec3 S=V+t*W; - for(int i = 0; i < cns; ++ i) - if(i == iMin) - { - vec3 texture_color; - if(showtexture) - { - vec3 tex_sph = (S-Sph[i].xyz); - if(moved) - ;//tex_sph=invTr*tex_sph; too expensive - texture_color=texture2D(uSampler[i],getTextCoord(tex_sph, Sph[i].w)).xyz; - } - else texture_color = foregroundColor; - - vec3 N=normalize(S-Sph[i].xyz); - vec3 realLDir=normalize(LDir-S); - float c1 =dot(N, W); - if(c1<0.){ - color=(Ambient[i]+Diffuse[i]*max(0.,dot(N,realLDir))*LCol)*texture_color; - if(rtxoff || final) //if it's the last hit - { - color += Specular[i].xyz*pow(max(0., - dot(-2.*c1*N-realLDir,realLDir)),Specular[i].w); - scolor += color * currentK; - } - else{ - c1 = -c1; - float eta =currKf/kf[i]; - float nextks = currentK * ks[i], nextkr = currentK * kr[i]; - bool refl = nextks > 0.001, refr = nextkr > 0.001; - if(refl || refr) - for(int k = 0; k < max_stack; ++k) - if(k == next_top){ - if(stackswap){ - if(refl) - { - stack2[k] = Ray(S, 2. * c1 * N + W, currKf, nextks); //reflection - currentK -= nextks; - next_top ++; - } - if(refr) - { - if(refl) - stack2[k+1] = Ray(S, REFRACTION, kf[i], nextkr); //refraction - else - stack2[k] = Ray(S, REFRACTION, kf[i], nextkr); //refraction - currentK -= nextkr; - next_top ++; - } - }else{ - if(refl) - { //remember, c1 = -NW now - stack1[k] = Ray(S, 2. * c1 * N + W, currKf, nextks); //reflection - currentK -= nextks; - next_top ++; - } - if(refr) - { - if(refl) - stack1[k+1] = Ray(S, REFRACTION, kf[i], nextkr); //refraction - else - stack1[k] = Ray(S, REFRACTION, kf[i], nextkr); //refraction - currentK -= nextkr; - next_top ++; - } - } - break; - } - scolor += currentK * color; - } - } - else{ - float eta = currKf/kf_air; - N = -N; //inside the sphere, normal is inward! - float c2 = (1.-eta*eta*(1.-c1*c1)); - for(int k = 0; k < max_stack; ++k) - if(k == next_top){ - if(stackswap) - { - stack2[k+1] = Ray(S, -2. * c1 * N + W, currKf, currentK*ks[i]); //reflection inside - if(c2 >= 0.) - stack2[k] = Ray(S, normalize(eta*W + (eta*c1 - sqrt(c2))*N), kf_air, currentK*kr[i]); //refraction - else //on the edge, the light won't bend anymore and will keep perpendicular to normal - stack2[k] = Ray(S, normalize((W + c1*N)/sqrt(1.-c1*c1)), kf_air, currentK*kr[i]); //refraction - }else{ - stack1[k+1] = Ray(S, -2. * c1 * N + W, currKf, currentK*ks[i]); //reflection inside - if(c2 >= 0.) - stack1[k] = Ray(S, normalize(eta*W + (eta*c1 - sqrt(c2))*N), kf_air, currentK*kr[i]); //refraction - else - stack1[k] = Ray(S, normalize((W + c1*N)/sqrt(1.-c1*c1)), kf_air, currentK*kr[i]); //refraction - } - next_top += 2; - break; - } - } - break; - } - } - else { - float t = -(.2+V.y)/W.y; - float sx = V.x + t* W.x, sz = V.z + t * W.z; - - if(t >= 0. && abs(sx) < 1.5 && abs(sz) < 3.) - { - vec3 S = vec3(sx, -.2, sz); - vec3 realLDir=normalize(LDir - S); - color=(0.5+0.5*max(0.,realLDir.y)*LCol)*texture2D(uSampler[4],vec2((sx+1.4)/3., (sz+1.5)/4.)).xyz; - if(rtxoff || final&&abs(sx)<1.5 && abs(sz+.6)<3.) - { - color += groundSpecular.xyz* //specular for ground. - pow(max(0., dot(vec3(-realLDir.x, realLDir.y,-realLDir.z),-W)),groundSpecular.w); - scolor += currentK * color; - } - else - { - for(int k = 0; k < max_stack; ++k) - if(k == next_top){ - if(stackswap) - stack2[k] = Ray(S, vec3(W.x, -W.y, W.z), kf_air, currentK * 0.15); //reflection - else - stack1[k] = Ray(S, vec3(W.x, -W.y, W.z), kf_air, currentK * 0.15); //reflection - next_top ++; - break; - } - scolor += (currentK*.85)*color; - } - } - else{ - if(j > 0) - scolor += currentK * (pow(max(0.,dot(W, normalize(LDir - V))), 10.) * vec3(1.,1.,1.) + foregroundColor*0.1); - else scolor = foregroundColor*0.6; - } - } - } - if(++curr_ptr >= curr_top){ - curr_top = next_top; - curr_ptr = 0; - if(next_top * 2 > max_stack) - final = true; - stackswap = !stackswap; - } - break; - } - } - } - gl_FragColor=vec4(sqrt(scolor),1.); -}