GPGPU labor IV Scatter s gather Kezdeti teendk
![GPGPU labor IV. Scatter és gather GPGPU labor IV. Scatter és gather](https://slidetodoc.com/presentation_image_h2/98c971aceaf1245f23f8f5d2f255a745/image-1.jpg)
GPGPU labor IV. Scatter és gather
![Kezdeti teendők • Tantárgy honlapja, Scatter és gather • A labor kiindulási alapjának letöltése Kezdeti teendők • Tantárgy honlapja, Scatter és gather • A labor kiindulási alapjának letöltése](http://slidetodoc.com/presentation_image_h2/98c971aceaf1245f23f8f5d2f255a745/image-2.jpg)
Kezdeti teendők • Tantárgy honlapja, Scatter és gather • A labor kiindulási alapjának letöltése (lab 4_base. zip), kitömörítés a D: GPGPU könyvtárba • D: GPGPUlabslab 4_glsllab 4_glsl. sln indítása • Project tulajdonságai – Configuration Properties – Debugging – Working Directory = $(Project. Dir). . bin
![• Hisztogram Szükséges osztálypéldányok: Quad* fullscreen. Quad = new Quad(); Shader* histogram. Shader • Hisztogram Szükséges osztálypéldányok: Quad* fullscreen. Quad = new Quad(); Shader* histogram. Shader](http://slidetodoc.com/presentation_image_h2/98c971aceaf1245f23f8f5d2f255a745/image-3.jpg)
• Hisztogram Szükséges osztálypéldányok: Quad* fullscreen. Quad = new Quad(); Shader* histogram. Shader = new Shader("histogram. vert", "histogram. frag"); Shader* visualize. Shader = new Shader("passthrough. vert", "visualize. frag"); Texture 2 D* texture = new Texture 2 D(); texture->load. From. File(std: : string("lena. jpg")); int window. Width = texture->get. Width(); int window. Height = texture->get. Height(); Point. Grid* grid = new Point. Grid(texture->get. Width(), texture->get. Height()); Framebuffer* histogram. Buffer = new Framebuffer(255, 1, 1);
![void histogram(){ histogram. Buffer->clear(); gl. Enable(GL_BLEND); gl. Blend. Func(GL_ONE, GL_ONE); histogram. Buffer->set. Render. Target(); void histogram(){ histogram. Buffer->clear(); gl. Enable(GL_BLEND); gl. Blend. Func(GL_ONE, GL_ONE); histogram. Buffer->set. Render. Target();](http://slidetodoc.com/presentation_image_h2/98c971aceaf1245f23f8f5d2f255a745/image-4.jpg)
void histogram(){ histogram. Buffer->clear(); gl. Enable(GL_BLEND); gl. Blend. Func(GL_ONE, GL_ONE); histogram. Buffer->set. Render. Target(); histogram. Shader->enable(); histogram. Shader->bind. Uniform. Texture("input. Buffer", texture->get. Texture. Handle(), 0); grid->render(histogram. Shader); histogram. Shader->disable(); histogram. Buffer->disable. Render. Target(); gl. Disable(GL_BLEND); gl. Finish(); float histogram[255] = {0. 0 f}; gl. Bind. Framebuffer(GL_FRAMEBUFFER, histogram. Buffer->get. Handle()); gl. Read. Buffer(GL_COLOR_ATTACHMENT 0); gl. Read. Pixels(0, 0, 255, 1, GL_RED, GL_FLOAT, histogram); gl. Bind. Framebuffer(GL_FRAMEBUFFER, 0); std: : cout << "Histogram: n-----" << std: : endl; int max. Value = 0; for(int i = 0; i < 255; ++i){ max. Value = max. Value > histogram[i] ? max. Value : histogram[i]; std: : cout << i << " : " << histogram[i] << std: : endl; } std: : cout << "---------n. Maximum: " << max. Value << std: : endl; gl. Viewport(0, 0, window. Width, window. Height); visualize. Shader->enable(); visualize. Shader->bind. Uniform. Texture("input. Buffer", histogram. Buffer->get. Color. Buffer(0), 0); visualize. Shader->bind. Uniform. Texture("original", texture->get. Texture. Handle(), 1); visualize. Shader->bind. Uniform. Int("max. Value", max. Value); fullscreen. Quad->render(visualize. Shader); visualize. Shader->disable(); gl. Finish(); } Hisztogram
![#version 130 uniform sampler 2 D input. Buffer; in vec 4 position; histogram. vert #version 130 uniform sampler 2 D input. Buffer; in vec 4 position; histogram. vert](http://slidetodoc.com/presentation_image_h2/98c971aceaf1245f23f8f5d2f255a745/image-5.jpg)
#version 130 uniform sampler 2 D input. Buffer; in vec 4 position; histogram. vert float I (vec 2 coord){ vec 4 color = texture(input. Buffer, coord); return(dot(color. rgb, vec 3(0. 21, 0. 39, 0. 4))); } void main(void){ vec 2 resolution = texture. Size(input. Buffer, 0); float luminance = I(position. xy + (0. 5 / resolution)); gl_Position = vec 4(2. 0 * (luminance * (1. 0 - 1. 0 / 255. 0) + 0. 5 / 255. 0 0. 5) , 0. 0, 1. 0); }
![histogram. frag #version 130 out vec 4 out. Color; void main(){ out. Color = histogram. frag #version 130 out vec 4 out. Color; void main(){ out. Color =](http://slidetodoc.com/presentation_image_h2/98c971aceaf1245f23f8f5d2f255a745/image-6.jpg)
histogram. frag #version 130 out vec 4 out. Color; void main(){ out. Color = vec 4(1. 0); }
![#version 130 passthrough. vert in vec 4 position; in vec 2 tex. Coord; out #version 130 passthrough. vert in vec 4 position; in vec 2 tex. Coord; out](http://slidetodoc.com/presentation_image_h2/98c971aceaf1245f23f8f5d2f255a745/image-7.jpg)
#version 130 passthrough. vert in vec 4 position; in vec 2 tex. Coord; out vec 2 f. Tex. Coord; void main(void){ gl_Position = position; f. Tex. Coord = tex. Coord; }
![#version 130 uniform sampler 2 D input. Buffer; uniform sampler 2 D original; uniform #version 130 uniform sampler 2 D input. Buffer; uniform sampler 2 D original; uniform](http://slidetodoc.com/presentation_image_h2/98c971aceaf1245f23f8f5d2f255a745/image-8.jpg)
#version 130 uniform sampler 2 D input. Buffer; uniform sampler 2 D original; uniform int max. Value; in vec 2 f. Tex. Coord; out vec 4 out. Color; float I (vec 2 coord){ vec 4 color = texture(original, coord); return(dot(color. rgb, vec 3(0. 21, 0. 39, 0. 4))); } void main() { float data = texture(input. Buffer, f. Tex. Coord). x; if(data / float(max. Value) > f. Tex. Coord. y){ out. Color = vec 4(0. 5 f + 0. 5 f * I(f. Tex. Coord)); } else { out. Color = vec 4(I(f. Tex. Coord)); } } visualize. frag
![Próba Próba](http://slidetodoc.com/presentation_image_h2/98c971aceaf1245f23f8f5d2f255a745/image-9.jpg)
Próba
![Kvantálás • Szükséges osztálypéldányok: Shader* quantize. Shader = new Shader("passthrough. vert", "quantize. frag"); Framebuffer* Kvantálás • Szükséges osztálypéldányok: Shader* quantize. Shader = new Shader("passthrough. vert", "quantize. frag"); Framebuffer*](http://slidetodoc.com/presentation_image_h2/98c971aceaf1245f23f8f5d2f255a745/image-10.jpg)
Kvantálás • Szükséges osztálypéldányok: Shader* quantize. Shader = new Shader("passthrough. vert", "quantize. frag"); Framebuffer* quantized. Buffer = new Framebuffer(texture->get. Width(), texture->get. Height(), 1);
![int levels = 16; void quantize. And. Histogram(){ quantized. Buffer->set. Render. Target(); quantize. Shader->enable(); int levels = 16; void quantize. And. Histogram(){ quantized. Buffer->set. Render. Target(); quantize. Shader->enable();](http://slidetodoc.com/presentation_image_h2/98c971aceaf1245f23f8f5d2f255a745/image-11.jpg)
int levels = 16; void quantize. And. Histogram(){ quantized. Buffer->set. Render. Target(); quantize. Shader->enable(); quantize. Shader->bind. Uniform. Texture("input. Buffer", texture->get. Texture. Handle(), 0); quantize. Shader->bind. Uniform. Int("levels", levels); fullscreen. Quad->render(quantize. Shader); quantize. Shader->disable(); quantized. Buffer->disable. Render. Target(); histogram. Buffer->clear(); gl. Enable(GL_BLEND); gl. Blend. Func(GL_ONE, GL_ONE); histogram. Buffer->set. Render. Target(); histogram. Shader->enable(); histogram. Shader->bind. Uniform. Texture("input. Buffer", quantized. Buffer->get. Color. Buffer(0), 0); grid->render(histogram. Shader); histogram. Shader->disable(); histogram. Buffer->disable. Render. Target(); gl. Disable(GL_BLEND); gl. Finish(); float histogram[255] = {0. 0 f}; gl. Bind. Framebuffer(GL_FRAMEBUFFER, histogram. Buffer->get. Handle()); gl. Read. Buffer(GL_COLOR_ATTACHMENT 0); gl. Read. Pixels(0, 0, 255, 1, GL_RED, GL_FLOAT, histogram); gl. Bind. Framebuffer(GL_FRAMEBUFFER, 0); int max. Value = 0; for(int i = 0; i < 255; ++i){ max. Value = max. Value > histogram[i] ? max. Value : histogram[i]; } gl. Viewport(0, 0, window. Width, window. Height); visualize. Shader->enable(); visualize. Shader->bind. Uniform. Texture("input. Buffer", histogram. Buffer->get. Color. Buffer(0), 0); visualize. Shader->bind. Uniform. Texture("original", quantized. Buffer->get. Color. Buffer(0), 1); visualize. Shader->bind. Uniform. Int("max. Value", max. Value); fullscreen. Quad->render(visualize. Shader); visualize. Shader->disable(); gl. Finish(); } Kvantálás
![#version 130 uniform sampler 2 D input. Buffer; uniform int levels; in vec 2 #version 130 uniform sampler 2 D input. Buffer; uniform int levels; in vec 2](http://slidetodoc.com/presentation_image_h2/98c971aceaf1245f23f8f5d2f255a745/image-12.jpg)
#version 130 uniform sampler 2 D input. Buffer; uniform int levels; in vec 2 f. Tex. Coord; out vec 4 out. Color; float I (vec 2 coord){ vec 4 color = texture(input. Buffer, coord); return(dot(color. rgb, vec 3(0. 21, 0. 39, 0. 4))); } void main(){ float data = I(f. Tex. Coord); float threshold = 1. 0 / levels; while(data > threshold){ threshold += 1. 0 / levels; } out. Color = vec 4(threshold); } quantize. frag
![Próba Próba](http://slidetodoc.com/presentation_image_h2/98c971aceaf1245f23f8f5d2f255a745/image-13.jpg)
Próba
![Hisztogram kiegyenlítés • Szükséges osztálypéldányok: Framebuffer* U_histogram. Buffer = NULL; Framebuffer* U_cumulated. Histogram. Buffer[2] Hisztogram kiegyenlítés • Szükséges osztálypéldányok: Framebuffer* U_histogram. Buffer = NULL; Framebuffer* U_cumulated. Histogram. Buffer[2]](http://slidetodoc.com/presentation_image_h2/98c971aceaf1245f23f8f5d2f255a745/image-14.jpg)
Hisztogram kiegyenlítés • Szükséges osztálypéldányok: Framebuffer* U_histogram. Buffer = NULL; Framebuffer* U_cumulated. Histogram. Buffer[2] = {NULL}; Framebuffer* U_equalized. Buffer = NULL; Shader* compute. Histogram = NULL; Shader* compute. Cumulative. Histogram = NULL; Shader* compute. Equalized. Histogram = NULL; Shader* histogram. Shader = NULL; Shader* visualize. Shader = NULL; const int histogram. Levels = 256;
![Hisztogram kiegyenlítés compute. Histogram = new Shader("histogram. vert", "histogram. frag"); compute. Cumulative. Histogram = Hisztogram kiegyenlítés compute. Histogram = new Shader("histogram. vert", "histogram. frag"); compute. Cumulative. Histogram =](http://slidetodoc.com/presentation_image_h2/98c971aceaf1245f23f8f5d2f255a745/image-15.jpg)
Hisztogram kiegyenlítés compute. Histogram = new Shader("histogram. vert", "histogram. frag"); compute. Cumulative. Histogram = new Shader("passthrough. vert", "compute. Cumulative. Histogram. frag"); compute. Equalized. Histogram = new Shader("passthrough. vert", "compute. Equalized. Histogram. frag"); histogram. Shader = new Shader("compute. Histogram. vert", "compute. Histogram. frag"); visualize. Shader = new Shader("passthrough. vert", "visualize. frag"); U_histogram. Buffer = new Framebuffer(histogram. Levels, 1, 1); U_equalized. Buffer = new Framebuffer(texture->get. Width(), texture>get. Height(), 1); U_cumulated. Histogram. Buffer[0] = new Framebuffer(histogram. Levels, 1, 1); U_cumulated. Histogram. Buffer[1] = new Framebuffer(histogram. Levels, 1, 1);
![Hisztogram kiegyenlítés void histogram. Equalize(){ U_histogram. Buffer->clear(); U_cumulated. Histogram. Buffer[0]->clear(); U_cumulated. Histogram. Buffer[1]->clear(); // Hisztogram kiegyenlítés void histogram. Equalize(){ U_histogram. Buffer->clear(); U_cumulated. Histogram. Buffer[0]->clear(); U_cumulated. Histogram. Buffer[1]->clear(); //](http://slidetodoc.com/presentation_image_h2/98c971aceaf1245f23f8f5d2f255a745/image-16.jpg)
Hisztogram kiegyenlítés void histogram. Equalize(){ U_histogram. Buffer->clear(); U_cumulated. Histogram. Buffer[0]->clear(); U_cumulated. Histogram. Buffer[1]->clear(); // generate histogram gl. Enable(GL_BLEND); gl. Blend. Func(GL_ONE, GL_ONE); U_histogram. Buffer->set. Render. Target(); compute. Histogram->enable(); compute. Histogram->bind. Uniform. Texture("input. Map", texture->get. Texture. Handle(), 0); compute. Histogram->bind. Uniform. Float("incr", 1. 0 ); compute. Histogram->bind. Uniform. Float("histogram. Levels", histogram. Levels); grid->render(compute. Histogram); compute. Histogram->disable(); U_histogram. Buffer->disable. Render. Target(); gl. Disable(GL_BLEND);
![Hisztogram kiegyenlítés // compute cumulative histogram float offset = 1. 0 f / (float)histogram. Hisztogram kiegyenlítés // compute cumulative histogram float offset = 1. 0 f / (float)histogram.](http://slidetodoc.com/presentation_image_h2/98c971aceaf1245f23f8f5d2f255a745/image-17.jpg)
Hisztogram kiegyenlítés // compute cumulative histogram float offset = 1. 0 f / (float)histogram. Levels; int passes = ceil(log(texture->get. Width()) / log(2)); int input. Buffer = 0; for(int i=0; i < passes; ++i){ U_cumulated. Histogram. Buffer[(input. Buffer + 1) % 2]->set. Render. Target(); compute. Cumulative. Histogram->enable(); compute. Cumulative. Histogram->bind. Uniform. Texture("input. Map", 0 == i ? U_histogram. Buffer->get. Color. Buffer(0) : U_cumulated. Histogram. Buffer[input. Buffer]->get. Color. Buffer(0), 0); compute. Cumulative. Histogram->bind. Uniform. Float("offset", -offset); fullscreen. Quad->render(compute. Cumulative. Histogram); compute. Cumulative. Histogram->disable(); U_cumulated. Histogram. Buffer[(input. Buffer + 1) % 2]->disable. Render. Target(); input. Buffer = (input. Buffer + 1) % 2; offset *= 2. 0 f; }
![Hisztogram kiegyenlítés U_equalized. Buffer->clear(); U_equalized. Buffer->set. Render. Target(); compute. Equalized. Histogram->enable(); compute. Equalized. Histogram->bind. Hisztogram kiegyenlítés U_equalized. Buffer->clear(); U_equalized. Buffer->set. Render. Target(); compute. Equalized. Histogram->enable(); compute. Equalized. Histogram->bind.](http://slidetodoc.com/presentation_image_h2/98c971aceaf1245f23f8f5d2f255a745/image-18.jpg)
Hisztogram kiegyenlítés U_equalized. Buffer->clear(); U_equalized. Buffer->set. Render. Target(); compute. Equalized. Histogram->enable(); compute. Equalized. Histogram->bind. Uniform. Texture("input. Map", texture->get. Texture. Handle(), 0); compute. Equalized. Histogram->bind. Uniform. Texture("histogram", U_cumulated. Histogram. Buffer[input. Buffer]->get. Color. Buffer(0), 1); fullscreen. Quad->render(compute. Equalized. Histogram); compute. Equalized. Histogram->disable(); U_equalized. Buffer->disable. Render. Target();
![Hisztogram kiegyenlítés U_histogram. Buffer->clear(); gl. Enable(GL_BLEND); gl. Blend. Func(GL_ONE, GL_ONE); U_histogram. Buffer->set. Render. Target(); Hisztogram kiegyenlítés U_histogram. Buffer->clear(); gl. Enable(GL_BLEND); gl. Blend. Func(GL_ONE, GL_ONE); U_histogram. Buffer->set. Render. Target();](http://slidetodoc.com/presentation_image_h2/98c971aceaf1245f23f8f5d2f255a745/image-19.jpg)
Hisztogram kiegyenlítés U_histogram. Buffer->clear(); gl. Enable(GL_BLEND); gl. Blend. Func(GL_ONE, GL_ONE); U_histogram. Buffer->set. Render. Target(); compute. Histogram->enable(); compute. Histogram->bind. Uniform. Texture("input. Map", U_equalized. Buffer>get. Color. Buffer(0), 0); compute. Histogram->bind. Uniform. Float("incr", 1. 0 ); compute. Histogram->bind. Uniform. Float("histogram. Levels", histogram. Levels); grid->render(compute. Histogram); compute. Histogram->disable(); U_histogram. Buffer->disable. Render. Target(); gl. Disable(GL_BLEND); gl. Finish();
![Hisztogram kiegyenlítés float histogram[255] = {0. 0 f}; gl. Bind. Framebuffer(GL_FRAMEBUFFER, U_histogram. Buffer->get. Handle()); Hisztogram kiegyenlítés float histogram[255] = {0. 0 f}; gl. Bind. Framebuffer(GL_FRAMEBUFFER, U_histogram. Buffer->get. Handle());](http://slidetodoc.com/presentation_image_h2/98c971aceaf1245f23f8f5d2f255a745/image-20.jpg)
Hisztogram kiegyenlítés float histogram[255] = {0. 0 f}; gl. Bind. Framebuffer(GL_FRAMEBUFFER, U_histogram. Buffer->get. Handle()); gl. Read. Buffer(GL_COLOR_ATTACHMENT 0); gl. Read. Pixels(0, 0, 255, 1, GL_RED, GL_FLOAT, histogram); gl. Bind. Framebuffer(GL_FRAMEBUFFER, 0); int max. Value = 0; for(int i = 0; i < 255; ++i){ max. Value = max. Value > histogram[i] ? max. Value : histogram[i]; } gl. Viewport(0, 0, window. Width, window. Height); visualize. Shader->enable(); visualize. Shader->bind. Uniform. Texture("input. Buffer", U_histogram. Buffer->get. Color. Buffer(0), 0); visualize. Shader->bind. Uniform. Texture("original", U_equalized. Buffer->get. Color. Buffer(0), 1); visualize. Shader->bind. Uniform. Int("max. Value", max. Value); fullscreen. Quad->render(visualize. Shader); visualize. Shader->disable(); gl. Finish(); }
![cumulative. Hist. frag #version 130 uniform sampler 2 D input. Map; uniform float offset; cumulative. Hist. frag #version 130 uniform sampler 2 D input. Map; uniform float offset;](http://slidetodoc.com/presentation_image_h2/98c971aceaf1245f23f8f5d2f255a745/image-21.jpg)
cumulative. Hist. frag #version 130 uniform sampler 2 D input. Map; uniform float offset; in vec 2 f. Tex. Coord; out vec 4 out. Color; void main(void){ float current = texture(input. Map, f. Tex. Coord). x; float sample. Off = f. Tex. Coord. x + offset; float add. Value = 0. 0; if(sample. Off >= 0. 0){ add. Value = texture(input. Map, vec 2(sample. Off, 0. 0)). x; } out. Color = vec 4(current + add. Value); }
![#version 130 uniform sampler 2 D input. Map; uniform sampler 2 D histogram; equalized. #version 130 uniform sampler 2 D input. Map; uniform sampler 2 D histogram; equalized.](http://slidetodoc.com/presentation_image_h2/98c971aceaf1245f23f8f5d2f255a745/image-22.jpg)
#version 130 uniform sampler 2 D input. Map; uniform sampler 2 D histogram; equalized. Hist. frag in vec 2 f. Tex. Coord; out vec 4 out. Color; float I (vec 2 coord){ vec 4 color = texture(input. Map, coord); return(dot(color. rgb, vec 3(0. 21, 0. 39, 0. 4))); } void main(void){ vec 2 size = texture. Size(input. Map, 0); float current = I(f. Tex. Coord); float accum = texture(histogram, vec 2(current, 0. 0)). x; float bin = accum / size. x / size. y; out. Color = vec 4(bin) ; }
![Próba Próba](http://slidetodoc.com/presentation_image_h2/98c971aceaf1245f23f8f5d2f255a745/image-23.jpg)
Próba
![Tone Mapping • Szükséges osztálypéldányok: Texture 2 D* hdr. Texture; Framebuffer* sat. HDRBuffer[2] = Tone Mapping • Szükséges osztálypéldányok: Texture 2 D* hdr. Texture; Framebuffer* sat. HDRBuffer[2] =](http://slidetodoc.com/presentation_image_h2/98c971aceaf1245f23f8f5d2f255a745/image-24.jpg)
Tone Mapping • Szükséges osztálypéldányok: Texture 2 D* hdr. Texture; Framebuffer* sat. HDRBuffer[2] = {NULL, NULL}; Framebuffer* hdr. Lum. Buffer = NULL; Framebuffer* hdr. Rel. Lum. Buffer = NULL; Shader* hdr. Luminance. Shader = NULL; Shader* hdr. Sat. XShader = NULL; Shader* hdr. Sat. YShader = NULL; Shader* hdr. Rel. Lum. Shader = NULL; Shader* hdr. Tone. Map. Shader = NULL; float W = 0. 9 f; float alpha = 0. 5 f;
![Tone Mapping sat. HDRBuffer[0] = new Framebuffer(hdr. Texture->get. Width(), hdr. Texture->get. Height(), 1); sat. Tone Mapping sat. HDRBuffer[0] = new Framebuffer(hdr. Texture->get. Width(), hdr. Texture->get. Height(), 1); sat.](http://slidetodoc.com/presentation_image_h2/98c971aceaf1245f23f8f5d2f255a745/image-25.jpg)
Tone Mapping sat. HDRBuffer[0] = new Framebuffer(hdr. Texture->get. Width(), hdr. Texture->get. Height(), 1); sat. HDRBuffer[1] = new Framebuffer(hdr. Texture->get. Width(), hdr. Texture->get. Height(), 1); hdr. Lum. Buffer = new Framebuffer(hdr. Texture->get. Width(), hdr. Texture->get. Height(), 1); hdr. Rel. Lum. Buffer = new Framebuffer(hdr. Texture->get. Width(), hdr. Texture->get. Height(), 1); hdr. Sat. XShader = new Shader("passthrough. vert", "satx. frag"); hdr. Sat. YShader = new Shader("passthrough. vert", "saty. frag"); hdr. Tone. Map. Shader = new Shader("passthrough. vert", "tonemap. frag"); hdr. Luminance. Shader = new Shader("passthrough. vert", "luminance. frag"); hdr. Rel. Lum. Shader = new Shader("passthrough. vert", "rellum. frag"); hdr. Texture = new Texture 2 D(); hdr. Texture->load. From. File(std: : string("free_005. hdr"));
![Tone Mapping void tone. Map(){ // generate luminance hdr. Lum. Buffer->clear(); hdr. Lum. Buffer->set. Tone Mapping void tone. Map(){ // generate luminance hdr. Lum. Buffer->clear(); hdr. Lum. Buffer->set.](http://slidetodoc.com/presentation_image_h2/98c971aceaf1245f23f8f5d2f255a745/image-26.jpg)
Tone Mapping void tone. Map(){ // generate luminance hdr. Lum. Buffer->clear(); hdr. Lum. Buffer->set. Render. Target(); hdr. Luminance. Shader->enable(); hdr. Luminance. Shader->bind. Uniform. Texture("hdr", hdr. Texture->get. Texture. Handle(), 0); fullscreen. Quad->render(hdr. Luminance. Shader); hdr. Luminance. Shader->disable(); hdr. Lum. Buffer->disable. Render. Target();
![Tone Mapping // generate SAT float offset = 1. 0 f / (float)hdr. Texture->get. Tone Mapping // generate SAT float offset = 1. 0 f / (float)hdr. Texture->get.](http://slidetodoc.com/presentation_image_h2/98c971aceaf1245f23f8f5d2f255a745/image-27.jpg)
Tone Mapping // generate SAT float offset = 1. 0 f / (float)hdr. Texture->get. Width(); int passes = ceil(log(hdr. Texture->get. Width()) / log(2)); int input. Buffer = 0; for(int i = 0; i < passes; ++i){ sat. HDRBuffer[(input. Buffer + 1) % 2 ]->set. Render. Target(); hdr. Sat. XShader->enable(); hdr. Sat. XShader->bind. Uniform. Texture("input. Map", i == 0 ? hdr. Lum. Buffer->get. Color. Buffer(0) : sat. HDRBuffer[input. Buffer]->get. Color. Buffer(0), 0); hdr. Sat. XShader->bind. Uniform. Float("offset", -offset); fullscreen. Quad->render(hdr. Sat. XShader); hdr. Sat. XShader->disable(); sat. HDRBuffer[(input. Buffer + 1) % 2 ]->disable. Render. Target(); input. Buffer = (input. Buffer + 1) % 2; sat. HDRBuffer[(input. Buffer + 1) % 2 ]->set. Render. Target(); hdr. Sat. YShader->enable(); hdr. Sat. YShader->bind. Uniform. Texture("input. Map", sat. HDRBuffer[input. Buffer]->get. Color. Buffer(0), 0); hdr. Sat. YShader->bind. Uniform. Float("offset", -offset); fullscreen. Quad->render(hdr. Sat. YShader); hdr. Sat. YShader->disable(); sat. HDRBuffer[(input. Buffer + 1) % 2 ]->disable. Render. Target(); } input. Buffer = (input. Buffer + 1) % 2; offset *= 2. 0 f;
![Tone Mapping hdr. Rel. Lum. Buffer->clear(); hdr. Rel. Lum. Buffer->set. Render. Target(); hdr. Rel. Tone Mapping hdr. Rel. Lum. Buffer->clear(); hdr. Rel. Lum. Buffer->set. Render. Target(); hdr. Rel.](http://slidetodoc.com/presentation_image_h2/98c971aceaf1245f23f8f5d2f255a745/image-28.jpg)
Tone Mapping hdr. Rel. Lum. Buffer->clear(); hdr. Rel. Lum. Buffer->set. Render. Target(); hdr. Rel. Lum. Shader->enable(); hdr. Rel. Lum. Shader->bind. Uniform. Texture("luminance. Map", hdr. Lum. Buffer->get. Color. Buffer(0), 0); hdr. Rel. Lum. Shader->bind. Uniform. Texture("sat", sat. HDRBuffer[input. Buffer]->get. Color. Buffer(0), 1); hdr. Rel. Lum. Shader->bind. Uniform. Float("alpha", alpha); fullscreen. Quad->render(hdr. Rel. Lum. Shader); hdr. Rel. Lum. Shader->disable(); hdr. Rel. Lum. Buffer->disable. Render. Target();
![Tone Mapping hdr. Tone. Map. Shader->enable(); hdr. Tone. Map. Shader->bind. Uniform. Texture("hdr", hdr. Texture->get. Tone Mapping hdr. Tone. Map. Shader->enable(); hdr. Tone. Map. Shader->bind. Uniform. Texture("hdr", hdr. Texture->get.](http://slidetodoc.com/presentation_image_h2/98c971aceaf1245f23f8f5d2f255a745/image-29.jpg)
Tone Mapping hdr. Tone. Map. Shader->enable(); hdr. Tone. Map. Shader->bind. Uniform. Texture("hdr", hdr. Texture->get. Texture. Handle(), 0); hdr. Tone. Map. Shader>bind. Uniform. Texture("rellum", hdr. Rel. Lum. Buffer>get. Color. Buffer(0), 1); hdr. Tone. Map. Shader->bind. Uniform. Float("W", W); fullscreen. Quad->render(hdr. Tone. Map. Shader); hdr. Tone. Map. Shader->disable(); }
![luminance. frag #version 130 uniform sampler 2 D hdr; in vec 2 f. Tex. luminance. frag #version 130 uniform sampler 2 D hdr; in vec 2 f. Tex.](http://slidetodoc.com/presentation_image_h2/98c971aceaf1245f23f8f5d2f255a745/image-30.jpg)
luminance. frag #version 130 uniform sampler 2 D hdr; in vec 2 f. Tex. Coord; out vec 4 out. Color; void main(void){ vec 4 color = texture(hdr, f. Tex. Coord); out. Color = vec 4(color. r * 0. 2126, color. g * 0. 7152, color. b * 0. 0722, 1. 0); }
![sat. X. frag #version 130 uniform sampler 2 D input. Map; uniform float offset; sat. X. frag #version 130 uniform sampler 2 D input. Map; uniform float offset;](http://slidetodoc.com/presentation_image_h2/98c971aceaf1245f23f8f5d2f255a745/image-31.jpg)
sat. X. frag #version 130 uniform sampler 2 D input. Map; uniform float offset; in vec 2 f. Tex. Coord; out vec 4 out. Color; void main(void){ float c = texture(input. Map, f. Tex. Coord). r; vec 2 sample. Off = f. Tex. Coord + vec 2(offset, 0); float add. Value = 0. 0 f; if(sample. Off. x >= 0. 0){ add. Value = texture(input. Map, sample. Off). r; } out. Color = vec 4(c + add. Value); }
![sat. Y. frag #version 130 uniform sampler 2 D input. Map; uniform float offset; sat. Y. frag #version 130 uniform sampler 2 D input. Map; uniform float offset;](http://slidetodoc.com/presentation_image_h2/98c971aceaf1245f23f8f5d2f255a745/image-32.jpg)
sat. Y. frag #version 130 uniform sampler 2 D input. Map; uniform float offset; in vec 2 f. Tex. Coord; out vec 4 out. Color; void main(void){ float c = texture(input. Map, f. Tex. Coord). r; vec 2 sample. Off = f. Tex. Coord + vec 2(0. 0, offset); float add. Value = 0. 0 f; if(sample. Off. y >= 0. 0){ add. Value = texture(input. Map, sample. Off). r; } out. Color = vec 4(c + add. Value); }
![#version 130 rellum. frag uniform sampler 2 D luminance. Map; uniform sampler 2 D #version 130 rellum. frag uniform sampler 2 D luminance. Map; uniform sampler 2 D](http://slidetodoc.com/presentation_image_h2/98c971aceaf1245f23f8f5d2f255a745/image-33.jpg)
#version 130 rellum. frag uniform sampler 2 D luminance. Map; uniform sampler 2 D sat; uniform float alpha; in vec 2 f. Tex. Coord; out vec 4 out. Color; void main(void){ vec 2 map. Size = texture. Size(sat, 0); float avg = texture(sat, vec 2(1. 0, 1. 0)). r / map. Size. x / map. Size. y; out. Color = alpha * texture(luminance. Map, f. Tex. Coord) / avg; }
![tonemap. frag #version 130 uniform sampler 2 D hdr; uniform sampler 2 D rellum; tonemap. frag #version 130 uniform sampler 2 D hdr; uniform sampler 2 D rellum;](http://slidetodoc.com/presentation_image_h2/98c971aceaf1245f23f8f5d2f255a745/image-34.jpg)
tonemap. frag #version 130 uniform sampler 2 D hdr; uniform sampler 2 D rellum; uniform float W; in vec 2 f. Tex. Coord; out vec 4 out. Color; void main(void){ float Yr = texture(rellum, f. Tex. Coord). x / 320000; vec 4 hdr. Color = texture(hdr, f. Tex. Coord); out. Color = hdr. Color * ( Yr * ( 1 + Yr / W) / (1 + Yr) ); }
![Próba Próba](http://slidetodoc.com/presentation_image_h2/98c971aceaf1245f23f8f5d2f255a745/image-35.jpg)
Próba
![VÉGE VÉGE](http://slidetodoc.com/presentation_image_h2/98c971aceaf1245f23f8f5d2f255a745/image-36.jpg)
VÉGE
- Slides: 36