| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667 |
- mixin PPGaussianBlurCommon
- {
- code
- {
- [internal]
- cbuffer GaussianBlurParams
- {
- float4 gSampleOffsets[(MAX_NUM_SAMPLES + 1) / 2];
- float4 gSampleWeights[MAX_NUM_SAMPLES];
- int gNumSamples;
- }
- float4 gaussianBlur(Texture2D source, SamplerState samp, float2 uv)
- {
- // Note: Consider adding a version of this shader with unrolled loop for small number of samples
- float4 output = 0;
-
- int idx = 0;
- for(; idx < (gNumSamples / 4); idx++)
- {
- {
- float2 sampleUV = uv + gSampleOffsets[idx * 2 + 0].xy;
- output += source.SampleLevel(samp, sampleUV, 0) * gSampleWeights[idx * 4 + 0];
- }
-
- {
- float2 sampleUV = uv + gSampleOffsets[idx * 2 + 0].zw;
- output += source.SampleLevel(samp, sampleUV, 0) * gSampleWeights[idx * 4 + 1];
- }
-
- {
- float2 sampleUV = uv + gSampleOffsets[idx * 2 + 1].xy;
- output += source.SampleLevel(samp, sampleUV, 0) * gSampleWeights[idx * 4 + 2];
- }
-
- {
- float2 sampleUV = uv + gSampleOffsets[idx * 2 + 1].zw;
- output += source.SampleLevel(samp, sampleUV, 0) * gSampleWeights[idx * 4 + 3];
- }
- }
-
- int extraSamples = gNumSamples - idx * 4;
- [branch]
- if(extraSamples >= 1)
- {
- float2 sampleUV = uv + gSampleOffsets[idx * 2 + 0].xy;
- output += source.SampleLevel(samp, sampleUV, 0) * gSampleWeights[idx * 4 + 0];
-
- [branch]
- if(extraSamples >= 2)
- {
- float2 sampleUV = uv + gSampleOffsets[idx * 2 + 0].zw;
- output += source.SampleLevel(samp, sampleUV, 0) * gSampleWeights[idx * 4 + 1];
-
- [branch]
- if(extraSamples >= 3)
- {
- float2 sampleUV = uv + gSampleOffsets[idx * 2 + 1].xy;
- output += source.SampleLevel(samp, sampleUV, 0) * gSampleWeights[idx * 4 + 2];
- }
- }
- }
- return output;
- }
- };
- };
|