SlideShare a Scribd company logo
1 of 313
Download to read offline
Uncharted 2: HDR Lighting,[object Object],John Hable,[object Object],Naughty Dog,[object Object]
Agenda,[object Object],Gamma/Linear-Space Lighting,[object Object],Filmic Tonemapping,[object Object],SSAO,[object Object],Rendering Architecture/How it all fits together.,[object Object]
Skeletons in the Closet,[object Object],[object Object]
Ucap Project
I.e. Tiger Woods's Face
Also used to work for EA Los Angeles
LMNO (Spielberg Project)‏
Not PQRS (Boom Blox)‏
Now at Naughty Dog
Uncharted 2,[object Object]
Gamma,[object Object],[object Object]
Never heard about it in college
George Borshukov taught it to me back at EA
Matrix Sequels
Issue is getting more traction now
Eugene d’Eon’s chapter in GPU Gems 3,[object Object]
Suppose we show alternating light/dark lines.
If we squint, we get half the linear intensity.,[object Object]
Real image of a computer screen shot from my camera.,[object Object],[object Object],[object Object]
That’s the box on the top.128,[object Object]
Demo,[object Object],[object Object]
WTF?128,[object Object],187,[object Object]
Color Ramp,[object Object],[object Object],0,[object Object],127,[object Object],255,[object Object],187,[object Object]
Gamma Lines,[object Object],255,[object Object],[object Object],187,[object Object],127,[object Object],0,[object Object]
What is Gamma,[object Object],[object Object]
Our monitors are the red one,[object Object],[object Object],[object Object],[object Object],[object Object]
How bad is it?,[object Object],[object Object]
So if you output the left image to the framebuffer, it will actually look like the one right.2.2,[object Object]
Let’s build a Camera…,[object Object],[object Object],Actual,[object Object],Light,[object Object],Monitor,[object Object],Output,[object Object],1.0,[object Object],2.2,[object Object],Hard,[object Object],Drive,[object Object]
Let’s build a Camera…,[object Object],[object Object],Actual,[object Object],Light,[object Object],Monitor,[object Object],Output,[object Object],.45,[object Object],2.2,[object Object],Hard,[object Object],Drive,[object Object]
How to fix this?,[object Object],[object Object]
This is stored on your hard drive.
You never see this image, but it’s on your hard drive.2.2,[object Object]
What is Gamma,[object Object],[object Object],[object Object]
How bad is it?,[object Object],[object Object]
What if displays were linear?,[object Object],[object Object]
On a scale from 0-255
0 would equal 0
1 would equal our current value of 20
2 would equal our current value of 28
3 would equal our current value of 33
Darkest Values:,[object Object],[object Object]
Note: we’re talking about “correct”, not “good”,[object Object]
3D Graphics,[object Object],[object Object]
color = pow( tex2D( Sampler, Uv ), 2.2 )‏
Do your lighting calculations
Account for gamma on color output
finalcolor = pow( color, 1/2.2 )‏,[object Object]
3D Graphics,[object Object],[object Object],[object Object]
3D Graphics,[object Object],[object Object],Spec = CalSpec();,[object Object],Diff = pow( tex2D( Sampler, UV ), 2.2 );,[object Object],Color = Diff * max( 0, dot( N, L ) ) + Spec;,[object Object],return pow( Color, 1/2.2);,[object Object]
3D Graphics,[object Object],[object Object]
Hardware does sampling for free
For Texture read:
D3DSAMP_SRGBTEXTURE
For RenderTarget write:
D3DRS_SRGBWRITEENABLE,[object Object]
3D Graphics,[object Object],[object Object]
Notice the harsh line.,[object Object],[object Object]
FAQs,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
Gamma-Space
Use sRGB hardware or pow(2.2) on read
128 ~= 0.2
Linear-Space
Don’t use sRGB or pow(2.2) on read
128 = 0.5,[object Object]
Definitely Gamma
Normal Map
Definitely Linear,[object Object]
Uncharted 2 had them as Linear
Artists have trouble tweaking them to look right
Probably should be in Gamma,[object Object]
Technically, it’s a mathematical value like a normal map.
But artists tweak them a lot and bake extra lighting into them.
Uncharted 2 had them as Linear
Probably should be Gamma,[object Object]
sRGB: PC and PS3 gamma
Xenon PWL: Piecewise linear gamma,[object Object]
Way too bright at the low end.
HDR the Bungie Way, Chris Tchou
Post Processing in The Orange Box, Alex Vlachos
Output curve is extra contrasty
Henry LaBounta was going to talk about it.
Try hooking up your Xenon to a waveform monitor and display a test pattern.  Prepare to be mortified.
Both factors counteract each other,[object Object]
Part 2: Filmic Tonemaping,[object Object]
Filmic Tonemapping,[object Object],[object Object],[object Object]
Full Auto settings.
Outside blown out.
Cello case looks empty.
My eye somehow adjusts...,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
Note: 1 F-Stop is a power of two
So 4 F-stops is 2^4=16x difference in intensity,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
Good News: HDR Image
Bad News: Now what?
Re-tweaking exposure won't help,[object Object]
Photomatix
This one is local
The one we’ll use is global,[object Object]
Simulate the Iris
Dynamic Range in different shots
Tunnel vs. Daylight
Simulate the Retina
Different Range within a shot
Inside looking outside,[object Object]
Within a Shot – HDR Tonemapping
Different Shots – Choosing the correct exposure?
Video Games
Within a Shot – HDR Tonemapping
Different Shots – HDR Tonemapping?,[object Object]
Within a Shot – HDR Tonemapping
Different Shots
Automatic Exposure Adjustment
Dynamic Iris,[object Object]
Creative Director, Microsoft Game Studios
Used to be Art Director on LMNO at EA,[object Object],[object Object]
Simplest version is:
F(x) = x/(x+1)
Yes, I’m oversimplifiying for time.,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
The crisper, more saturated blacks of improper gamma.
The nice soft highlights of Reinhard
And get the input colors to actually match like pure linear.,[object Object],[object Object]
CG Supervisor at Digital Domain
Used to be a CG Supervisor on LMNO at EA,[object Object]
Film,[object Object],[object Object],Shoulder,[object Object],Toe,[object Object]
Film,[object Object],[object Object]
Film vs. Digital purists.
Who would’ve thought: Kodak knows how to make good film.,[object Object],[object Object]
Filmic Tonemapping,[object Object],[object Object],Reinhard,[object Object],Linear,[object Object],Filmic,[object Object]
Filmic Tonemapping,[object Object],[object Object],Reinhard,[object Object],Linear,[object Object],Filmic,[object Object]
Filmic Tonemapping,[object Object],[object Object],Reinhard,[object Object],Linear,[object Object],Filmic,[object Object]
Filmic Tonemapping,[object Object],[object Object],Reinhard,[object Object],Linear,[object Object],Filmic,[object Object]
Filmic Tonemapping,[object Object],[object Object],Reinhard,[object Object],Linear,[object Object],Filmic,[object Object]
Filmic Tonemapping,[object Object],[object Object],Reinhard,[object Object],Linear,[object Object],Filmic,[object Object]
Filmic Tonemapping,[object Object],[object Object],Reinhard,[object Object],Linear,[object Object],Filmic,[object Object]
Filmic Tonemapping,[object Object],[object Object],Reinhard,[object Object],Linear,[object Object],Filmic,[object Object]
Filmic Tonemapping,[object Object],[object Object]
Filmic > Linear > Reinhard
In terms of “Soft Highights” vs. “Clamped Highlights”
Filmic = Reinhard > Linear,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
What happens if we go down?
Notice the crisper blacks in the filmic version.,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
Filmic Tonemapping,[object Object],[object Object],254,[object Object],248,[object Object],224,[object Object],240,[object Object],252,[object Object]
More Magic,[object Object],[object Object]
Three texture lookups
Jim Hejl to the rescue	Principle Member of Technical Staff,[object Object],	GPU Group, Office of the CTO,[object Object],	AMD Research,[object Object],[object Object],[object Object]
Replaces the entire Lin/Log and Texture LUT
Includes the pow(x,1/2.2)‏x = max(0, LinearColor-0.004);,[object Object],GammaColor = (x*(6.2*x+0.5))/(x*(6.2*x+1.7)+0.06);,[object Object]
Filmic Tonemapping,[object Object],[object Object]
Toe arguably too strong
Most monitors are too contrasty, strong toe makes it worse
May want less shoulder
The more range, the more shoulder
If your scene lacks range, you want to tone down the shoulder a bit,[object Object]
Filmic Tonemapping,[object Object],Shoulder Strength = 0.22,[object Object],Linear Strength = 0.30,[object Object],Linear Angle = 0.10,[object Object],Toe Strength = 0.20,[object Object],Toe Numerator = 0.01,[object Object],Toe Denominator = 0.30,[object Object],Linear White Point Value = 11.2,[object Object],These numbers DO NOT have the pow(x,1/2.2) baked in,[object Object]
Conclusions,[object Object],[object Object]
IMO: The most important post effect
Changes your life completely
Once you have it, you can't live without it
If you implement it, you have to redo all your lighting
You can't just switch it on if your lighting is tweaked for no dynamic range.,[object Object]
Part 3: SSAO,[object Object]
SSAO Time,[object Object],[object Object]
Time for stage 3.
Let’s talk about why you need AO.,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
But if you are already in shadow, you need something else...
It's the AO that grounds the car in those shots.
So what if we took the AO out?
Trick taught to me by Habib (the guy with the awesome condo earlier)‏,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
Sky is Hemisphere Light (ish)‏,[object Object]
Sky is Blue (ish)‏,[object Object]
Approximate Directional Shadow with Shadow Mapping,[object Object]
Approximate Hemisphere Shadow with AO,[object Object],[object Object]
How to use AO?,[object Object]
How to use AO?,[object Object]
How to use AO?,[object Object]
How to use AO?,[object Object]
Sunlight,[object Object],Q) Why not have it affect sunlight?,[object Object],A) It does the exact opposite of what you want it to do.,[object Object]
SSAO Example,[object Object],[object Object],[object Object],[object Object]
SSAO Darkens Sunlight – BAD
Reduces perceived contrast
Makes lighting look flatter
My Opinion: SSAO should NOT affect Direct Light,[object Object]
No normals
No special filtering (I.e. Bilateral)‏
Processed in 64x64 blocks
Adjacent Depth tiles included as well,[object Object]
Dilate Horizontal
Dilate Vertical
Apply Low Pass Filter,[object Object]
SSAO Passes,[object Object],1) Base SSAO,[object Object]
SSAO Passes,[object Object],2) Dilate Horizontal,[object Object]
SSAO Passes,[object Object],3) Dilate Vertical,[object Object]
SSAO Passes,[object Object],4) Low Pass Filter,[object Object],	(I.e. blur the $&%@ out of it)‏,[object Object]
SSAO Passes,[object Object],[object Object]
Uses half-res depth buffer
Calculate AO based on nearby depth samples,[object Object],[object Object],[object Object]
Our solution is much hackier.,[object Object],[object Object],[object Object]
Half Volume = Fully Unoccluded,[object Object]
Half Volume = Fully Unoccluded,[object Object]
Half Volume = Fully Unoccluded,[object Object]
Half Volume = Fully Unoccluded,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
Artifacts,[object Object],[object Object]
Crossing Pattern,[object Object],[object Object],[object Object],[object Object]
Benefits outweigh drawbacks
Have option to turn it off per surface
Most snow fades at distance
Some objects apply sqrt() to brighten it
Some objects just have it off,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
Deepens our Blacks
Artifacts are not too bad
Could use better filtering for halos
Runs on SPUs, and doesn’t need normal buffer,[object Object]
Architecture,[object Object],[object Object]
Here is the base overview.
Skip some things,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
Calculate lighting in Tiles,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
Frame 1,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
This was news to me when I started here.,[object Object]
Say you have 5 loads to do
1 washer, 1 dryer,[object Object]
Load 1 in Dryer
Load 2 in Washer
Load 2 in Dryer
Load 3 in Washer
Load 3 in Dryer
Load 4 in Washer
Load 4 in Dryer
Load 5 in Washer
Load 5 in Dryer,[object Object]
Load 2 in Washer, Load 1 in Dryer
Load 3 in Washer, Load 2 in Dryer
Load 4 in Washer, Load 3 in Dryer
Load 5 in Washer, Load 4 in Dryer
Load 5 in Dryer,[object Object]
Called “Software Pipelining”
It’s how we optimize SPU code by hand
Pal Engstad (our Lead Graphics Programmer) will be putting a doc online explaining the full process.
Should be online: look for the post on the blog
Direct links:
www.naughtydog.com/docs/gdc2010/intro-spu-optimizations-part-1.pdf
www.naughtydog.com/docs/gdc2010/intro-spu-optimizations-part-2.pdf,[object Object]
SPU Assembly 1/2,[object Object],EVEN,[object Object],ODD,[object Object],loop:,[object Object],		{nop}								{o6} lqxcurrAo, pvColor, colorOffset,[object Object],		{nop}								{o4} shufb prevAo0, currAo, currAo, s_AAAA,[object Object],		{nop}								{o4} shufb ao_n30, prevAo0, currAo, s_BCDa,[object Object],		{nop}								{o4} shufb ao_n20, prevAo0, currAo, s_CDab,[object Object],		{nop}								{o4} shufb ao_n10, prevAo0, currAo, s_Dabc,[object Object],	{e2} selb ao_n4, ao_n4, prevAo0, endLineMask					{lnop},[object Object],	{e2} selb ao_n3, ao_n3, ao_n30, endLineMask					{lnop},[object Object],	{e2} selb ao_n2, ao_n2, ao_n20, endLineMask					{lnop},[object Object],	{e2} selb ao_n1, ao_n1, ao_n10, endLineMask					{lnop},[object Object],		{nop}								{o6} lqxnextAo, pvNextColor, colorOffset,[object Object],	{nop}								{o4} shufb ao_p1, currAo, nextAo, s_BCDa,[object Object],		{nop}								{o4} shufb ao_p2, currAo, nextAo, s_CDab,[object Object],		{nop}								{o4} shufb ao_p3, currAo, nextAo, s_Dabc,[object Object],	{e6} fa ao_n4, ao_n4, nextAo							{lnop},[object Object],	{e6} fa ao_n3, ao_n3, ao_p3							{lnop},[object Object],	{e6} fa ao_n2, ao_n2, ao_p2							{lnop},[object Object],	{e6} fa ao_n1, ao_n1, ao_p1							{lnop},[object Object]
SPU Assembly 2/2,[object Object],EVEN,[object Object],ODD,[object Object],	{e6} fm blurAo, ao_n4, w4							{lnop},[object Object],	{e6} fma blurAo, ao_n3, w3, blurAo						{lnop},[object Object],	{e6} fma blurAo, ao_n2, w2, blurAo						{lnop},[object Object],	{e6} fma blurAo, ao_n1, w1, blurAo						{lnop},[object Object],	{e6} fmablurAo, currAo, w0, blurAo						{lnop},[object Object],		{nop}								{o6} stqxblurAo, pvColor, colorOffset,[object Object],		{nop}								{o4} shlqbii ao_n4, currAo, 0	,[object Object],		{nop}								{o4} shlqbii ao_n3, ao_p1, 0	,[object Object],		{nop}								{o4} shlqbii ao_n2, ao_p2, 0	,[object Object],		{nop}								{o4} shlqbii ao_n1, ao_p3, 0	,[object Object],	{e2} ceqendLineMask, colorOffset, endLineOffset				{lnop},[object Object],	{e2} ceqendBlockMask, colorOffset, endOffset					{lnop},[object Object],	{e2} selbendLineOffsetIncr, zero, colorLineBytes, endLineMask			{lnop},[object Object],	{e2} selbcolorOffsetIncr, defOffsetIncr, endColorOffsetIncr, endLineMask	{lnop},[object Object],	{e2} a endLineOffset, endLineOffset, endLineOffsetIncr				{lnop},[object Object],	{e2} a colorOffset, colorOffset, colorOffsetIncr				{lnop},[object Object],		{nop}							branch: {o?} brzendBlockMask, loop,[object Object]
SPU Assembly,[object Object],{e6} faao_n3, ao_n3, ao_p3{o6}lqxnextAo, pvNextColor, colorOffset,[object Object],[object Object]
SPUs issue one even and odd instruction per cycle
One line = One cycle
e6 = even, 6 cycle latency
o6 = odd, 6 cycle latency,[object Object]
Iteration 1,[object Object],loop:,[object Object],nop											lnop,[object Object],nop 					{o6:0} lqx currAo, pvColor, colorOffset,[object Object],nop 					{o6:0} lqx nextAo, pvNextColor, colorOffset,[object Object],nop 						{o4:0} shlqbiiendLineMask_, endLineMask, 0,[object Object],nop 											lnop  ,[object Object],nop 											lnop,[object Object],nop 						lnop,[object Object],nop 						{o4:0} shufb prevAo0, currAo, currAo, s_AAAA,[object Object],{e2:0} ceqendLineMask, colorOffset, endLineOffset				{o4:0} shufb ao_p1, currAo, nextAo, s_BCDa,[object Object],{e2:0} ceqendBlockMask, colorOffset_, endOffset				{o4:0} shufb ao_p2, currAo, nextAo, s_CDab,[object Object],{e2:0} selbendLineOffsetIncr, zero, colorLineBytes, endLineMask		{o4:0} shufb ao_p3, currAo, nextAo, s_Dabc,[object Object],{e2:0} selb ao_n4, currAo_, prevAo0, endLineMask_				{o4:0} shufb ao_n30, prevAo0, currAo, s_BCDa,[object Object],nop 						{o4:0} shufb ao_n20, prevAo0, currAo, s_CDab,[object Object],nop								{o4:0} shufb ao_n10, prevAo0, currAo, s_Dabc,[object Object],{e2:0} selbcolorOffsetIncr, defOffsetIncr, endColorOffsetIncr, endLineMask lnop,[object Object],{e2:0} selb ao_n3, ao_p1_, ao_n30, endLineMask_			{o4:0} shufbcolorOffset_, colorOffset_, colorOffset, s_BCa0,[object Object],{e2:0} selb ao_n2, ao_p2_, ao_n20, endLineMask_lnop,[object Object],{e2:0} selb ao_n1, ao_p3_, ao_n10, endLineMask_				lnop,[object Object],{e2:0} a colorOffset, colorOffset, colorOffsetIncrlnop,[object Object],{e2:0} a endLineOffset, endLineOffset, endLineOffsetIncrbranch: {o?:0} brzendBlockMask, loop		,[object Object]
Iteration 1,[object Object],loop:,[object Object],nop											lnop,[object Object],nop 					{o6:0} lqx currAo, pvColor, colorOffset,[object Object],nop 					{o6:0} lqx nextAo, pvNextColor, colorOffset,[object Object],nop 						{o4:0} shlqbiiendLineMask_, endLineMask, 0,[object Object],nop 											lnop  ,[object Object],nop 											lnop,[object Object],nop 						lnop,[object Object],nop 						{o4:0} shufb prevAo0, currAo, currAo, s_AAAA,[object Object],{e2:0} ceqendLineMask, colorOffset, endLineOffset				{o4:0} shufb ao_p1, currAo, nextAo, s_BCDa,[object Object],{e2:0} ceqendBlockMask, colorOffset_, endOffset				{o4:0} shufb ao_p2, currAo, nextAo, s_CDab,[object Object],{e2:0} selbendLineOffsetIncr, zero, colorLineBytes, endLineMask		{o4:0} shufb ao_p3, currAo, nextAo, s_Dabc,[object Object],{e2:0} selb ao_n4, currAo_, prevAo0, endLineMask_				{o4:0} shufb ao_n30, prevAo0, currAo, s_BCDa,[object Object],nop 						{o4:0} shufb ao_n20, prevAo0, currAo, s_CDab,[object Object],nop								{o4:0} shufb ao_n10, prevAo0, currAo, s_Dabc,[object Object],{e2:0} selbcolorOffsetIncr, defOffsetIncr, endColorOffsetIncr, endLineMask lnop,[object Object],{e2:0} selb ao_n3, ao_p1_, ao_n30, endLineMask_			{o4:0} shufbcolorOffset_, colorOffset_, colorOffset, s_BCa0,[object Object],{e2:0} selb ao_n2, ao_p2_, ao_n20, endLineMask_lnop,[object Object],{e2:0} selb ao_n1, ao_p3_, ao_n10, endLineMask_				lnop,[object Object],{e2:0} a colorOffset, colorOffset, colorOffsetIncrlnop,[object Object],{e2:0} a endLineOffset, endLineOffset, endLineOffsetIncrbranch: {o?:0} brzendBlockMask, loop		,[object Object]
Problems,[object Object],[object Object],            {o6} lqxcurrAo, pvColor, colorOffset,[object Object],            {o4} shufb prevAo0, currAo, currAo, s_AAAA,[object Object],[object Object]
Next instruction needs currAo
currAo won’t be ready yet
Stall for 5 cycles,[object Object]
Iteration 1,[object Object],loop:,[object Object],nop											lnop,[object Object],nop 					{o6:0} lqx currAo, pvColor, colorOffset,[object Object],nop 					{o6:0} lqx nextAo, pvNextColor, colorOffset,[object Object],nop 						{o4:0} shlqbiiendLineMask_, endLineMask, 0,[object Object],nop 											lnop  ,[object Object],nop 											lnop,[object Object],nop 						lnop,[object Object],nop 						{o4:0} shufb prevAo0, currAo, currAo, s_AAAA,[object Object],{e2:0} ceqendLineMask, colorOffset, endLineOffset				{o4:0} shufb ao_p1, currAo, nextAo, s_BCDa,[object Object],{e2:0} ceqendBlockMask, colorOffset_, endOffset				{o4:0} shufb ao_p2, currAo, nextAo, s_CDab,[object Object],{e2:0} selbendLineOffsetIncr, zero, colorLineBytes, endLineMask		{o4:0} shufb ao_p3, currAo, nextAo, s_Dabc,[object Object],{e2:0} selb ao_n4, currAo_, prevAo0, endLineMask_				{o4:0} shufb ao_n30, prevAo0, currAo, s_BCDa,[object Object],nop 						{o4:0} shufb ao_n20, prevAo0, currAo, s_CDab,[object Object],nop								{o4:0} shufb ao_n10, prevAo0, currAo, s_Dabc,[object Object],{e2:0} selbcolorOffsetIncr, defOffsetIncr, endColorOffsetIncr, endLineMask lnop,[object Object],{e2:0} selb ao_n3, ao_p1_, ao_n30, endLineMask_			{o4:0} shufbcolorOffset_, colorOffset_, colorOffset, s_BCa0,[object Object],{e2:0} selb ao_n2, ao_p2_, ao_n20, endLineMask_lnop,[object Object],{e2:0} selb ao_n1, ao_p3_, ao_n10, endLineMask_				lnop,[object Object],{e2:0} a colorOffset, colorOffset, colorOffsetIncrlnop,[object Object],{e2:0} a endLineOffset, endLineOffset, endLineOffsetIncrbranch: {o?:0} brzendBlockMask, loop		,[object Object]
Iteration 2,[object Object],loop:,[object Object],nop											lnop,[object Object],{e6:1} fa ao_n4, ao_n4, nextAo	{o6:0} lqx currAo, pvColor, colorOffset,[object Object],{e6:1} fa ao_n3, ao_n3, ao_p3{o6:0} lqx nextAo, pvNextColor, colorOffset,[object Object],nop{o4:0} shlqbiiendLineMask_, endLineMask, 0,[object Object],{e6:1} fa ao_n1_, ao_n1, ao_p1	lnop,[object Object],{e6:1} fa ao_n2_, ao_n2, ao_p2	lnop,[object Object],noplnop,[object Object],{e6:1} fm blurAo, ao_n4, w4	{o4:0} shufb prevAo0, currAo, currAo, s_AAAA,[object Object],{e2:0} ceqendLineMask, colorOffset, endLineOffset				{o4:0} shufb ao_p1, currAo, nextAo, s_BCDa,[object Object],{e2:0} ceqendBlockMask, colorOffset_, endOffset				{o4:0} shufb ao_p2, currAo, nextAo, s_CDab,[object Object],{e2:0} selbendLineOffsetIncr, zero, colorLineBytes, endLineMask		{o4:0} shufb ao_p3, currAo, nextAo, s_Dabc,[object Object],{e2:0} selb ao_n4, currAo_, prevAo0, endLineMask_				{o4:0} shufb ao_n30, prevAo0, currAo, s_BCDa,[object Object],nop{o4:0} shufb ao_n20, prevAo0, currAo, s_CDab,[object Object],{e6:1} fma blurAo, ao_n3, w3, blurAo	{o4:0} shufb ao_n10, prevAo0, currAo, s_Dabc,[object Object],{e2:0} selbcolorOffsetIncr, defOffsetIncr, endColorOffsetIncr, endLineMasklnop ,[object Object],{e2:0} selb ao_n3, ao_p1_, ao_n30, endLineMask_			{o4:0} shufbcolorOffset_, colorOffset_, colorOffset, s_BCa0,[object Object],{e2:0} selb ao_n2, ao_p2_, ao_n20, endLineMask_lnop,[object Object],{e2:0} selb ao_n1, ao_p3_, ao_n10, endLineMask_				lnop,[object Object],{e2:0} a colorOffset, colorOffset, colorOffsetIncrlnop,[object Object],{e2:0} a endLineOffset, endLineOffset, endLineOffsetIncrbranch: {o?:0} brzendBlockMask, loop		,[object Object]
Iteration 3,[object Object],loop:,[object Object],nop				 							lnop,[object Object],{e6:1} fa ao_n4, ao_n4, nextAo	{o6:0} lqx currAo, pvColor, colorOffset,[object Object],{e6:1} fa ao_n3, ao_n3, ao_p3{o6:0} lqx nextAo, pvNextColor, colorOffset,[object Object],{e6:2} fmablurAo_, ao_n2_, w2, blurAo{o4:0} shlqbiiendLineMask_, endLineMask, 0,[object Object],{e6:1} fa ao_n1_, ao_n1, ao_p1	lnop,[object Object],{e6:1} fa ao_n2_, ao_n2, ao_p2	lnop,[object Object],nop 						lnop,[object Object],{e6:1} fm blurAo, ao_n4, w4	{o4:0} shufb prevAo0, currAo, currAo, s_AAAA,[object Object],{e2:0} ceqendLineMask, colorOffset, endLineOffset				{o4:0} shufb ao_p1, currAo, nextAo, s_BCDa,[object Object],{e2:0} ceqendBlockMask, colorOffset_, endOffset				{o4:0} shufb ao_p2, currAo, nextAo, s_CDab,[object Object],{e2:0} selbendLineOffsetIncr, zero, colorLineBytes, endLineMask		{o4:0} shufb ao_p3, currAo, nextAo, s_Dabc,[object Object],{e2:0} selb ao_n4, currAo_, prevAo0, endLineMask_				{o4:0} shufb ao_n30, prevAo0, currAo, s_BCDa,[object Object],{e6:2} fma blurAo__, ao_n1__, w1, blurAo_{o4:0} shufb ao_n20, prevAo0, currAo, s_CDab,[object Object],{e6:1} fma blurAo, ao_n3, w3, blurAo	{o4:0} shufb ao_n10, prevAo0, currAo, s_Dabc,[object Object],{e2:0} selbcolorOffsetIncr, defOffsetIncr, endColorOffsetIncr, endLineMasklnop ,[object Object],{e2:0} selb ao_n3, ao_p1_, ao_n30, endLineMask_			{o4:0} shufbcolorOffset_, colorOffset_, colorOffset, s_BCa0,[object Object],{e2:0} selb ao_n2, ao_p2_, ao_n20, endLineMask_lnop,[object Object],{e2:0} selb ao_n1, ao_p3_, ao_n10, endLineMask_				lnop,[object Object],{e2:0} a colorOffset, colorOffset, colorOffsetIncrlnop,[object Object],{e2:0} a endLineOffset, endLineOffset, endLineOffsetIncrbranch: {o?:0} brzendBlockMask, loop		,[object Object]
Iteration 4,[object Object],loop:,[object Object],nop 											lnop,[object Object],{e6:1} fa ao_n4, ao_n4, nextAo	{o6:0} lqx currAo, pvColor, colorOffset,[object Object],{e6:1} fa ao_n3, ao_n3, ao_p3{o6:0} lqx nextAo, pvNextColor, colorOffset,[object Object],{e6:2} fmablurAo_, ao_n2_, w2, blurAo{o4:0} shlqbiiendLineMask_, endLineMask, 0,[object Object],{e6:1} fa ao_n1_, ao_n1, ao_p1	lnop,[object Object],{e6:1} fa ao_n2_, ao_n2, ao_p2	lnop,[object Object],{e6:3} fmablurAo___, currAo___, w0, blurAo__lnop,[object Object],{e6:1} fm blurAo, ao_n4, w4	{o4:0} shufb prevAo0, currAo, currAo, s_AAAA,[object Object],{e2:0} ceqendLineMask, colorOffset, endLineOffset				{o4:0} shufb ao_p1, currAo, nextAo, s_BCDa,[object Object],{e2:0} ceqendBlockMask, colorOffset_, endOffset				{o4:0} shufb ao_p2, currAo, nextAo, s_CDab,[object Object],{e2:0} selbendLineOffsetIncr, zero, colorLineBytes, endLineMask		{o4:0} shufb ao_p3, currAo, nextAo, s_Dabc,[object Object],{e2:0} selb ao_n4, currAo_, prevAo0, endLineMask_				{o4:0} shufb ao_n30, prevAo0, currAo, s_BCDa,[object Object],{e6:2} fma blurAo__, ao_n1__, w1, blurAo_{o4:0} shufb ao_n20, prevAo0, currAo, s_CDab,[object Object],{e6:1} fma blurAo, ao_n3, w3, blurAo	{o4:0} shufb ao_n10, prevAo0, currAo, s_Dabc,[object Object],{e2:0} selbcolorOffsetIncr, defOffsetIncr, endColorOffsetIncr, endLineMask{o6:3} stqxblurAo___, pvColor, colorOffset_,[object Object],{e2:0} selb ao_n3, ao_p1_, ao_n30, endLineMask_			{o4:0} shufbcolorOffset_, colorOffset_, colorOffset, s_BCa0,[object Object],{e2:0} selb ao_n2, ao_p2_, ao_n20, endLineMask_lnop,[object Object],{e2:0} selb ao_n1, ao_p3_, ao_n10, endLineMask_				lnop,[object Object],{e2:0} a colorOffset, colorOffset, colorOffsetIncrlnop,[object Object],{e2:0} a endLineOffset, endLineOffset, endLineOffsetIncrbranch: {o?:0} brzendBlockMask, loop		,[object Object]
Copy Operations,[object Object],loop:,[object Object],{e2:x} ai ao_n1__, ao_n1_, 0							{o4:x} shlqbii currAo_, currAo, 0,[object Object],{e6:1} fa ao_n4, ao_n4, nextAo	{o6:0} lqx currAo, pvColor, colorOffset,[object Object],{e6:1} fa ao_n3, ao_n3, ao_p3{o6:0} lqx nextAo, pvNextColor, colorOffset,[object Object],{e6:2} fmablurAo_, ao_n2_, w2, blurAo{o4:0} shlqbiiendLineMask_, endLineMask, 0,[object Object],{e6:1} fa ao_n1_, ao_n1, ao_p1	{o4:x} shlqbii ao_p1_, ao_p1, 0,[object Object],{e6:1} fa ao_n2_, ao_n2, ao_p2	{o4:x} shlqbii ao_p2_, ao_p2, 0,[object Object],{e6:3} fmablurAo___, currAo___, w0, blurAo__	{o4:x} shlqbii ao_p3_, ao_p3, 0,[object Object],{e6:1} fm blurAo, ao_n4, w4	{o4:0} shufb prevAo0, currAo, currAo, s_AAAA,[object Object],{e2:0} ceqendLineMask, colorOffset, endLineOffset				{o4:0} shufb ao_p1, currAo, nextAo, s_BCDa,[object Object],{e2:0} ceqendBlockMask, colorOffset_, endOffset				{o4:0} shufb ao_p2, currAo, nextAo, s_CDab,[object Object],{e2:0} selbendLineOffsetIncr, zero, colorLineBytes, endLineMask		{o4:0} shufb ao_p3, currAo, nextAo, s_Dabc,[object Object],{e2:0} selb ao_n4, currAo_, prevAo0, endLineMask_				{o4:0} shufb ao_n30, prevAo0, currAo, s_BCDa,[object Object],{e6:2} fma blurAo__, ao_n1__, w1, blurAo_{o4:0} shufb ao_n20, prevAo0, currAo, s_CDab,[object Object],{e6:1} fma blurAo, ao_n3, w3, blurAo	{o4:0} shufb ao_n10, prevAo0, currAo, s_Dabc,[object Object],{e2:0} selbcolorOffsetIncr, defOffsetIncr, endColorOffsetIncr, endLineMask{o6:3} stqxblurAo___, pvColor, colorOffset_,[object Object],{e2:0} selb ao_n3, ao_p1_, ao_n30, endLineMask_			{o4:0} shufbcolorOffset_, colorOffset_, colorOffset, s_BCa0,[object Object],{e2:0} selb ao_n2, ao_p2_, ao_n20, endLineMask_{o4:x} shlqbii currAo___, currAo__, 0,[object Object],{e2:0} selb ao_n1, ao_p3_, ao_n10, endLineMask_				{o4:x} shlqbii currAo__, currAo_, 0,[object Object],{e2:0} a colorOffset, colorOffset, colorOffsetIncrlnop,[object Object],{e2:0} a endLineOffset, endLineOffset, endLineOffsetIncrbranch: {o?:0} brzendBlockMask, loop		,[object Object]
Optimized,[object Object],loop:,[object Object],{e2:x} ai ao_n1__, ao_n1_, 0							{o4:x} shlqbii currAo_, currAo, 0,[object Object],{e6:1} fa ao_n4, ao_n4, nextAo							{o6:0} lqx currAo, pvColor, colorOffset,[object Object],{e6:1} fa ao_n3, ao_n3, ao_p3							{o6:0} lqx nextAo, pvNextColor, colorOffset,[object Object],{e6:2} fmablurAo_, ao_n2_, w2, blurAo						{o4:0} shlqbiiendLineMask_, endLineMask, 0,[object Object],{e6:1} fa ao_n1_, ao_n1, ao_p1							{o4:x} shlqbii ao_p1_, ao_p1, 0,[object Object],{e6:1} fa ao_n2_, ao_n2, ao_p2							{o4:x} shlqbii ao_p2_, ao_p2, 0,[object Object],{e6:3} fmablurAo___, currAo___, w0, blurAo__					{o4:x} shlqbii ao_p3_, ao_p3, 0,[object Object],{e6:1} fm blurAo, ao_n4, w4							{o4:0} shufb prevAo0, currAo, currAo, s_AAAA,[object Object],{e2:0} ceqendLineMask, colorOffset, endLineOffset				{o4:0} shufb ao_p1, currAo, nextAo, s_BCDa,[object Object],{e2:0} ceqendBlockMask, colorOffset_, endOffset				{o4:0} shufb ao_p2, currAo, nextAo, s_CDab,[object Object],{e2:0} selbendLineOffsetIncr, zero, colorLineBytes, endLineMask		{o4:0} shufb ao_p3, currAo, nextAo, s_Dabc,[object Object],{e2:0} selb ao_n4, currAo_, prevAo0, endLineMask_				{o4:0} shufb ao_n30, prevAo0, currAo, s_BCDa,[object Object],{e6:2} fma blurAo__, ao_n1__, w1, blurAo_					{o4:0} shufb ao_n20, prevAo0, currAo, s_CDab,[object Object],{e6:1} fma blurAo, ao_n3, w3, blurAo						{o4:0} shufb ao_n10, prevAo0, currAo, s_Dabc,[object Object],{e2:0} selbcolorOffsetIncr, defOffsetIncr, endColorOffsetIncr, endLineMask	{o6:3} stqxblurAo___, pvColor, colorOffset_,[object Object],{e2:0} selb ao_n3, ao_p1_, ao_n30, endLineMask_			{o4:0} shufbcolorOffset_, colorOffset_, colorOffset, s_BCa0,[object Object],{e2:0} selb ao_n2, ao_p2_, ao_n20, endLineMask_				{o4:x} shlqbii currAo___, currAo__, 0,[object Object],{e2:0} selb ao_n1, ao_p3_, ao_n10, endLineMask_				{o4:x} shlqbii currAo__, currAo_, 0,[object Object],{e2:0} a colorOffset, colorOffset, colorOffsetIncrlnop,[object Object],{e2:0} a endLineOffset, endLineOffset, endLineOffsetIncr			branch: {o?:0} brzendBlockMask, loop		,[object Object]
Optimized,[object Object],EVEN,[object Object],ODD,[object Object],loop:,[object Object],{e2:x} ai ao_n1__, ao_n1_, 0							{o4:x} shlqbii currAo_, currAo, 0,[object Object],{e6:1} fa ao_n4, ao_n4, nextAo							{o6:0} lqx currAo, pvColor, colorOffset,[object Object],{e6:1} fa ao_n3, ao_n3, ao_p3							{o6:0} lqx nextAo, pvNextColor, colorOffset,[object Object],{e6:2} fmablurAo_, ao_n2_, w2, blurAo						{o4:0} shlqbiiendLineMask_, endLineMask, 0,[object Object],{e6:1} fa ao_n1_, ao_n1, ao_p1							{o4:x} shlqbii ao_p1_, ao_p1, 0,[object Object],{e6:1} fa ao_n2_, ao_n2, ao_p2							{o4:x} shlqbii ao_p2_, ao_p2, 0,[object Object],{e6:3} fmablurAo___, currAo___, w0, blurAo__					{o4:x} shlqbii ao_p3_, ao_p3, 0,[object Object],{e6:1} fm blurAo, ao_n4, w4							{o4:0} shufb prevAo0, currAo, currAo, s_AAAA,[object Object],{e2:0} ceqendLineMask, colorOffset, endLineOffset				{o4:0} shufb ao_p1, currAo, nextAo, s_BCDa,[object Object],{e2:0} ceqendBlockMask, colorOffset_, endOffset				{o4:0} shufb ao_p2, currAo, nextAo, s_CDab,[object Object],{e2:0} selbendLineOffsetIncr, zero, colorLineBytes, endLineMask		{o4:0} shufb ao_p3, currAo, nextAo, s_Dabc,[object Object],{e2:0} selb ao_n4, currAo_, prevAo0, endLineMask_				{o4:0} shufb ao_n30, prevAo0, currAo, s_BCDa,[object Object],{e6:2} fma blurAo__, ao_n1__, w1, blurAo_					{o4:0} shufb ao_n20, prevAo0, currAo, s_CDab,[object Object],{e6:1} fma blurAo, ao_n3, w3, blurAo						{o4:0} shufb ao_n10, prevAo0, currAo, s_Dabc,[object Object],{e2:0} selbcolorOffsetIncr, defOffsetIncr, endColorOffsetIncr, endLineMask	{o6:3} stqxblurAo___, pvColor, colorOffset_,[object Object],{e2:0} selb ao_n3, ao_p1_, ao_n30, endLineMask_			{o4:0} shufbcolorOffset_, colorOffset_, colorOffset, s_BCa0,[object Object],{e2:0} selb ao_n2, ao_p2_, ao_n20, endLineMask_				{o4:x} shlqbii currAo___, currAo__, 0,[object Object],{e2:0} selb ao_n1, ao_p3_, ao_n10, endLineMask_				{o4:x} shlqbii currAo__, currAo_, 0,[object Object],{e2:0} a colorOffset, colorOffset, colorOffsetIncrlnop,[object Object],{e2:0} a endLineOffset, endLineOffset, endLineOffsetIncr			branch: {o?:0} brzendBlockMask, loop		,[object Object]
Optimized,[object Object],EVEN,[object Object],ODD,[object Object],loop:,[object Object],{e2:x} ai ao_n1__, ao_n1_, 0							{o4:x} shlqbii currAo_, currAo, 0,[object Object],{e6:1} fa ao_n4, ao_n4, nextAo							{o6:0} lqx currAo, pvColor, colorOffset,[object Object],{e6:1} fa ao_n3, ao_n3, ao_p3							{o6:0} lqx nextAo, pvNextColor, colorOffset,[object Object],{e6:2} fmablurAo_, ao_n2_, w2, blurAo						{o4:0} shlqbiiendLineMask_, endLineMask, 0,[object Object],{e6:1} fa ao_n1_, ao_n1, ao_p1							{o4:x} shlqbii ao_p1_, ao_p1, 0,[object Object],{e6:1} fa ao_n2_, ao_n2, ao_p2							{o4:x} shlqbii ao_p2_, ao_p2, 0,[object Object],{e6:3} fmablurAo___, currAo___, w0, blurAo__					{o4:x} shlqbii ao_p3_, ao_p3, 0,[object Object],{e6:1} fm blurAo, ao_n4, w4							{o4:0} shufb prevAo0, currAo, currAo, s_AAAA,[object Object],{e2:0} ceqendLineMask, colorOffset, endLineOffset				{o4:0} shufb ao_p1, currAo, nextAo, s_BCDa,[object Object],{e2:0} ceqendBlockMask, colorOffset_, endOffset				{o4:0} shufb ao_p2, currAo, nextAo, s_CDab,[object Object],{e2:0} selbendLineOffsetIncr, zero, colorLineBytes, endLineMask		{o4:0} shufb ao_p3, currAo, nextAo, s_Dabc,[object Object],{e2:0} selb ao_n4, currAo_, prevAo0, endLineMask_				{o4:0} shufb ao_n30, prevAo0, currAo, s_BCDa,[object Object],{e6:2} fma blurAo__, ao_n1__, w1, blurAo_					{o4:0} shufb ao_n20, prevAo0, currAo, s_CDab,[object Object],{e6:1} fma blurAo, ao_n3, w3, blurAo						{o4:0} shufb ao_n10, prevAo0, currAo, s_Dabc,[object Object],{e2:0} selbcolorOffsetIncr, defOffsetIncr, endColorOffsetIncr, endLineMask	{o6:3} stqxblurAo___, pvColor, colorOffset_,[object Object],{e2:0} selb ao_n3, ao_p1_, ao_n30, endLineMask_			{o4:0} shufbcolorOffset_, colorOffset_, colorOffset, s_BCa0,[object Object],{e2:0} selb ao_n2, ao_p2_, ao_n20, endLineMask_				{o4:x} shlqbii currAo___, currAo__, 0,[object Object],{e2:0} selb ao_n1, ao_p3_, ao_n10, endLineMask_				{o4:x} shlqbii currAo__, currAo_, 0,[object Object],{e2:0} a colorOffset, colorOffset, colorOffsetIncrlnop,[object Object],{e2:0} a endLineOffset, endLineOffset, endLineOffsetIncr			branch: {o?:0} brzendBlockMask, loop		,[object Object]
Optimized,[object Object],EVEN,[object Object],ODD,[object Object],loop:,[object Object],{e2:x} ai ao_n1__, ao_n1_, 0							{o4:x} shlqbii currAo_, currAo, 0,[object Object],{e6:1} fa ao_n4, ao_n4, nextAo							{o6:0} lqx currAo, pvColor, colorOffset,[object Object],{e6:1} fa ao_n3, ao_n3, ao_p3							{o6:0} lqx nextAo, pvNextColor, colorOffset,[object Object],{e6:2} fmablurAo_, ao_n2_, w2, blurAo						{o4:0} shlqbiiendLineMask_, endLineMask, 0,[object Object],{e6:1} fa ao_n1_, ao_n1, ao_p1							{o4:x} shlqbii ao_p1_, ao_p1, 0,[object Object],{e6:1} fa ao_n2_, ao_n2, ao_p2							{o4:x} shlqbii ao_p2_, ao_p2, 0,[object Object],{e6:3} fmablurAo___, currAo___, w0, blurAo__					{o4:x} shlqbii ao_p3_, ao_p3, 0,[object Object],{e6:1} fm blurAo, ao_n4, w4							{o4:0} shufb prevAo0, currAo, currAo, s_AAAA,[object Object],{e2:0} ceqendLineMask, colorOffset, endLineOffset				{o4:0} shufb ao_p1, currAo, nextAo, s_BCDa,[object Object],{e2:0} ceqendBlockMask, colorOffset_, endOffset				{o4:0} shufb ao_p2, currAo, nextAo, s_CDab,[object Object],{e2:0} selbendLineOffsetIncr, zero, colorLineBytes, endLineMask		{o4:0} shufb ao_p3, currAo, nextAo, s_Dabc,[object Object],{e2:0} selb ao_n4, currAo_, prevAo0, endLineMask_				{o4:0} shufb ao_n30, prevAo0, currAo, s_BCDa,[object Object],{e6:2} fma blurAo__, ao_n1__, w1, blurAo_					{o4:0} shufb ao_n20, prevAo0, currAo, s_CDab,[object Object],{e6:1} fma blurAo, ao_n3, w3, blurAo						{o4:0} shufb ao_n10, prevAo0, currAo, s_Dabc,[object Object],{e2:0} selbcolorOffsetIncr, defOffsetIncr, endColorOffsetIncr, endLineMask	{o6:3} stqxblurAo___, pvColor, colorOffset_,[object Object],{e2:0} selb ao_n3, ao_p1_, ao_n30, endLineMask_			{o4:0} shufbcolorOffset_, colorOffset_, colorOffset, s_BCa0,[object Object],{e2:0} selb ao_n2, ao_p2_, ao_n20, endLineMask_				{o4:x} shlqbii currAo___, currAo__, 0,[object Object],{e2:0} selb ao_n1, ao_p3_, ao_n10, endLineMask_				{o4:x} shlqbii currAo__, currAo_, 0,[object Object],{e2:0} a colorOffset, colorOffset, colorOffsetIncrlnop,[object Object],{e2:0} a endLineOffset, endLineOffset, endLineOffsetIncr			branch: {o?:0} brzendBlockMask, loop		,[object Object]
Solution,[object Object],[object Object]
Sometimes more or less
SSAO went from 2ms on all 6 SPUs to 1ms on all 6 SPUs
With practice, can do about 1-2 loops per day.
SSAO has 6 loops, and took a little over a week.
Same process for:
PostFX
Fullscreen Lighting
Ambient Cubemaps
Many more,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
Performance,[object Object],[object Object],[object Object],[object Object],[object Object]
Architecture Conclusions,[object Object],“So, you are the scheduler that has been nipping at my heels...”,[object Object]
Final Final Thoughts,[object Object],[object Object]
Filmic Tonemapping changes your life.
SSAO is cool, and keep it out of your sunlight.
SPUs are awesome.
They don’t optimize themselves.
For a tight for-loop, you can do about 2x better than the compiler.,[object Object]
We’re also looking for
Senior Lighting Artist.
Graphics Programmer,[object Object]
Hable John Uncharted2 Hdr Lighting
Hable John Uncharted2 Hdr Lighting
Hable John Uncharted2 Hdr Lighting
Hable John Uncharted2 Hdr Lighting
Hable John Uncharted2 Hdr Lighting
Hable John Uncharted2 Hdr Lighting
Hable John Uncharted2 Hdr Lighting
Hable John Uncharted2 Hdr Lighting
Hable John Uncharted2 Hdr Lighting
Hable John Uncharted2 Hdr Lighting
Hable John Uncharted2 Hdr Lighting
Hable John Uncharted2 Hdr Lighting
Hable John Uncharted2 Hdr Lighting
Hable John Uncharted2 Hdr Lighting
Hable John Uncharted2 Hdr Lighting
Hable John Uncharted2 Hdr Lighting
Hable John Uncharted2 Hdr Lighting
Hable John Uncharted2 Hdr Lighting
Hable John Uncharted2 Hdr Lighting
Hable John Uncharted2 Hdr Lighting
Hable John Uncharted2 Hdr Lighting
Hable John Uncharted2 Hdr Lighting
Hable John Uncharted2 Hdr Lighting
Hable John Uncharted2 Hdr Lighting
Hable John Uncharted2 Hdr Lighting
Hable John Uncharted2 Hdr Lighting
Hable John Uncharted2 Hdr Lighting
Hable John Uncharted2 Hdr Lighting
Hable John Uncharted2 Hdr Lighting

