mirror of
https://github.com/OpenSpace/OpenSpace.git
synced 2026-02-22 04:49:12 -06:00
57 lines
3.1 KiB
Plaintext
57 lines
3.1 KiB
Plaintext
/*****************************************************************************************
|
|
* *
|
|
* OpenSpace *
|
|
* *
|
|
* Copyright (c) 2014 - 2017 *
|
|
* *
|
|
* Permission is hereby granted, free of charge, to any person obtaining a copy of this *
|
|
* software and associated documentation files (the "Software"), to deal in the Software *
|
|
* without restriction, including without limitation the rights to use, copy, modify, *
|
|
* merge, publish, distribute, sublicense, and/or sell copies of the Software, and to *
|
|
* permit persons to whom the Software is furnished to do so, subject to the following *
|
|
* conditions: *
|
|
* *
|
|
* The above copyright notice and this permission notice shall be included in all copies *
|
|
* or substantial portions of the Software. *
|
|
* *
|
|
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, *
|
|
* INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A *
|
|
* PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT *
|
|
* HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF *
|
|
* CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE *
|
|
* OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. *
|
|
****************************************************************************************/
|
|
|
|
#ifndef GLOBESHADING_HGLSL
|
|
#define GLOBESHADING_HGLSL
|
|
|
|
float orenNayarDiffuse(vec3 lightDirection, vec3 viewDirection, vec3 surfaceNormal,
|
|
float roughness)
|
|
{
|
|
// calculate intermediary values
|
|
float NdotL = dot(surfaceNormal, lightDirection);
|
|
float NdotV = dot(surfaceNormal, viewDirection);
|
|
|
|
float angleVN = acos(NdotV);
|
|
float angleLN = acos(NdotL);
|
|
|
|
float alpha = max(angleVN, angleLN);
|
|
float beta = min(angleVN, angleLN);
|
|
float gamma = dot(
|
|
viewDirection - surfaceNormal * dot(viewDirection, surfaceNormal),
|
|
lightDirection - surfaceNormal * dot(lightDirection, surfaceNormal)
|
|
);
|
|
|
|
float roughnessSquared = roughness * roughness;
|
|
|
|
// calculate A and B
|
|
float A = 1.0 - 0.5 * (roughnessSquared / (roughnessSquared + 0.57));
|
|
float B = 0.45 * (roughnessSquared / (roughnessSquared + 0.09));
|
|
float C = sin(alpha) * tan(beta);
|
|
|
|
// put it all together
|
|
return max(0.0, NdotL) * (A + B * max(0.0, gamma) * C);
|
|
}
|
|
|
|
#endif // GLOBESHADING_HGLSL
|