- Home /
Extract dominant light direction from lightprobes?
Im trying to find a way to do specular highlights using lightprobes. This article describes a way to extract the dominant light direction using this equation:
I am struggling a bit to implement it using the variables exposed by Unity:
// SH lighting environment
float4 unity_SHAr;
float4 unity_SHAg;
float4 unity_SHAb;
float4 unity_SHBr;
float4 unity_SHBg;
float4 unity_SHBb;
float4 unity_SHC;
I am not entirely sure how for instance Le3r corresponds to the variables above. Am I correct to assume part of the third band is packed in the w values of bands one and two?
To complicate things further, I have been looking at the example code provided in the article linked above, but the implementation there does not seem to correspond to the equation from the same article:
vec3 lightDirR = normalize(vec3(-sh1_r.x, -sh0_r.y, sh0_r.z));
vec3 lightDirG = normalize(vec3(-sh1_g.x, -sh0_g.y, sh0_g.z));
vec3 lightDirB = normalize(vec3(-sh1_b.x, -sh0_b.y, sh0_b.z));
vec3 lightDir = normalize( 0.3*lightDirR + 0.59*lightDirG + 0.11*lightDirB );
It seems that the third band is not used at all, and naively translating this code to CG using the variables exposed by Unity does not yield correct results:
float3 lightDirR = normalize(float3(-unity_SHBr.x, -unity_SHAr.y, unity_SHAr.z));
float3 lightDirG = normalize(float3(-unity_SHBg.x, -unity_SHAg.y, unity_SHAg.z));
float3 lightDirB = normalize(float3(-unity_SHBb.x, -unity_SHAb.y, unity_SHAb.z));
float3 lightDir = normalize(0.3*lightDirR + 0.59*lightDirG + 0.11*lightDirB);
I have been seeing good results with the following, but my understanding of sh is not deep enough to be confident this is a robust approach:
normalize((0.3*unity_SHAr + 0.59*unity_SHAg + 0.11*unity_SHAb).rgb)
Any insights would be appreciated.
Your answer
Follow this Question
Related Questions
Specular highlights with lightprobes 0 Answers
Lightmap with bump/specular problem Unity 3 Pro 2 Answers
use Alpha channel for specular mapping 5 Answers
Is this spec method any faster than using pow()? 1 Answer
Without normal map material 0 Answers