Files
qglengine/shaders/ds_geom.glsl

83 lines
2.6 KiB
GLSL

// vert //
out vec3 geom_normal;
out mat3 TBN;
out vec4 object_color;
out float object_flags;
const vec3 luma = vec3(0.299, 0.587, 0.114);
void main(void) {
qgl_MaterialIndex = qgl_Material;
qgl_FragTexture = qgl_getFragTexture();
geom_normal = normalize(qgl_Normal * qgl_getNormalMatrix());
TBN = qgl_getTangentMatrix() * mat3(qgl_Tangent, qgl_Bitangent, qgl_Normal);
object_color = qgl_ObjectColor;
object_flags = qgl_ObjectFlags;
float height = dot(qgl_materialTexture(QGL_MAP_RELIEF, qgl_FragTexture, vec4(0.)).rgb, luma);
gl_Position = qgl_ViewProjMatrix * (qgl_ModelMatrix * (vec4(qgl_Vertex + qgl_Normal * height, 1.)));//qgl_ftransform();
}
// frag //
in vec3 geom_normal;
in mat3 TBN;
in vec4 object_color;
in float object_flags;
uniform vec2 dt;
uniform float z_near;
uniform int out_index_normal = dbrNormalZ, out_index_metal = dbrMetalRoughReflectFlags;
const vec3 luma = vec3(0.299, 0.587, 0.114);
const float _pe = 2.4e-7;
void main(void) {
vec2 tc = qgl_FragTexture.xy;
vec4 diffuse = qgl_materialTexture(QGL_MAP_DIFFUSE, tc, vec4(0.)) * object_color;
diffuse.rgb *= qgl_material[qgl_MaterialIndex].color_diffuse.rgb;
#ifdef SOLID
if(diffuse.a < 0.5)
discard;
#endif
diffuse.a *= (1. - qgl_material[qgl_MaterialIndex].transparency);
vec3 normal, dn;
dn = qgl_materialTexture(QGL_MAP_NORMAL, tc, -vec4(0.5, 0.5, 1., 0.)).xyz;
//dn.y = -dn.y;
float dn_sl = length(dn);
dn = TBN * dn;
dn *= dn_sl / (length(dn) + 1E-6);
normal = normalize(geom_normal + dn);
float metalness = dot(qgl_materialTexture(QGL_MAP_METALNESS, tc, vec4(0.)).rgb, luma);
metalness = clamp(metalness, 0, 1);
float roughness = dot(qgl_materialTexture(QGL_MAP_ROUGHNESS, tc, vec4(0.)).rgb, luma);
roughness = clamp(roughness, 0.0001, 0.9999);
float reflectivity = clamp(qgl_material[qgl_MaterialIndex].reflectivity, 0., 1.);
vec4 emission = qgl_materialTexture(QGL_MAP_EMISSION, tc, vec4(0.));
emission *= qgl_material[qgl_MaterialIndex].color_emission;
float z = gl_FragCoord.z;
z = z + z - 1.;
z = ((_pe - 2.) * z_near) / (z + _pe - 1.); // infinite depth
qgl_FragData[dbrDiffuse ] = vec4(diffuse .rgba);
qgl_FragData[out_index_normal] = vec4(normal .xyz, z);
qgl_FragData[out_index_metal ] = vec4(metalness, roughness, reflectivity, object_flags);
qgl_FragData[dbrEmission ] = vec4(emission.rgb, 0./*bn.x*/);
//qgl_FragData[dbrSpeedBitangXY] = vec4(speed.xy, bn.yz);
qgl_FragData[dbrGeoNormal ] = vec4(normalize(geom_normal), 1.);
//ivec2 itc = ivec2(gl_FragCoord.xy);
//qgl_FragData[0].rgb = vec3(dot(n,vec3(0,0,1)));
//qgl_FragData[0].rgb = diffuse.rgb * dot(n,vec3(0,0,1));
}