More Related Content

What's hot

Moving Frostbite to Physically Based Rendering
Moving Frostbite to Physically Based RenderingMoving Frostbite to Physically Based Rendering
Moving Frostbite to Physically Based RenderingElectronic Arts / DICE
 
Screen Space Reflections in The Surge
Screen Space Reflections in The SurgeScreen Space Reflections in The Surge
Screen Space Reflections in The SurgeMichele Giacalone
 
A Bit More Deferred Cry Engine3
A Bit More Deferred   Cry Engine3A Bit More Deferred   Cry Engine3
A Bit More Deferred Cry Engine3guest11b095
 
Five Rendering Ideas from Battlefield 3 & Need For Speed: The Run
Five Rendering Ideas from Battlefield 3 & Need For Speed: The RunFive Rendering Ideas from Battlefield 3 & Need For Speed: The Run
Five Rendering Ideas from Battlefield 3 & Need For Speed: The RunElectronic Arts / DICE
 
The Rendering Technology of 'Lords of the Fallen' (Game Connection Europe 2014)
The Rendering Technology of 'Lords of the Fallen' (Game Connection Europe 2014)The Rendering Technology of 'Lords of the Fallen' (Game Connection Europe 2014)
The Rendering Technology of 'Lords of the Fallen' (Game Connection Europe 2014)Philip Hammer
 
