converting material and mesh from srgb to linear in pipeline

This commit is contained in:
Sam Gateau 2015-08-24 14:00:48 -07:00
parent c9ddaf78a1
commit a6db88f257
4 changed files with 50 additions and 2 deletions

View file

@ -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(),

View file

@ -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:

View file

@ -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; }

View file

@ -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));
}