GPGPU labor IV. Scatter és gather. Kezdeti teendők Tantárgy honlapja, Scatter és gather A labor kiindulási alapjának letöltése (lab4_base.zip), kitömörítés.

Slides:



Advertisements
Similar presentations
Lecture Computer Science I - Martin Hardwick Strings #include using namespace std; int main () { string word; cout
Advertisements

Presented by: Stacy C. Lovell. How do we perceive color? Our eyes contain only 3 types of photosentitive cells tuned to three frequencies Red, Green,
Hardware Virtual Texturing
POST-PROCESSING SET09115 Intro Graphics Programming.
Introduction to Modern OpenGL Programming
Displacement mapping.
GPGPU labor XIII. Folyadék szimuláció. Kezdeti teendők Tantárgy honlapja, Folyadék szimuláció A labor kiindulási alapjának letöltése (lab13_base.zip),
GPGPU labor VI. Rekurzív algoritmusok labirintus.
GPGPU labor VIII. OpenCL bevezetés. Kezdeti teendők Tantárgy honlapja, OpenCL bevezetés II. A labor kiindulási alapjának letöltése (lab8_base.zip), kitömörítés.
GPGPU labor IV. Scatter és gather. Kezdeti teendők Tantárgy honlapja, Scatter és gather A labor kiindulási alapjának letöltése (lab4_base.zip), kitömörítés.
Week 4 Lecture 1: OpenGL 3.x & 4.x. 2 Objectives Changes in OpenGL 3.x 4.x Changes in GLSL 1.3/4/5 4.x.
Vertex Buffer Objects, Vertex Array Objects, Pixel Buffer Objects.
Tesselation Shaders. Tesselation  dictionary definition of tesselate is the forming of a mosaic.
Procedural Textures. Noise in glman  glman automatically creates 2D and 3D textures (with default sizes 64x64 and 64x64x64) named  Noise2  Noise3 
CCSprite *sprite = [CCSprite [sprite runAction: [CCRepeatForever actionWithAction: [CCSequence actions: [CCEaseIn.
CS123 | INTRODUCTION TO COMPUTER GRAPHICS Andries van Dam © 1/16 Deferred Lighting Deferred Lighting – 11/18/2014.
EECS 700: Computer Modeling, Simulation, and Visualization Dr. Shontz Chapter 2: Shader Fundamentals (continued)
Shooting in San Vanelona: the Visuals of EA's Skate.
The Buffers and Operations
Graphics Pipeline.
CS 4363/6353 BASIC RENDERING. THE GRAPHICS PIPELINE OVERVIEW Vertex Processing Coordinate transformations Compute color for each vertex Clipping and Primitive.
University of Sulaimani - School of Science - Computer Dept.
Filtering Approaches for Real-Time Anti-Aliasing
Fast GPU Histogram Analysis for Scene Post- Processing Andy Luedke Halo Development Team Microsoft Game Studios.
Computer graphics & visualization HDRI. computer graphics & visualization Image Synthesis – WS 07/08 Dr. Jens Krüger – Computer Graphics and Visualization.
Announcments Sign up for crits!. Reading for Next Week FvD – local lighting models GL 5 – lighting GL 9 (skim) – texture mapping.
GLSL Applications: 1 of 2 Joseph Kider Source: Patrick Cozzi – Spring 2011 University of Pennsylvania CIS Fall 2011.
Image Processing.  a typical image is simply a 2D array of color or gray values  i.e., a texture  image processing takes as input an image and outputs.
Wilf Comp OpenGL Odds and Ends.
Queensland University of Technology CRICOS No J INB382/INN382 Real-Time Rendering Techniques Lecture 13: Revision Ross Brown.
Geometry Shaders. Visualizing Normal Vectors  textbook calls this a “hedgehog plot” but (I think) that this is a misuse of the term  a hedgehog plot.
1 Introduction to Computer Graphics with WebGL Ed Angel Professor Emeritus of Computer Science Founding Director, Arts, Research, Technology and Science.
UniS CS293 Graphics with Java and OpenGL Textures.
Programming Concepts. Derive a new class from Activity of the framework Prepare the data beforehand, e.g., vertices, colours, normal vectors, texture.
Computer Graphics Lecture 1 July 11, Computer Graphics What do you think of? The term “computer graphics” is a blanket term used to refer to the.
Functions Pass by Reference Alina Solovyova-Vincent Department of Computer Science & Engineering University of Nevada, Reno Fall 2005.
Lecture by: Martin Deschamps CSE 4431
Film Digital Image Synthesis Yung-Yu Chuang 11/5/2008 with slides by Pat Hanrahan and Matt Pharr.
Tone Mapping on GPUs Cliff Woolley University of Virginia Slides courtesy Nolan Goodnight.
Review of OpenGL Basics
Shaders in OpenGL Marshall Hahn. Introduction to Shaders in OpenGL In this talk, the basics of OpenGL Shading Language will be covered. This includes.
CSE 381 – Advanced Game Programming GLSL. Rendering Revisited.
1 Graphics CSCI 343, Fall 2015 Lecture 25 Texture Mapping.
 Learn how you can use the shader through OpenGL ES  Add texture on object and make the object have a different look!!
Ray Tracing using Programmable Graphics Hardware
What are shaders? In the field of computer graphics, a shader is a computer program that runs on the graphics processing unit(GPU) and is used to do shading.
Realishtime Radiosity And Next Shooter Selection Jeff Pool COMP 870 Final December 4, 2008 UNC Dept. of Computer Science.
Cop3530sp12. Parameter passing call by value- appropriate for small objects that should not be altered by the function call by constant reference- appropriate.
GPGPU: Parallel Reduction and Scan Joseph Kider University of Pennsylvania CIS Fall 2011 Credit: Patrick Cozzi, Mark Harris Suresh Venkatensuramenan.
CDS 301 Fall, 2008 From Graphics to Visualization Chap. 2 Sep. 3, 2009 Jie Zhang Copyright ©
OpenGl Shaders Lighthouse3d.com.
Data Visualization Fall Scattered Point Interpolation Fall 2015Data Visualization2 Sometimes, we have no explicit cell information connecting the.
Int fact (int n) { If (n == 0) return 1; else return n * fact (n – 1); } 5 void main () { Int Sum; : Sum = fact (5); : } Factorial Program Using Recursion.
1 Sections 5.1 – 5.2 Digital Image Processing Fundamentals of Java: AP Computer Science Essentials, 4th Edition Lambert / Osborne.
Computer Science – Game DesignUC Santa Cruz Tile Engine.
Advanced Materials Using Shaders. Show demo advanced_ogre.
CS 4722 Made by Dr. Jeffrey Chastine Modified by Dr. Chao Mei
Real-Time Rendering Buffers in OpenGL 3.3
Real-Time Rendering Geometry and Buffers
Introduction to Computer Graphics with WebGL
Introduction to Computer Graphics with WebGL
Pointers & Functions.
GPGPU: Parallel Reduction and Scan
Blending CSCI 440 textbook section 7.10
Introduction to Computer Graphics with WebGL
Chapter X Output Merger.
Pointers & Functions.
Digital Image Synthesis Yung-Yu Chuang 11/8/2007
CS 480/680 Computer Graphics GLSL Overview.
CS 480/680 Fall 2011 Dr. Frederick C Harris, Jr. Computer Graphics
Presentation transcript:

GPGPU labor IV. Scatter és gather

Kezdeti teendők Tantárgy honlapja, Scatter és gather A labor kiindulási alapjának letöltése (lab4_base.zip), kitömörítés a D:\GPGPU\ könyvtárba D:\GPGPU\labs\lab4\lab4_glsl\lab4_glsl.sln indítása Project tulajdonságai – Configuration Properties – Debugging – Working Directory = $(ProjectDir)\..\..\bin

Hisztogram Szükséges osztálypéldányok: Quad* fullscreenQuad = new Quad(); Shader* histogramShader = new Shader("histogram.vert", "histogram.frag"); Shader* visualizeShader = new Shader("passthrough.vert", "visualize.frag"); Texture2D* texture = new Texture2D(); texture->loadFromFile(std::string("lena.jpg")); int windowWidth = texture->getWidth(); int windowHeight = texture->getHeight(); PointGrid* grid = new PointGrid(texture->getWidth(), texture->getHeight()); Framebuffer* histogramBuffer = new Framebuffer(255, 1, 1);

Hisztogram void histogram(){ histogramBuffer->clear(); glEnable(GL_BLEND); glBlendFunc(GL_ONE, GL_ONE); histogramBuffer->setRenderTarget(); histogramShader->enable(); histogramShader->bindUniformTexture("inputBuffer", texture->getTextureHandle(), 0); grid->render(histogramShader); histogramShader->disable(); histogramBuffer->disableRenderTarget(); glDisable(GL_BLEND); glFinish(); float histogram[255] = {0.0f}; glBindFramebuffer(GL_FRAMEBUFFER, histogramBuffer->getHandle()); glReadBuffer(GL_COLOR_ATTACHMENT0); glReadPixels(0, 0, 255, 1, GL_RED, GL_FLOAT, histogram); glBindFramebuffer(GL_FRAMEBUFFER, 0); std::cout << "Histogram:\n " << std::endl; int maxValue = 0; for(int i = 0; i < 255; ++i){ maxValue = maxValue > histogram[i] ? maxValue : histogram[i]; std::cout << i << " : " << histogram[i] << std::endl; } std::cout << " \nMaximum: " << maxValue << std::endl; glViewport(0, 0, windowWidth, windowHeight); visualizeShader->enable(); visualizeShader->bindUniformTexture("inputBuffer", histogramBuffer->getColorBuffer(0), 0); visualizeShader->bindUniformTexture("original", texture->getTextureHandle(), 1); visualizeShader->bindUniformInt("maxValue", maxValue); fullscreenQuad->render(visualizeShader); visualizeShader->disable(); glFinish(); }

histogram.vert #version 130 uniform sampler2D inputBuffer; in vec4 position; float I (vec2 coord){ vec4 color = texture(inputBuffer, coord); return(dot(color.rgb, vec3(0.21, 0.39, 0.4))); } void main(void){ vec2 resolution = textureSize(inputBuffer, 0); float luminance = I(position.xy + (0.5 / resolution)); gl_Position = vec4(2.0 * (luminance * ( / 255.0) / ), 0.0, 0.0, 1.0); }

histogram.frag #version 130 out vec4 outColor; void main(){ outColor = vec4(1.0); }

passthrough.vert #version 130 in vec4 position; in vec2 texCoord; out vec2 fTexCoord; void main(void){ gl_Position = position; fTexCoord = texCoord; }

visualize.frag #version 130 uniform sampler2D inputBuffer; uniform sampler2D original; uniform int maxValue; in vec2 fTexCoord; out vec4 outColor; float I (vec2 coord){ vec4 color = texture(original, coord); return(dot(color.rgb, vec3(0.21, 0.39, 0.4))); } void main() { float data = texture(inputBuffer, fTexCoord).x; if(data / float(maxValue) > fTexCoord.y){ outColor = vec4(0.5f + 0.5f * I(fTexCoord)); } else { outColor = vec4(I(fTexCoord)); }

Próba

Kvantálás Szükséges osztálypéldányok: Shader* quantizeShader = new Shader("passthrough.vert", "quantize.frag"); Framebuffer* quantizedBuffer = new Framebuffer(texture->getWidth(), texture->getHeight(), 1);

Kvantálás int levels = 16; void quantizeAndHistogram(){ quantizedBuffer->setRenderTarget(); quantizeShader->enable(); quantizeShader->bindUniformTexture("inputBuffer", texture->getTextureHandle(), 0); quantizeShader->bindUniformInt("levels", levels); fullscreenQuad->render(quantizeShader); quantizeShader->disable(); quantizedBuffer->disableRenderTarget(); histogramBuffer->clear(); glEnable(GL_BLEND); glBlendFunc(GL_ONE, GL_ONE); histogramBuffer->setRenderTarget(); histogramShader->enable(); histogramShader->bindUniformTexture("inputBuffer", quantizedBuffer->getColorBuffer(0), 0); grid->render(histogramShader); histogramShader->disable(); histogramBuffer->disableRenderTarget(); glDisable(GL_BLEND); glFinish(); float histogram[255] = {0.0f}; glBindFramebuffer(GL_FRAMEBUFFER, histogramBuffer->getHandle()); glReadBuffer(GL_COLOR_ATTACHMENT0); glReadPixels(0, 0, 255, 1, GL_RED, GL_FLOAT, histogram); glBindFramebuffer(GL_FRAMEBUFFER, 0); int maxValue = 0; for(int i = 0; i < 255; ++i){ maxValue = maxValue > histogram[i] ? maxValue : histogram[i]; } glViewport(0, 0, windowWidth, windowHeight); visualizeShader->enable(); visualizeShader->bindUniformTexture("inputBuffer", histogramBuffer->getColorBuffer(0), 0); visualizeShader->bindUniformTexture("original", quantizedBuffer->getColorBuffer(0), 1); visualizeShader->bindUniformInt("maxValue", maxValue); fullscreenQuad->render(visualizeShader); visualizeShader->disable(); glFinish(); }

quantize.frag #version 130 uniform sampler2D inputBuffer; uniform int levels; in vec2 fTexCoord; out vec4 outColor; float I (vec2 coord){ vec4 color = texture(inputBuffer, coord); return(dot(color.rgb, vec3(0.21, 0.39, 0.4))); } void main(){ float data = I(fTexCoord); float threshold = 1.0 / levels; while(data > threshold){ threshold += 1.0 / levels; } outColor = vec4(threshold); }

Próba

Hisztogram kiegyenlítés Szükséges osztálypéldányok: Framebuffer* U_histogramBuffer = NULL; Framebuffer* U_cumulatedHistogramBuffer[2] = {NULL}; Framebuffer* U_equalizedBuffer = NULL; Shader* computeHistogram = NULL; Shader* computeCumulativeHistogram = NULL; Shader* computeEqualizedHistogram = NULL; Shader* histogramShader = NULL; Shader* visualizeShader = NULL; const int histogramLevels = 256;

Hisztogram kiegyenlítés computeHistogram = new Shader("histogram.vert", "histogram.frag"); computeCumulativeHistogram = new Shader("passthrough.vert", "computeCumulativeHistogram.frag"); computeEqualizedHistogram = new Shader("passthrough.vert", "computeEqualizedHistogram.frag"); histogramShader = new Shader("computeHistogram.vert", "computeHistogram.frag"); visualizeShader = new Shader("passthrough.vert", "visualize.frag"); U_histogramBuffer = new Framebuffer(histogramLevels, 1, 1); U_equalizedBuffer = new Framebuffer(texture->getWidth(), texture- >getHeight(), 1); U_cumulatedHistogramBuffer[0] = new Framebuffer(histogramLevels, 1, 1); U_cumulatedHistogramBuffer[1] = new Framebuffer(histogramLevels, 1, 1);

Hisztogram kiegyenlítés void histogramEqualize(){ U_histogramBuffer->clear(); U_cumulatedHistogramBuffer[0]->clear(); U_cumulatedHistogramBuffer[1]->clear(); // generate histogram glEnable(GL_BLEND); glBlendFunc(GL_ONE, GL_ONE); U_histogramBuffer->setRenderTarget(); computeHistogram->enable(); computeHistogram->bindUniformTexture("inputMap", texture->getTextureHandle(), 0); computeHistogram->bindUniformFloat("incr", 1.0 ); computeHistogram->bindUniformFloat("histogramLevels", histogramLevels); grid->render(computeHistogram); computeHistogram->disable(); U_histogramBuffer->disableRenderTarget(); glDisable(GL_BLEND);

Hisztogram kiegyenlítés // compute cumulative histogram float offset = 1.0f / (float)histogramLevels; int passes = ceil(log(texture->getWidth()) / log(2)); int inputBuffer = 0; for(int i=0; i < passes; ++i){ U_cumulatedHistogramBuffer[(inputBuffer + 1) % 2]->setRenderTarget(); computeCumulativeHistogram->enable(); computeCumulativeHistogram->bindUniformTexture("inputMap", 0 == i ? U_histogramBuffer->getColorBuffer(0) : U_cumulatedHistogramBuffer[inputBuffer]->getColorBuffer(0), 0); computeCumulativeHistogram->bindUniformFloat("offset", -offset); fullscreenQuad->render(computeCumulativeHistogram); computeCumulativeHistogram->disable(); U_cumulatedHistogramBuffer[(inputBuffer + 1) % 2]->disableRenderTarget(); inputBuffer = (inputBuffer + 1) % 2; offset *= 2.0f; }

Hisztogram kiegyenlítés U_equalizedBuffer->clear(); U_equalizedBuffer->setRenderTarget(); computeEqualizedHistogram->enable(); computeEqualizedHistogram->bindUniformTexture("inputMap", texture->getTextureHandle(), 0); computeEqualizedHistogram->bindUniformTexture("histogram", U_cumulatedHistogramBuffer[inputBuffer]->getColorBuffer(0), 1); fullscreenQuad->render(computeEqualizedHistogram); computeEqualizedHistogram->disable(); U_equalizedBuffer->disableRenderTarget();

Hisztogram kiegyenlítés U_histogramBuffer->clear(); glEnable(GL_BLEND); glBlendFunc(GL_ONE, GL_ONE); U_histogramBuffer->setRenderTarget(); computeHistogram->enable(); computeHistogram->bindUniformTexture("inputMap",U_equalizedBuffer- >getColorBuffer(0), 0); computeHistogram->bindUniformFloat("incr", 1.0 ); computeHistogram->bindUniformFloat("histogramLevels", histogramLevels); grid->render(computeHistogram); computeHistogram->disable(); U_histogramBuffer->disableRenderTarget(); glDisable(GL_BLEND); glFinish();

Hisztogram kiegyenlítés float histogram[255] = {0.0f}; glBindFramebuffer(GL_FRAMEBUFFER, U_histogramBuffer->getHandle()); glReadBuffer(GL_COLOR_ATTACHMENT0); glReadPixels(0, 0, 255, 1, GL_RED, GL_FLOAT, histogram); glBindFramebuffer(GL_FRAMEBUFFER, 0); int maxValue = 0; for(int i = 0; i < 255; ++i){ maxValue = maxValue > histogram[i] ? maxValue : histogram[i]; } glViewport(0, 0, windowWidth, windowHeight); visualizeShader->enable(); visualizeShader->bindUniformTexture("inputBuffer", U_histogramBuffer->getColorBuffer(0), 0); visualizeShader->bindUniformTexture("original", U_equalizedBuffer->getColorBuffer(0), 1); visualizeShader->bindUniformInt("maxValue", maxValue); fullscreenQuad->render(visualizeShader); visualizeShader->disable(); glFinish(); }

cumulativeHist.frag #version 130 uniform sampler2D inputMap; uniform float offset; in vec2 fTexCoord; out vec4 outColor; void main(void){ float current = texture(inputMap, fTexCoord).x; float sampleOff = fTexCoord.x + offset; float addValue = 0.0; if(sampleOff >= 0.0){ addValue = texture(inputMap, vec2(sampleOff, 0.0)).x; } outColor = vec4(current + addValue); }

equalizedHist.frag #version 130 uniform sampler2D inputMap; uniform sampler2D histogram; in vec2 fTexCoord; out vec4 outColor; float I (vec2 coord){ vec4 color = texture(inputMap, coord); return(dot(color.rgb, vec3(0.21, 0.39, 0.4))); } void main(void){ vec2 size = textureSize(inputMap, 0); float current = I(fTexCoord); float accum = texture(histogram, vec2(current, 0.0)).x; float bin = accum / size.x / size.y; outColor = vec4(bin) ; }

Próba

Tone Mapping Szükséges osztálypéldányok: Texture2D* hdrTexture; Framebuffer* satHDRBuffer[2] = {NULL, NULL}; Framebuffer* hdrLumBuffer = NULL; Framebuffer* hdrRelLumBuffer = NULL; Shader* hdrLuminanceShader = NULL; Shader* hdrSatXShader = NULL; Shader* hdrSatYShader = NULL; Shader* hdrRelLumShader = NULL; Shader* hdrToneMapShader = NULL; float W = 0.9f; float alpha = 0.5f;

Tone Mapping satHDRBuffer[0] = new Framebuffer(hdrTexture->getWidth(), hdrTexture->getHeight(), 1); satHDRBuffer[1] = new Framebuffer(hdrTexture->getWidth(), hdrTexture->getHeight(), 1); hdrLumBuffer = new Framebuffer(hdrTexture->getWidth(), hdrTexture->getHeight(), 1); hdrRelLumBuffer = new Framebuffer(hdrTexture->getWidth(), hdrTexture->getHeight(), 1); hdrSatXShader = new Shader("passthrough.vert", "satx.frag"); hdrSatYShader = new Shader("passthrough.vert", "saty.frag"); hdrToneMapShader = new Shader("passthrough.vert", "tonemap.frag"); hdrLuminanceShader = new Shader("passthrough.vert", "luminance.frag"); hdrRelLumShader = new Shader("passthrough.vert", "rellum.frag"); hdrTexture = new Texture2D(); hdrTexture->loadFromFile(std::string("free_005.hdr"));

Tone Mapping void toneMap(){ // generate luminance hdrLumBuffer->clear(); hdrLumBuffer->setRenderTarget(); hdrLuminanceShader->enable(); hdrLuminanceShader->bindUniformTexture("hdr", hdrTexture->getTextureHandle(), 0); fullscreenQuad->render(hdrLuminanceShader); hdrLuminanceShader->disable(); hdrLumBuffer->disableRenderTarget();

Tone Mapping // generate SAT float offset = 1.0f / (float)hdrTexture->getWidth(); int passes = ceil(log(hdrTexture->getWidth()) / log(2)); int inputBuffer = 0; for(int i = 0; i < passes; ++i){ satHDRBuffer[(inputBuffer + 1) % 2 ]->setRenderTarget(); hdrSatXShader->enable(); hdrSatXShader->bindUniformTexture("inputMap", i == 0 ? hdrLumBuffer->getColorBuffer(0) : satHDRBuffer[inputBuffer]->getColorBuffer(0), 0); hdrSatXShader->bindUniformFloat("offset", -offset); fullscreenQuad->render(hdrSatXShader); hdrSatXShader->disable(); satHDRBuffer[(inputBuffer + 1) % 2 ]->disableRenderTarget(); inputBuffer = (inputBuffer + 1) % 2; satHDRBuffer[(inputBuffer + 1) % 2 ]->setRenderTarget(); hdrSatYShader->enable(); hdrSatYShader->bindUniformTexture("inputMap", satHDRBuffer[inputBuffer]->getColorBuffer(0), 0); hdrSatYShader->bindUniformFloat("offset", -offset); fullscreenQuad->render(hdrSatYShader); hdrSatYShader->disable(); satHDRBuffer[(inputBuffer + 1) % 2 ]->disableRenderTarget(); inputBuffer = (inputBuffer + 1) % 2; offset *= 2.0f; }

Tone Mapping hdrRelLumBuffer->clear(); hdrRelLumBuffer->setRenderTarget(); hdrRelLumShader->enable(); hdrRelLumShader->bindUniformTexture("luminanceMap", hdrLumBuffer->getColorBuffer(0), 0); hdrRelLumShader->bindUniformTexture("sat", satHDRBuffer[inputBuffer]->getColorBuffer(0), 1); hdrRelLumShader->bindUniformFloat("alpha", alpha); fullscreenQuad->render(hdrRelLumShader); hdrRelLumShader->disable(); hdrRelLumBuffer->disableRenderTarget();

Tone Mapping hdrToneMapShader->enable(); hdrToneMapShader->bindUniformTexture("hdr", hdrTexture->getTextureHandle(), 0); hdrToneMapShader- >bindUniformTexture("rellum", hdrRelLumBuffer- >getColorBuffer(0), 1); hdrToneMapShader->bindUniformFloat("W", W); fullscreenQuad->render(hdrToneMapShader); hdrToneMapShader->disable();}

luminance.frag #version 130 uniform sampler2D hdr; in vec2 fTexCoord; out vec4 outColor; void main(void){ vec4 color = texture(hdr, fTexCoord); outColor = vec4(color.r * , color.g * , color.b * , 1.0); }

satX.frag #version 130 uniform sampler2D inputMap; uniform float offset; in vec2 fTexCoord; out vec4 outColor; void main(void){ float c = texture(inputMap, fTexCoord).r; vec2 sampleOff = fTexCoord + vec2(offset, 0); float addValue = 0.0f; if(sampleOff.x >= 0.0){ addValue = texture(inputMap, sampleOff).r; } outColor = vec4(c + addValue); }

satY.frag #version 130 uniform sampler2D inputMap; uniform float offset; in vec2 fTexCoord; out vec4 outColor; void main(void){ float c = texture(inputMap, fTexCoord).r; vec2 sampleOff = fTexCoord + vec2(0.0, offset); float addValue = 0.0f; if(sampleOff.y >= 0.0){ addValue = texture(inputMap, sampleOff).r; } outColor = vec4(c + addValue); }

rellum.frag #version 130 uniform sampler2D luminanceMap; uniform sampler2D sat; uniform float alpha; in vec2 fTexCoord; out vec4 outColor; void main(void){ vec2 mapSize = textureSize(sat, 0); float avg = texture(sat, vec2(1.0, 1.0)).r / mapSize.x / mapSize.y; outColor = alpha * texture(luminanceMap, fTexCoord) / avg; }

tonemap.frag #version 130 uniform sampler2D hdr; uniform sampler2D rellum; uniform float W; in vec2 fTexCoord; out vec4 outColor; void main(void){ float Yr = texture(rellum, fTexCoord).x / ; vec4 hdrColor = texture(hdr, fTexCoord); outColor = hdrColor * ( Yr * ( 1 + Yr / W / W) / (1 + Yr) ); }

Próba

VÉGE