summaryrefslogtreecommitdiff
path: root/indra/newview/app_settings/shaders/class1
diff options
context:
space:
mode:
Diffstat (limited to 'indra/newview/app_settings/shaders/class1')
-rw-r--r--indra/newview/app_settings/shaders/class1/interface/irradianceGenF.glsl198
-rw-r--r--indra/newview/app_settings/shaders/class1/interface/radianceGenF.glsl4
2 files changed, 5 insertions, 197 deletions
diff --git a/indra/newview/app_settings/shaders/class1/interface/irradianceGenF.glsl b/indra/newview/app_settings/shaders/class1/interface/irradianceGenF.glsl
index 3e056aa048..2b1e794b52 100644
--- a/indra/newview/app_settings/shaders/class1/interface/irradianceGenF.glsl
+++ b/indra/newview/app_settings/shaders/class1/interface/irradianceGenF.glsl
@@ -23,205 +23,11 @@
* $/LicenseInfo$
*/
+// debug stub
-/*[EXTRA_CODE_HERE]*/
-
-
-#ifdef DEFINE_GL_FRAGCOLOR
out vec4 frag_color;
-#else
-#define frag_color gl_FragColor
-#endif
-
-uniform samplerCubeArray reflectionProbes;
-uniform int sourceIdx;
-
-VARYING vec3 vary_dir;
-
-
-// Code below is derived from the Khronos GLTF Sample viewer:
-// https://github.com/KhronosGroup/glTF-Sample-Viewer/blob/master/source/shaders/ibl_filtering.frag
-
-
-#define MATH_PI 3.1415926535897932384626433832795
-
-float u_roughness = 1.0;
-int u_sampleCount = 16;
-float u_lodBias = 2.0;
-int u_width = 64;
-
-// Hammersley Points on the Hemisphere
-// CC BY 3.0 (Holger Dammertz)
-// http://holger.dammertz.org/stuff/notes_HammersleyOnHemisphere.html
-// with adapted interface
-float radicalInverse_VdC(uint bits)
-{
- bits = (bits << 16u) | (bits >> 16u);
- bits = ((bits & 0x55555555u) << 1u) | ((bits & 0xAAAAAAAAu) >> 1u);
- bits = ((bits & 0x33333333u) << 2u) | ((bits & 0xCCCCCCCCu) >> 2u);
- bits = ((bits & 0x0F0F0F0Fu) << 4u) | ((bits & 0xF0F0F0F0u) >> 4u);
- bits = ((bits & 0x00FF00FFu) << 8u) | ((bits & 0xFF00FF00u) >> 8u);
- return float(bits) * 2.3283064365386963e-10; // / 0x100000000
-}
-
-// hammersley2d describes a sequence of points in the 2d unit square [0,1)^2
-// that can be used for quasi Monte Carlo integration
-vec2 hammersley2d(int i, int N) {
- return vec2(float(i)/float(N), radicalInverse_VdC(uint(i)));
-}
-
-// Hemisphere Sample
-
-// TBN generates a tangent bitangent normal coordinate frame from the normal
-// (the normal must be normalized)
-mat3 generateTBN(vec3 normal)
-{
- vec3 bitangent = vec3(0.0, 1.0, 0.0);
-
- float NdotUp = dot(normal, vec3(0.0, 1.0, 0.0));
- float epsilon = 0.0000001;
- /*if (1.0 - abs(NdotUp) <= epsilon)
- {
- // Sampling +Y or -Y, so we need a more robust bitangent.
- if (NdotUp > 0.0)
- {
- bitangent = vec3(0.0, 0.0, 1.0);
- }
- else
- {
- bitangent = vec3(0.0, 0.0, -1.0);
- }
- }*/
-
- vec3 tangent = normalize(cross(bitangent, normal));
- bitangent = cross(normal, tangent);
-
- return mat3(tangent, bitangent, normal);
-}
-
-struct MicrofacetDistributionSample
-{
- float pdf;
- float cosTheta;
- float sinTheta;
- float phi;
-};
-
-MicrofacetDistributionSample Lambertian(vec2 xi, float roughness)
-{
- MicrofacetDistributionSample lambertian;
-
- // Cosine weighted hemisphere sampling
- // http://www.pbr-book.org/3ed-2018/Monte_Carlo_Integration/2D_Sampling_with_Multidimensional_Transformations.html#Cosine-WeightedHemisphereSampling
- lambertian.cosTheta = sqrt(1.0 - xi.y);
- lambertian.sinTheta = sqrt(xi.y); // equivalent to `sqrt(1.0 - cosTheta*cosTheta)`;
- lambertian.phi = 2.0 * MATH_PI * xi.x;
-
- lambertian.pdf = lambertian.cosTheta / MATH_PI; // evaluation for solid angle, therefore drop the sinTheta
-
- return lambertian;
-}
-
-// getImportanceSample returns an importance sample direction with pdf in the .w component
-vec4 getImportanceSample(int sampleIndex, vec3 N, float roughness)
-{
- // generate a quasi monte carlo point in the unit square [0.1)^2
- vec2 xi = hammersley2d(sampleIndex, u_sampleCount);
-
- MicrofacetDistributionSample importanceSample;
-
- // generate the points on the hemisphere with a fitting mapping for
- // the distribution (e.g. lambertian uses a cosine importance)
- importanceSample = Lambertian(xi, roughness);
-
- // transform the hemisphere sample to the normal coordinate frame
- // i.e. rotate the hemisphere to the normal direction
- vec3 localSpaceDirection = normalize(vec3(
- importanceSample.sinTheta * cos(importanceSample.phi),
- importanceSample.sinTheta * sin(importanceSample.phi),
- importanceSample.cosTheta
- ));
- mat3 TBN = generateTBN(N);
- vec3 direction = TBN * localSpaceDirection;
-
- return vec4(direction, importanceSample.pdf);
-}
-
-// Mipmap Filtered Samples (GPU Gems 3, 20.4)
-// https://developer.nvidia.com/gpugems/gpugems3/part-iii-rendering/chapter-20-gpu-based-importance-sampling
-// https://cgg.mff.cuni.cz/~jaroslav/papers/2007-sketch-fis/Final_sap_0073.pdf
-float computeLod(float pdf)
-{
- // // Solid angle of current sample -- bigger for less likely samples
- // float omegaS = 1.0 / (float(u_sampleCount) * pdf);
- // // Solid angle of texel
- // // note: the factor of 4.0 * MATH_PI
- // float omegaP = 4.0 * MATH_PI / (6.0 * float(u_width) * float(u_width));
- // // Mip level is determined by the ratio of our sample's solid angle to a texel's solid angle
- // // note that 0.5 * log2 is equivalent to log4
- // float lod = 0.5 * log2(omegaS / omegaP);
-
- // babylon introduces a factor of K (=4) to the solid angle ratio
- // this helps to avoid undersampling the environment map
- // this does not appear in the original formulation by Jaroslav Krivanek and Mark Colbert
- // log4(4) == 1
- // lod += 1.0;
-
- // We achieved good results by using the original formulation from Krivanek & Colbert adapted to cubemaps
-
- // https://cgg.mff.cuni.cz/~jaroslav/papers/2007-sketch-fis/Final_sap_0073.pdf
- float lod = 0.5 * log2( 6.0 * float(u_width) * float(u_width) / (float(u_sampleCount) * pdf));
-
-
- return lod;
-}
-
-vec4 filterColor(vec3 N)
-{
- //return textureLod(uCubeMap, N, 3.0).rgb;
- vec4 color = vec4(0.f);
- float weight = 0.0f;
-
- for(int i = 0; i < u_sampleCount; ++i)
- {
- vec4 importanceSample = getImportanceSample(i, N, 1.0);
-
- vec3 H = vec3(importanceSample.xyz);
- float pdf = importanceSample.w;
-
- // mipmap filtered samples (GPU Gems 3, 20.4)
- float lod = computeLod(pdf);
-
- // apply the bias to the lod
- lod += u_lodBias;
-
- lod = clamp(lod, 0, 6);
- // sample lambertian at a lower resolution to avoid fireflies
- vec4 lambertian = textureLod(reflectionProbes, vec4(H, sourceIdx), lod);
-
- color += lambertian;
- }
-
- if(weight != 0.0f)
- {
- color /= weight;
- }
- else
- {
- color /= float(u_sampleCount);
- }
-
- return min(color*1.9, vec4(1));
-}
-
-// entry point
void main()
{
- vec4 color = vec4(0);
-
- color = filterColor(vary_dir);
-
- frag_color = color;
+ frag_color = vec4(0.5, 0, 0.5, 0);
}
-
diff --git a/indra/newview/app_settings/shaders/class1/interface/radianceGenF.glsl b/indra/newview/app_settings/shaders/class1/interface/radianceGenF.glsl
index 858052281b..e60ddcd569 100644
--- a/indra/newview/app_settings/shaders/class1/interface/radianceGenF.glsl
+++ b/indra/newview/app_settings/shaders/class1/interface/radianceGenF.glsl
@@ -37,6 +37,8 @@ VARYING vec3 vary_dir;
uniform float mipLevel;
uniform int u_width;
+uniform float max_probe_lod;
+
// =============================================================================================================
// Parts of this file are (c) 2018 Sascha Willems
@@ -128,7 +130,7 @@ vec4 prefilterEnvMap(vec3 R)
float envMapDim = u_width;
int numSamples = 4;
- float numMips = 6.0;
+ float numMips = max_probe_lod;
float roughness = mipLevel/numMips;