|
|
|
@ -835,40 +835,36 @@ QByteArray ShaderManager::generateFragmentSource(ShaderTraits traits) const
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
stream << "\nvoid main(void)\n{\n";
|
|
|
|
|
stream << " vec4 result;\n";
|
|
|
|
|
if (traits & ShaderTrait::MapTexture) {
|
|
|
|
|
stream << "vec2 texcoordC = texcoord0;\n";
|
|
|
|
|
|
|
|
|
|
if (traits & (ShaderTrait::Modulate | ShaderTrait::AdjustSaturation)) {
|
|
|
|
|
stream << " vec4 texel = " << textureLookup << "(sampler, texcoordC);\n";
|
|
|
|
|
if (traits & ShaderTrait::Modulate) {
|
|
|
|
|
stream << " texel *= modulation;\n";
|
|
|
|
|
}
|
|
|
|
|
if (traits & ShaderTrait::AdjustSaturation) {
|
|
|
|
|
stream << " texel.rgb = mix(vec3(dot(texel.rgb, vec3(0.2126, 0.7152, 0.0722))), texel.rgb, saturation);\n";
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
stream << " " << output << " = texel;\n";
|
|
|
|
|
} else {
|
|
|
|
|
stream << " " << output << " = " << textureLookup << "(sampler, texcoordC);\n";
|
|
|
|
|
}
|
|
|
|
|
stream << " result = " << textureLookup << "(sampler, texcoord0);\n";
|
|
|
|
|
} else if (traits & ShaderTrait::UniformColor) {
|
|
|
|
|
stream << " " << output << " = geometryColor;\n";
|
|
|
|
|
stream << " result = geometryColor;\n";
|
|
|
|
|
}
|
|
|
|
|
if (traits & ShaderTrait::AdjustSaturation) {
|
|
|
|
|
stream << " result.rgb = mix(vec3(dot(result.rgb, vec3(0.2126, 0.7152, 0.0722))), result.rgb, saturation);\n";
|
|
|
|
|
}
|
|
|
|
|
if (traits & ShaderTrait::TransformColorspace) {
|
|
|
|
|
// sRGB -> output colorspace & linear
|
|
|
|
|
stream << " if (sourceNamedTransferFunction == 0) {\n";
|
|
|
|
|
stream << " result.rgb = sdrBrightness * srgbToLinear(result.rgb);\n";
|
|
|
|
|
stream << " }\n";
|
|
|
|
|
stream << " result.rgb = doTonemapping(colorimetryTransform * result.rgb, maxHdrBrightness);\n";
|
|
|
|
|
}
|
|
|
|
|
if (traits & ShaderTrait::Modulate) {
|
|
|
|
|
stream << " result *= modulation;\n";
|
|
|
|
|
}
|
|
|
|
|
if (traits & ShaderTrait::TransformColorspace) {
|
|
|
|
|
// simple sRGB -> linear
|
|
|
|
|
stream << "if (sourceNamedTransferFunction == 0) {\n";
|
|
|
|
|
stream << " " << output << ".rgb = sdrBrightness * srgbToLinear(" << output << ".rgb);\n";
|
|
|
|
|
stream << "}\n";
|
|
|
|
|
stream << " " << output << ".rgb = doTonemapping(colorimetryTransform * " << output << ".rgb, maxHdrBrightness);\n";
|
|
|
|
|
// nits -> simple sRGB
|
|
|
|
|
stream << "if (destinationNamedTransferFunction == 0) {\n";
|
|
|
|
|
stream << " " << output << ".rgb = linearToSrgb(doTonemapping(" << output << ".rgb, sdrBrightness) / sdrBrightness);\n";
|
|
|
|
|
stream << " if (destinationNamedTransferFunction == 0) {\n";
|
|
|
|
|
stream << " result.rgb = linearToSrgb(doTonemapping(result.rgb, sdrBrightness) / sdrBrightness);\n";
|
|
|
|
|
// nits -> PQ
|
|
|
|
|
stream << "} else if (destinationNamedTransferFunction == 2) {\n";
|
|
|
|
|
stream << " " << output << ".rgb = nitsToPq(" << output << ".rgb);\n";
|
|
|
|
|
stream << "}\n";
|
|
|
|
|
stream << " } else if (destinationNamedTransferFunction == 2) {\n";
|
|
|
|
|
stream << " result.rgb = nitsToPq(result.rgb);\n";
|
|
|
|
|
stream << " }\n";
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
stream << " " << output << " = result;\n";
|
|
|
|
|
stream << "}";
|
|
|
|
|
stream.flush();
|
|
|
|
|
return source;
|
|
|
|
|