Smoke Shader Complete
How do I make an smoke shader complete?
What is a smoke shader complete? How do you make a smoke shader complete? This script and codes were developed by Omar Shehata on 13 August 2022, Saturday.
Smoke Shader Complete - Script Codes HTML Codes
<!DOCTYPE html>
<html >
<head> <meta charset="UTF-8"> <title>Smoke Shader Complete</title> <link rel="stylesheet" href="css/style.css">
</head>
<body> <script id="fragShader" type="shader-code"> uniform vec2 res;//The width and height of our screen uniform sampler2D bufferTexture;//Our input texture uniform vec3 smokeSource;//The x,y are the posiiton. The z is the power/density uniform float time; void main() { vec2 pixel = gl_FragCoord.xy / res.xy; //Get the distance of the current pixel from the smoke source float dist = distance(smokeSource.xy,gl_FragCoord.xy); //Get the color of the current pixel gl_FragColor = texture2D( bufferTexture, pixel ); //Generate smoke when mouse is pressed gl_FragColor.rgb += smokeSource.z * max(15.0-dist,0.0); //Generate fixed smoke (this is the little point moving around in the center) vec2 smokePoint = vec2(res.x/2.0+100.0*sin(time),res.y/2.0+cos(time*3.5)*20.0); dist = distance(smokePoint,gl_FragCoord.xy); gl_FragColor.rgb += 0.01 * max(15.0-dist,0.0); //Smoke diffuse float xPixel = 1.0/res.x;//The size of a single pixel float yPixel = 1.0/res.y; vec4 rightColor = texture2D(bufferTexture,vec2(pixel.x+xPixel,pixel.y)); vec4 leftColor = texture2D(bufferTexture,vec2(pixel.x-xPixel,pixel.y)); vec4 upColor = texture2D(bufferTexture,vec2(pixel.x,pixel.y+yPixel)); vec4 downColor = texture2D(bufferTexture,vec2(pixel.x,pixel.y-yPixel)); //Handle the bottom boundary if(pixel.y <= yPixel){ downColor.rgb = vec3(0.0); } //Diffuse equation float factor = 8.0 * 0.016 * (leftColor.r + rightColor.r + downColor.r * 3.0 + upColor.r - 6.0 * gl_FragColor.r); //Account for low precision of texels float minimum = 0.003; if(factor >= -minimum && factor < 0.0) factor = -minimum; gl_FragColor.rgb += factor; } </script> <script src='https://cdnjs.cloudflare.com/ajax/libs/three.js/r71/three.min.js'></script> <script src="js/index.js"></script>
</body>
</html>
Smoke Shader Complete - Script Codes CSS Codes
/* We want our scene to span the entire window */ body { margin: 0; }
Smoke Shader Complete - Script Codes JS Codes
//@author Omar Shehata. 2015. //We are loading the Three.js library from the cdn here: http://cdnjs.com/libraries/three.js/ var scene; var camera; var renderer; function scene_setup(){ //This is the basic scene setup scene = new THREE.Scene(); var width = window.innerWidth; var height = window.innerHeight; //Note that we're using an orthographic camera here rather than a prespective camera = new THREE.OrthographicCamera( width / - 2, width / 2, height / 2, height / - 2, 1, 1000 ); camera.position.z = 2; renderer = new THREE.WebGLRenderer(); renderer.setSize( window.innerWidth, window.innerHeight ); document.body.appendChild( renderer.domElement ); } var bufferScene; var textureA; var textureB; var bufferMaterial; var plane; var bufferObject; var finalMaterial; var quad; function buffer_texture_setup(){ //Create buffer scene bufferScene = new THREE.Scene(); //Create 2 buffer textures textureA = new THREE.WebGLRenderTarget( window.innerWidth, window.innerHeight, { minFilter: THREE.LinearFilter, magFilter: THREE.NearestFilter}); textureB = new THREE.WebGLRenderTarget( window.innerWidth, window.innerHeight, { minFilter: THREE.LinearFilter, magFilter: THREE.NearestFilter} ); //Pass textureA to shader bufferMaterial = new THREE.ShaderMaterial( { uniforms: { bufferTexture: { type: "t", value: textureA }, res : {type: 'v2',value:new THREE.Vector2(window.innerWidth,window.innerHeight)},//Keeps the resolution smokeSource: {type:"v3",value:new THREE.Vector3(0,0,0)}, time: {type:"f",value:Math.random()*Math.PI*2+Math.PI} }, fragmentShader: document.getElementById( 'fragShader' ).innerHTML } ); plane = new THREE.PlaneBufferGeometry( window.innerWidth, window.innerHeight ); bufferObject = new THREE.Mesh( plane, bufferMaterial ); bufferScene.add(bufferObject); //Draw textureB to screen finalMaterial = new THREE.MeshBasicMaterial({map: textureB}); quad = new THREE.Mesh( plane, finalMaterial ); scene.add(quad); } //Initialize the Threejs scene scene_setup(); //Setup the frame buffer/texture we're going to be rendering to instead of the screen buffer_texture_setup(); //Send position of smoke source with value var mouseDown = false; function UpdateMousePosition(X,Y){ var mouseX = X; var mouseY = window.innerHeight - Y; bufferMaterial.uniforms.smokeSource.value.x = mouseX; bufferMaterial.uniforms.smokeSource.value.y = mouseY; } document.onmousemove = function(event){ UpdateMousePosition(event.clientX,event.clientY) } document.onmousedown = function(event){ mouseDown = true; bufferMaterial.uniforms.smokeSource.value.z = 0.1; } document.onmouseup = function(event){ mouseDown = false; bufferMaterial.uniforms.smokeSource.value.z = 0; } //Render everything! function render() { requestAnimationFrame( render ); //Draw to textureB renderer.render(bufferScene,camera,textureB,true); //Swap textureA and B var t = textureA; textureA = textureB; textureB = t; quad.material.map = textureB; bufferMaterial.uniforms.bufferTexture.value = textureA; //Update time bufferMaterial.uniforms.time.value += 0.01; //Finally, draw to the screen renderer.render( scene, camera ); } render();
Developer | Omar Shehata |
Username | omarshe7ta |
Uploaded | August 13, 2022 |
Rating | 3 |
Size | 3,451 Kb |
Views | 40,480 |
Find the perfect freelance services for your business! Fiverr's mission is to change how the world works together. Fiverr connects businesses with freelancers offering digital services in 500+ categories. Find Developer!
Name | Size |
Buggy Smoke | 3,213 Kb |
Framebuffer - Texture Render | 2,402 Kb |
Rotating Cube | 2,151 Kb |
Featherlight Zoom Test | 1,695 Kb |
Pixijs.v3 Sending Data to Shader | 2,599 Kb |
Cube Sides | 2,390 Kb |
Simple Lighting Model | 3,365 Kb |
Smoke Shader - Setup | 2,339 Kb |
Pixijs.v3 Shader Example | 3,213 Kb |
Smoke Shader - Diffuse | 3,283 Kb |
Jasper is the AI Content Generator that helps you and your team break through creative blocks to create amazing, original content 10X faster. Discover all the ways the Jasper AI Content Platform can help streamline your creative workflows. Start For Free!
Name | Username | Size |
IE11 Test | Boostnewmedia | 4,998 Kb |
A Pen by James Podles | Jpod | 2,656 Kb |
DIV wormhole | Heydon | 1,932 Kb |
Vertically rotating text with CSS | Nopr | 2,141 Kb |
Compare resources on mobile sites | Gyusza | 3,226 Kb |
Menubar compass mixin | Michaelparenteau | 4,925 Kb |
Box Shadow Effects | Retrofuturistic | 2,143 Kb |
Fading gradient button | Insprd | 1,713 Kb |
Twinner Spinner II | Katydecorah | 2,974 Kb |
Experiments with Vertical Centering | KatieK2 | 3,924 Kb |
Surf anonymously, prevent hackers from acquiring your IP address, send anonymous email, and encrypt your Internet connection. High speed, ultra secure, and easy to use. Instant setup. Hide Your IP Now!