Frostbite Rendering Architecture and Real-time Procedural Shading & Texturing...
Frostbite Rendering Architecture and Real-time Procedural Shading & Texturing...Frostbite Rendering Architecture and Real-time Procedural Shading & Texturing...
Frostbite Rendering Architecture and Real-time Procedural Shading & Texturing...Johan Andersson
 
Optimizing the Graphics Pipeline with Compute, GDC 2016
Optimizing the Graphics Pipeline with Compute, GDC 2016Optimizing the Graphics Pipeline with Compute, GDC 2016
Optimizing the Graphics Pipeline with Compute, GDC 2016Graham Wihlidal
 
Penner pre-integrated skin rendering (siggraph 2011 advances in real-time r...
Penner   pre-integrated skin rendering (siggraph 2011 advances in real-time r...Penner   pre-integrated skin rendering (siggraph 2011 advances in real-time r...
Penner pre-integrated skin rendering (siggraph 2011 advances in real-time r...JP Lee
 
Taking Killzone Shadow Fall Image Quality Into The Next Generation
Taking Killzone Shadow Fall Image Quality Into The Next GenerationTaking Killzone Shadow Fall Image Quality Into The Next Generation
Taking Killzone Shadow Fall Image Quality Into The Next GenerationGuerrilla
 
Secrets of CryENGINE 3 Graphics Technology
Secrets of CryENGINE 3 Graphics TechnologySecrets of CryENGINE 3 Graphics Technology
Secrets of CryENGINE 3 Graphics TechnologyTiago Sousa
 
Rendering Tech of Space Marine
Rendering Tech of Space MarineRendering Tech of Space Marine
Rendering Tech of Space MarinePope Kim
 
Lighting of Killzone: Shadow Fall
Lighting of Killzone: Shadow FallLighting of Killzone: Shadow Fall
Lighting of Killzone: Shadow FallGuerrilla
 
High Dynamic Range color grading and display in Frostbite
High Dynamic Range color grading and display in FrostbiteHigh Dynamic Range color grading and display in Frostbite
High Dynamic Range color grading and display in FrostbiteElectronic Arts / DICE
 
FrameGraph: Extensible Rendering Architecture in Frostbite
FrameGraph: Extensible Rendering Architecture in FrostbiteFrameGraph: Extensible Rendering Architecture in Frostbite
FrameGraph: Extensible Rendering Architecture in FrostbiteElectronic Arts / DICE
 
Star Ocean 4 - Flexible Shader Managment and Post-processing
Star Ocean 4 - Flexible Shader Managment and Post-processingStar Ocean 4 - Flexible Shader Managment and Post-processing
Star Ocean 4 - Flexible Shader Managment and Post-processingumsl snfrzb
 
HDR Theory and practicce (JP)
HDR Theory and practicce (JP)HDR Theory and practicce (JP)
HDR Theory and practicce (JP)Hajime Uchimura
 
Bindless Deferred Decals in The Surge 2
Bindless Deferred Decals in The Surge 2Bindless Deferred Decals in The Surge 2
Bindless Deferred Decals in The Surge 2Philip Hammer
 

What's hot (20)

Moving Frostbite to Physically Based Rendering
Moving Frostbite to Physically Based RenderingMoving Frostbite to Physically Based Rendering
Moving Frostbite to Physically Based Rendering
 
DirectX 11 Rendering in Battlefield 3
DirectX 11 Rendering in Battlefield 3DirectX 11 Rendering in Battlefield 3
DirectX 11 Rendering in Battlefield 3
 
Screen Space Reflections in The Surge
Screen Space Reflections in The SurgeScreen Space Reflections in The Surge
Screen Space Reflections in The Surge
 
A Bit More Deferred Cry Engine3
A Bit More Deferred   Cry Engine3A Bit More Deferred   Cry Engine3
A Bit More Deferred Cry Engine3
 
Stochastic Screen-Space Reflections
Stochastic Screen-Space ReflectionsStochastic Screen-Space Reflections
Stochastic Screen-Space Reflections
 
Five Rendering Ideas from Battlefield 3 & Need For Speed: The Run
Five Rendering Ideas from Battlefield 3 & Need For Speed: The RunFive Rendering Ideas from Battlefield 3 & Need For Speed: The Run
Five Rendering Ideas from Battlefield 3 & Need For Speed: The Run
 
The Rendering Technology of 'Lords of the Fallen' (Game Connection Europe 2014)
The Rendering Technology of 'Lords of the Fallen' (Game Connection Europe 2014)The Rendering Technology of 'Lords of the Fallen' (Game Connection Europe 2014)
The Rendering Technology of 'Lords of the Fallen' (Game Connection Europe 2014)
 
Frostbite Rendering Architecture and Real-time Procedural Shading & Texturing...
Frostbite Rendering Architecture and Real-time Procedural Shading & Texturing...Frostbite Rendering Architecture and Real-time Procedural Shading & Texturing...
Frostbite Rendering Architecture and Real-time Procedural Shading & Texturing...
 
Optimizing the Graphics Pipeline with Compute, GDC 2016
Optimizing the Graphics Pipeline with Compute, GDC 2016Optimizing the Graphics Pipeline with Compute, GDC 2016
Optimizing the Graphics Pipeline with Compute, GDC 2016
 
Penner pre-integrated skin rendering (siggraph 2011 advances in real-time r...
Penner   pre-integrated skin rendering (siggraph 2011 advances in real-time r...Penner   pre-integrated skin rendering (siggraph 2011 advances in real-time r...
Penner pre-integrated skin rendering (siggraph 2011 advances in real-time r...
 
Taking Killzone Shadow Fall Image Quality Into The Next Generation
Taking Killzone Shadow Fall Image Quality Into The Next GenerationTaking Killzone Shadow Fall Image Quality Into The Next Generation
Taking Killzone Shadow Fall Image Quality Into The Next Generation
 
Secrets of CryENGINE 3 Graphics Technology
Secrets of CryENGINE 3 Graphics TechnologySecrets of CryENGINE 3 Graphics Technology
Secrets of CryENGINE 3 Graphics Technology
 
Rendering Tech of Space Marine
Rendering Tech of Space MarineRendering Tech of Space Marine
Rendering Tech of Space Marine
 
Lighting of Killzone: Shadow Fall
Lighting of Killzone: Shadow FallLighting of Killzone: Shadow Fall
Lighting of Killzone: Shadow Fall
 
High Dynamic Range color grading and display in Frostbite
High Dynamic Range color grading and display in FrostbiteHigh Dynamic Range color grading and display in Frostbite
High Dynamic Range color grading and display in Frostbite
 
Ndc11 이창희_hdr
Ndc11 이창희_hdrNdc11 이창희_hdr
Ndc11 이창희_hdr
 
FrameGraph: Extensible Rendering Architecture in Frostbite
FrameGraph: Extensible Rendering Architecture in FrostbiteFrameGraph: Extensible Rendering Architecture in Frostbite
FrameGraph: Extensible Rendering Architecture in Frostbite
 
Star Ocean 4 - Flexible Shader Managment and Post-processing
Star Ocean 4 - Flexible Shader Managment and Post-processingStar Ocean 4 - Flexible Shader Managment and Post-processing
Star Ocean 4 - Flexible Shader Managment and Post-processing
 
HDR Theory and practicce (JP)
HDR Theory and practicce (JP)HDR Theory and practicce (JP)
HDR Theory and practicce (JP)
 
Bindless Deferred Decals in The Surge 2
Bindless Deferred Decals in The Surge 2Bindless Deferred Decals in The Surge 2
Bindless Deferred Decals in The Surge 2
 

Similar to Hable John Uncharted2 Hdr Lighting

【Unite Tokyo 2019】Unityプログレッシブライトマッパー2019
【Unite Tokyo 2019】Unityプログレッシブライトマッパー2019【Unite Tokyo 2019】Unityプログレッシブライトマッパー2019
【Unite Tokyo 2019】Unityプログレッシブライトマッパー2019UnityTechnologiesJapan002
 
Hdr Meets Black And White 2
Hdr Meets Black And White 2 Hdr Meets Black And White 2
Hdr Meets Black And White 2 Francesco Carucci
 
A Bizarre Way to do Real-Time Lighting
A Bizarre Way to do Real-Time LightingA Bizarre Way to do Real-Time Lighting
A Bizarre Way to do Real-Time LightingSteven Tovey
 
CS 354 Understanding Color
CS 354 Understanding ColorCS 354 Understanding Color
CS 354 Understanding ColorMark Kilgard
 
Computer Graphics Part1
Computer Graphics Part1Computer Graphics Part1
Computer Graphics Part1qpqpqp
 
Analyzing color imaging failure on consumer-grade cameras
Analyzing color imaging failure on consumer-grade camerasAnalyzing color imaging failure on consumer-grade cameras
Analyzing color imaging failure on consumer-grade camerasSaiTedla1
 
“CMOS Image Sensors: A Guide to Building the Eyes of a Vision System,” a Pres...
“CMOS Image Sensors: A Guide to Building the Eyes of a Vision System,” a Pres...“CMOS Image Sensors: A Guide to Building the Eyes of a Vision System,” a Pres...
“CMOS Image Sensors: A Guide to Building the Eyes of a Vision System,” a Pres...Edge AI and Vision Alliance
 
Shooting High Dynamic Range
Shooting High Dynamic RangeShooting High Dynamic Range
Shooting High Dynamic RangeJessica Young
 
Real-time Shadowing Techniques: Shadow Volumes
Real-time Shadowing Techniques: Shadow VolumesReal-time Shadowing Techniques: Shadow Volumes
Real-time Shadowing Techniques: Shadow VolumesMark Kilgard
 
Deferred shading
Deferred shadingDeferred shading
Deferred shadingFrank Chao
 
Scratch a pixel - Reflection
Scratch a pixel - ReflectionScratch a pixel - Reflection
Scratch a pixel - ReflectionYiwei Gong
 
new_age_graphics_android_x86
new_age_graphics_android_x86new_age_graphics_android_x86
new_age_graphics_android_x86Droidcon Berlin
 
HPG 2018 - Game Ray Tracing: State-of-the-Art and Open Problems
HPG 2018 - Game Ray Tracing: State-of-the-Art and Open ProblemsHPG 2018 - Game Ray Tracing: State-of-the-Art and Open Problems
HPG 2018 - Game Ray Tracing: State-of-the-Art and Open ProblemsElectronic Arts / DICE
 
Unity: Next Level Rendering Quality
Unity: Next Level Rendering QualityUnity: Next Level Rendering Quality
Unity: Next Level Rendering QualityUnity Technologies
 
Rendering basics
Rendering basicsRendering basics
Rendering basicsicedmaster
 
Crysis 2-key-rendering-features
Crysis 2-key-rendering-featuresCrysis 2-key-rendering-features
Crysis 2-key-rendering-featuresRaimundo Renato
 
A Practical and Robust Bump-mapping Technique for Today’s GPUs (slides)
A Practical and Robust Bump-mapping Technique for Today’s GPUs (slides)A Practical and Robust Bump-mapping Technique for Today’s GPUs (slides)
A Practical and Robust Bump-mapping Technique for Today’s GPUs (slides)Mark Kilgard
 

Similar to Hable John Uncharted2 Hdr Lighting (20)

【Unite Tokyo 2019】Unityプログレッシブライトマッパー2019
【Unite Tokyo 2019】Unityプログレッシブライトマッパー2019【Unite Tokyo 2019】Unityプログレッシブライトマッパー2019
【Unite Tokyo 2019】Unityプログレッシブライトマッパー2019
 
Hdr Meets Black And White 2
Hdr Meets Black And White 2 Hdr Meets Black And White 2
Hdr Meets Black And White 2
 
A Bizarre Way to do Real-Time Lighting
A Bizarre Way to do Real-Time LightingA Bizarre Way to do Real-Time Lighting
A Bizarre Way to do Real-Time Lighting
 
CS 354 Understanding Color
CS 354 Understanding ColorCS 354 Understanding Color
CS 354 Understanding Color
 
Computer Graphics Part1
Computer Graphics Part1Computer Graphics Part1
Computer Graphics Part1
 
Analyzing color imaging failure on consumer-grade cameras
Analyzing color imaging failure on consumer-grade camerasAnalyzing color imaging failure on consumer-grade cameras
Analyzing color imaging failure on consumer-grade cameras
 
“CMOS Image Sensors: A Guide to Building the Eyes of a Vision System,” a Pres...
“CMOS Image Sensors: A Guide to Building the Eyes of a Vision System,” a Pres...“CMOS Image Sensors: A Guide to Building the Eyes of a Vision System,” a Pres...
“CMOS Image Sensors: A Guide to Building the Eyes of a Vision System,” a Pres...
 
Shooting High Dynamic Range
Shooting High Dynamic RangeShooting High Dynamic Range
Shooting High Dynamic Range
 
Real-time Shadowing Techniques: Shadow Volumes
Real-time Shadowing Techniques: Shadow VolumesReal-time Shadowing Techniques: Shadow Volumes
Real-time Shadowing Techniques: Shadow Volumes
 
Hdr magic
Hdr magicHdr magic
Hdr magic
 
Deferred shading
Deferred shadingDeferred shading
Deferred shading
 
Scratch a pixel - Reflection
Scratch a pixel - ReflectionScratch a pixel - Reflection
Scratch a pixel - Reflection
 
new_age_graphics_android_x86
new_age_graphics_android_x86new_age_graphics_android_x86
new_age_graphics_android_x86
 
Image processing Presentation
Image processing PresentationImage processing Presentation
Image processing Presentation
 
HPG 2018 - Game Ray Tracing: State-of-the-Art and Open Problems
HPG 2018 - Game Ray Tracing: State-of-the-Art and Open ProblemsHPG 2018 - Game Ray Tracing: State-of-the-Art and Open Problems
HPG 2018 - Game Ray Tracing: State-of-the-Art and Open Problems
 
Unity: Next Level Rendering Quality
Unity: Next Level Rendering QualityUnity: Next Level Rendering Quality
Unity: Next Level Rendering Quality
 
Rendering basics
Rendering basicsRendering basics
Rendering basics
 
Crysis 2-key-rendering-features
Crysis 2-key-rendering-featuresCrysis 2-key-rendering-features
Crysis 2-key-rendering-features
 
Chapter01 (2)
Chapter01 (2)Chapter01 (2)
Chapter01 (2)
 
A Practical and Robust Bump-mapping Technique for Today’s GPUs (slides)
A Practical and Robust Bump-mapping Technique for Today’s GPUs (slides)A Practical and Robust Bump-mapping Technique for Today’s GPUs (slides)
A Practical and Robust Bump-mapping Technique for Today’s GPUs (slides)
 

More from ozlael ozlael

Unity & VR (Unity Roadshow 2016)
Unity & VR (Unity Roadshow 2016)Unity & VR (Unity Roadshow 2016)
Unity & VR (Unity Roadshow 2016)ozlael ozlael
 
뭣이 중헌디? 성능 프로파일링도 모름서 - 유니티 성능 프로파일링 가이드 (IGC16)
뭣이 중헌디? 성능 프로파일링도 모름서 - 유니티 성능 프로파일링 가이드 (IGC16)뭣이 중헌디? 성능 프로파일링도 모름서 - 유니티 성능 프로파일링 가이드 (IGC16)
뭣이 중헌디? 성능 프로파일링도 모름서 - 유니티 성능 프로파일링 가이드 (IGC16)ozlael ozlael
 
Optimizing mobile applications - Ian Dundore, Mark Harkness
Optimizing mobile applications - Ian Dundore, Mark HarknessOptimizing mobile applications - Ian Dundore, Mark Harkness
Optimizing mobile applications - Ian Dundore, Mark Harknessozlael ozlael
 
그래픽 최적화로 가...가버렷! (부제: 배치! 배칭을 보자!) , Batch! Let's take a look at Batching! -...
그래픽 최적화로 가...가버렷! (부제: 배치! 배칭을 보자!) , Batch! Let's take a look at Batching! -...그래픽 최적화로 가...가버렷! (부제: 배치! 배칭을 보자!) , Batch! Let's take a look at Batching! -...
그래픽 최적화로 가...가버렷! (부제: 배치! 배칭을 보자!) , Batch! Let's take a look at Batching! -...ozlael ozlael
 
유니티 그래픽 최적화, 어디까지 해봤니 (Optimizing Unity Graphics) Unite Seoul Ver.
유니티 그래픽 최적화, 어디까지 해봤니 (Optimizing Unity Graphics) Unite Seoul Ver.유니티 그래픽 최적화, 어디까지 해봤니 (Optimizing Unity Graphics) Unite Seoul Ver.
유니티 그래픽 최적화, 어디까지 해봤니 (Optimizing Unity Graphics) Unite Seoul Ver.ozlael ozlael
 
유니티 그래픽 최적화, 어디까지 해봤니 (Optimizing Unity Graphics) NDC15 Ver.
유니티 그래픽 최적화, 어디까지 해봤니 (Optimizing Unity Graphics) NDC15 Ver.유니티 그래픽 최적화, 어디까지 해봤니 (Optimizing Unity Graphics) NDC15 Ver.
유니티 그래픽 최적화, 어디까지 해봤니 (Optimizing Unity Graphics) NDC15 Ver.ozlael ozlael
 
Infinity Blade and beyond
Infinity Blade and beyondInfinity Blade and beyond
Infinity Blade and beyondozlael ozlael
 
스티브잡스처럼 프레젠테이션하기
스티브잡스처럼 프레젠테이션하기스티브잡스처럼 프레젠테이션하기
스티브잡스처럼 프레젠테이션하기ozlael ozlael
 
유니티의 라이팅이 안 이쁘다구요? (A to Z of Lighting)
유니티의 라이팅이 안 이쁘다구요? (A to Z of Lighting)유니티의 라이팅이 안 이쁘다구요? (A to Z of Lighting)
유니티의 라이팅이 안 이쁘다구요? (A to Z of Lighting)ozlael ozlael
 
Introduce coco2dx with cookingstar
Introduce coco2dx with cookingstarIntroduce coco2dx with cookingstar
Introduce coco2dx with cookingstarozlael ozlael
 
Deferred rendering case study
Deferred rendering case studyDeferred rendering case study
Deferred rendering case studyozlael ozlael
 
Kgc make stereo game on pc
Kgc make stereo game on pcKgc make stereo game on pc
Kgc make stereo game on pcozlael ozlael
 
Modern gpu optimize blog
Modern gpu optimize blogModern gpu optimize blog
Modern gpu optimize blogozlael ozlael
 
Bickerstaff benson making3d games on the playstation3
Bickerstaff benson making3d games on the playstation3Bickerstaff benson making3d games on the playstation3
Bickerstaff benson making3d games on the playstation3ozlael ozlael
 
Hable uncharted2(siggraph%202010%20 advanced%20realtime%20rendering%20course)
Hable uncharted2(siggraph%202010%20 advanced%20realtime%20rendering%20course)Hable uncharted2(siggraph%202010%20 advanced%20realtime%20rendering%20course)
Hable uncharted2(siggraph%202010%20 advanced%20realtime%20rendering%20course)ozlael ozlael
 
Deferred rendering in_leadwerks_engine[1]
Deferred rendering in_leadwerks_engine[1]Deferred rendering in_leadwerks_engine[1]
Deferred rendering in_leadwerks_engine[1]ozlael ozlael
 

More from ozlael ozlael (20)

Unity & VR (Unity Roadshow 2016)
Unity & VR (Unity Roadshow 2016)Unity & VR (Unity Roadshow 2016)
Unity & VR (Unity Roadshow 2016)
 
뭣이 중헌디? 성능 프로파일링도 모름서 - 유니티 성능 프로파일링 가이드 (IGC16)
뭣이 중헌디? 성능 프로파일링도 모름서 - 유니티 성능 프로파일링 가이드 (IGC16)뭣이 중헌디? 성능 프로파일링도 모름서 - 유니티 성능 프로파일링 가이드 (IGC16)
뭣이 중헌디? 성능 프로파일링도 모름서 - 유니티 성능 프로파일링 가이드 (IGC16)
 
Optimizing mobile applications - Ian Dundore, Mark Harkness
Optimizing mobile applications - Ian Dundore, Mark HarknessOptimizing mobile applications - Ian Dundore, Mark Harkness
Optimizing mobile applications - Ian Dundore, Mark Harkness
 
그래픽 최적화로 가...가버렷! (부제: 배치! 배칭을 보자!) , Batch! Let's take a look at Batching! -...
그래픽 최적화로 가...가버렷! (부제: 배치! 배칭을 보자!) , Batch! Let's take a look at Batching! -...그래픽 최적화로 가...가버렷! (부제: 배치! 배칭을 보자!) , Batch! Let's take a look at Batching! -...
그래픽 최적화로 가...가버렷! (부제: 배치! 배칭을 보자!) , Batch! Let's take a look at Batching! -...
 
유니티 그래픽 최적화, 어디까지 해봤니 (Optimizing Unity Graphics) Unite Seoul Ver.
유니티 그래픽 최적화, 어디까지 해봤니 (Optimizing Unity Graphics) Unite Seoul Ver.유니티 그래픽 최적화, 어디까지 해봤니 (Optimizing Unity Graphics) Unite Seoul Ver.
유니티 그래픽 최적화, 어디까지 해봤니 (Optimizing Unity Graphics) Unite Seoul Ver.
 
유니티 그래픽 최적화, 어디까지 해봤니 (Optimizing Unity Graphics) NDC15 Ver.
유니티 그래픽 최적화, 어디까지 해봤니 (Optimizing Unity Graphics) NDC15 Ver.유니티 그래픽 최적화, 어디까지 해봤니 (Optimizing Unity Graphics) NDC15 Ver.
유니티 그래픽 최적화, 어디까지 해봤니 (Optimizing Unity Graphics) NDC15 Ver.
 
Infinity Blade and beyond
Infinity Blade and beyondInfinity Blade and beyond
Infinity Blade and beyond
 
스티브잡스처럼 프레젠테이션하기
스티브잡스처럼 프레젠테이션하기스티브잡스처럼 프레젠테이션하기
스티브잡스처럼 프레젠테이션하기
 
유니티의 라이팅이 안 이쁘다구요? (A to Z of Lighting)
유니티의 라이팅이 안 이쁘다구요? (A to Z of Lighting)유니티의 라이팅이 안 이쁘다구요? (A to Z of Lighting)
유니티의 라이팅이 안 이쁘다구요? (A to Z of Lighting)
 
Introduce coco2dx with cookingstar
Introduce coco2dx with cookingstarIntroduce coco2dx with cookingstar
Introduce coco2dx with cookingstar
 
Deferred rendering case study
Deferred rendering case studyDeferred rendering case study
Deferred rendering case study
 
Kgc make stereo game on pc
Kgc make stereo game on pcKgc make stereo game on pc
Kgc make stereo game on pc
 
mssao presentation
mssao presentationmssao presentation
mssao presentation
 
Modern gpu optimize blog
Modern gpu optimize blogModern gpu optimize blog
Modern gpu optimize blog
 
Modern gpu optimize
Modern gpu optimizeModern gpu optimize
Modern gpu optimize
 
Bickerstaff benson making3d games on the playstation3
Bickerstaff benson making3d games on the playstation3Bickerstaff benson making3d games on the playstation3
Bickerstaff benson making3d games on the playstation3
 
DOF Depth of Field
DOF Depth of FieldDOF Depth of Field
DOF Depth of Field
 
Hable uncharted2(siggraph%202010%20 advanced%20realtime%20rendering%20course)
Hable uncharted2(siggraph%202010%20 advanced%20realtime%20rendering%20course)Hable uncharted2(siggraph%202010%20 advanced%20realtime%20rendering%20course)
Hable uncharted2(siggraph%202010%20 advanced%20realtime%20rendering%20course)
 
Deferred rendering in_leadwerks_engine[1]
Deferred rendering in_leadwerks_engine[1]Deferred rendering in_leadwerks_engine[1]
Deferred rendering in_leadwerks_engine[1]
 
Deferred shading
Deferred shadingDeferred shading
Deferred shading
 

Hable John Uncharted2 Hdr Lighting