Started by Apr 05 2014 05:50 AM

,
5 replies to this topic

Posted 05 April 2014 - 05:50 AM

Hello .

Let's say I have my light buffer in hdr and now I want to tonemap it to ldr . my question is why everyone are doing downscale for multiple times to get a 1x1 texture to get average luminance ?

let's say this is the average luminance formula :

(1/N)*(total of the sum of log luminances off all pixels)

where N is the total pixel numbers . even I have seen people use compute shaders for downscaling. Isn't it just possible to write a compute shader that goes over all pixels and sum all of log luminances and put it in a float . then simply we can multiply this float value by 1/N either by cpu or gpu ?

Let's say I have my light buffer in hdr and now I want to tonemap it to ldr . my question is why everyone are doing downscale for multiple times to get a 1x1 texture to get average luminance ?

let's say this is the average luminance formula :

(1/N)*(total of the sum of log luminances off all pixels)

where N is the total pixel numbers . even I have seen people use compute shaders for downscaling. Isn't it just possible to write a compute shader that goes over all pixels and sum all of log luminances and put it in a float . then simply we can multiply this float value by 1/N either by cpu or gpu ?

Posted 05 April 2014 - 05:59 AM

Thats exactly what downscaling does, sums the pixel values in parallel.

Every thread can sum a small amount of pixels so you can have multiple threads. It wouldnt be so fast if you had a single thread go through every pixel and sum them up sequentially.

I guess you can change the amount of pixels each thread processes (eg instead of 2x2 -> 1 pixel you could have 4x4 -> 1 pixel but i dont know how that would work out)

o3o

Posted 05 April 2014 - 06:23 AM

Isn't it just possible to write a compute shader that goes over all pixels and sum all of log luminances and put it in a float . then simply we can multiply this float value by 1/N either by cpu or gpu ?

This can be done by using Parallel Reduction algorithm:

Posted 05 April 2014 - 06:26 AM

Isn't it just possible to write a compute shader that goes over all pixels and sum all of log luminances and put it in a float . then simply we can multiply this float value by 1/N either by cpu or gpu ?

This can be done by using Parallel Reduction algorithm:

Which basically amounts to downsampling in the case of a 2D buffer

*“If I understand the standard right it is legal and safe to do this but the resulting value could be anything.”*

Posted 05 April 2014 - 07:13 AM

Isn't it just possible to write a compute shader that goes over all pixels and sum all of log luminances and put it in a float . then simply we can multiply this float value by 1/N either by cpu or gpu ?

This can be done by using Parallel Reduction algorithm:

Which basically amounts to downsampling in the case of a 2D buffer

You can store your 2D buffer as 1D contiguous buffer with width*height elements and apply the Parallel reduction algorithm.

Posted 05 April 2014 - 12:39 PM

This can be done by using Parallel Reduction algorithm:

Which basically amounts to downsampling in the case of a 2D buffer

Same end result, but you may be able to do it faster with a well-written reduction.