mirror of
https://github.com/overte-org/overte.git
synced 2025-08-15 07:14:58 +02:00
converting material and mesh from srgb to linear in pipeline
This commit is contained in:
parent
c9ddaf78a1
commit
a6db88f257
4 changed files with 50 additions and 2 deletions
|
@ -13,6 +13,18 @@
|
|||
using namespace model;
|
||||
using namespace gpu;
|
||||
|
||||
float componentSRGBToLinear(float cs) {
|
||||
if (cs > 0.04045) {
|
||||
return pow(((cs + 0.055)/1.055), 2.4);
|
||||
} else {
|
||||
return cs / 12.92;
|
||||
}
|
||||
}
|
||||
|
||||
glm::vec3 convertSRGBToLinear(const glm::vec3& srgb) {
|
||||
return glm::vec3(componentSRGBToLinear(srgb.x), componentSRGBToLinear(srgb.y), componentSRGBToLinear(srgb.z));
|
||||
}
|
||||
|
||||
Material::Material() :
|
||||
_key(0),
|
||||
_schemaBuffer(),
|
||||
|
|
|
@ -23,6 +23,10 @@
|
|||
|
||||
namespace model {
|
||||
|
||||
static glm::vec3 convertSRGBToLinear(const glm::vec3& srgb);
|
||||
|
||||
|
||||
|
||||
// Material Key is a coarse trait description of a material used to classify the materials
|
||||
class MaterialKey {
|
||||
public:
|
||||
|
|
|
@ -26,8 +26,38 @@ Material getMaterial() {
|
|||
return _mat;
|
||||
}
|
||||
|
||||
float componentSRGBToLinear(float cs) {
|
||||
/* sRGB to linear conversion
|
||||
{ cs / 12.92, cs <= 0.04045
|
||||
cl = {
|
||||
{ ((cs + 0.055)/1.055)^2.4, cs > 0.04045
|
||||
|
||||
constants:
|
||||
T = 0.04045
|
||||
A = 1 / 1.055 = 0.94786729857
|
||||
B = 0.055 * A = 0.05213270142
|
||||
C = 1 / 12.92 = 0.0773993808
|
||||
G = 2.4
|
||||
*/
|
||||
const float T = 0.04045;
|
||||
const float A = 0.947867;
|
||||
const float B = 0.052132;
|
||||
const float C = 0.077399;
|
||||
const float G = 2.4;
|
||||
|
||||
if (cs > T) {
|
||||
return pow((cs * A + B), G);
|
||||
} else {
|
||||
return cs * C;
|
||||
}
|
||||
}
|
||||
|
||||
vec3 SRGBToLinear(vec3 srgb) {
|
||||
return vec3(componentSRGBToLinear(srgb.x),componentSRGBToLinear(srgb.y),componentSRGBToLinear(srgb.z));
|
||||
}
|
||||
|
||||
float getMaterialOpacity(Material m) { return m._diffuse.a; }
|
||||
vec3 getMaterialDiffuse(Material m) { return m._diffuse.rgb; }
|
||||
vec3 getMaterialDiffuse(Material m) { return (gl_FragCoord.x > 800 ? SRGBToLinear(m._diffuse.rgb) : m._diffuse.rgb); }
|
||||
vec3 getMaterialSpecular(Material m) { return m._specular.rgb; }
|
||||
float getMaterialShininess(Material m) { return m._specular.a; }
|
||||
|
||||
|
|
|
@ -28,12 +28,14 @@ void main(void) {
|
|||
// Fetch diffuse map
|
||||
vec4 diffuse = texture(diffuseMap, _texCoord0);
|
||||
|
||||
vec3 vertexColor = (gl_FragCoord.y > 400 ? SRGBToLinear(_color.rgb) : _color.rgb);
|
||||
|
||||
Material mat = getMaterial();
|
||||
|
||||
packDeferredFragment(
|
||||
normalize(_normal.xyz),
|
||||
evalOpaqueFinalAlpha(getMaterialOpacity(mat), diffuse.a),
|
||||
getMaterialDiffuse(mat) * diffuse.rgb * _color,
|
||||
getMaterialDiffuse(mat) * diffuse.rgb * vertexColor,
|
||||
getMaterialSpecular(mat),
|
||||
getMaterialShininess(mat));
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue