# a question about fresnel effect...

This topic is 4537 days old which is more than the 365 day threshold we allow for new replies. Please post a new topic.

## Recommended Posts

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.

Any idea???

##### Share on other sites
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:
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 :)

##### Share on other sites
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 ::
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);}

##### Share on other sites
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.

    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.

1. 1
Rutin
42
2. 2
3. 3
4. 4
5. 5

• 9
• 27
• 20
• 14
• 14
• ### Forum Statistics

• Total Topics
633385
• Total Posts
3011600
• ### Who's Online (See full list)

There are no registered users currently online

×