a question about fresnel effect...
hi guys
a few days before I borrowed the "The CG Tutorial" from one of my friends for reading one of its chapters named "environment mapping techniques" and i came up with a wierd formula which is ::
float reflectionCoefficient = max( 0, min(1, bias + scale * pow(1 + dot(In.incident, In.normal), power) ) );
althouh the formula in the book was mathematical, you see the HLSL equivalent(since i coudn't write the original formula because of the power i posted the one above).
my question is what are "bias" "scale" "power" and in what range they should be initialized. it seems to me that scale is between 0 and 1. and also bias is lesser that one because of the min() function but i have no idea about power. if you have any practical values for these globals please send me.
THX in advance.
Ok, so that code calculates something like the fresnel term, however it is written a bit(to be honest, fuc*ing) ugly :), so I do not wonder at your confusion about it. It also doesn't really seem correct to me, since I can't see any indices of refraction involved in the computation. Anyways, here's how I compute the Fresnel term:
where R0 is (n1 - n2) ^ 2 / (n1 + n2) ^ 2, where n1,n2 are the indices of refraction.
There's a possibility that your code would be a tiny bit faster, but definitely mine is more precise :)
float fresnel(float3 light, float3 normal, float R0){ float cosAngle = 1.0f - dot(light, normal); float result = cosAngle * cosAngle; result = result * result; result = result * cosAngle; result = saturate((R0 + (1.0f-R0) * result)); return result;}
where R0 is (n1 - n2) ^ 2 / (n1 + n2) ^ 2, where n1,n2 are the indices of refraction.
There's a possibility that your code would be a tiny bit faster, but definitely mine is more precise :)
Could you explain a little bit more about R0. what are indices of refraction(n1, n2)???
here is my VS and PS for fresnel effect ::
here is my VS and PS for fresnel effect ::
VS_OUTPUT_FRESNEL fresnel_VS( float4 inPosition : POSITION, float2 inTexCoord : TEXCOORD0, float3 inNormal : NORMAL ){ VS_OUTPUT_FRESNEL output = (VS_OUTPUT_FRESNEL)0; float3 incident = inPosition.xyz - eyePosition; output.incident = incident; output.reflectVec = reflect(incident, inNormal); float3 cam2Vert = normalize(eyePosition - inPosition.xyz); output.refractVec = refract(cam2Vert, inNormal, etaRatio); output.oPosition = mul(worldViewProjMat, inPosition); output.texCoord = inTexCoord; output.normal = inNormal; output.objPos = inPosition; return output;}float4 fresnel_PS( VS_OUTPUT_FRESNEL In ) : COLOR{ float4 texColor = tex2D(meshTextureSampler, In.texCoord); float4 reflectedColor = texCUBE(envMapSampler, In.reflectVec); float4 refractedColor = texCUBE(envMapSampler, In.refractVec); lightFuncOutput lightResult; float4 diffuseSum = 0; float4 specularSum = 0; for(int i = 0; i < numOfLights; i++) { lightResult = LightPoint(lights, In.objPos, In.normal, In.cam2Vert); diffuseSum += lightResult.diffuseResult ; specularSum += lightResult.specularResult ; } float4 ambient = materialAmbient * globalAmbient; float4 diffuse = materialDiffuse * diffuseSum; float4 specular = materialSpecular * specularSum; float4 lightingColor = ambient + diffuse + specular; float4 objColor = lerp(texColor, lightingColor , 0.5); float reflectionCoefficient = max( 0, min(1, bias + scale * pow(1 + dot(In.incident, In.normal), power) ) ); float4 color = reflectionCoefficient * reflectedColor + (1 - reflectionCoefficient) * refractedColor; return lerp(objColor, color, 0.5);}
R0 is a constant, fresnel constant. Indices of refraction are numbers, describing each material and how it reacts when the light hits its boundary. Here is a decent paper focused on this subject.
Regarding your shaders, instead of this line:
try this line
As you can see R0 becoms 0.02037f, it is the fresnel constant for water-air boundary.
Regarding your shaders, instead of this line:
float reflectionCoefficient = max( 0, min(1, bias + scale * pow(1 + dot(In.incident, In.normal), power) ) );
try this line
float reflectionCoefficient = fresnel(In.incident, In.normal, 0.02037f);
As you can see R0 becoms 0.02037f, it is the fresnel constant for water-air boundary.
This topic is closed to new replies.
Advertisement
Popular Topics
Advertisement