/******************************************************************************************* * * rPBR [shader] - Physically based rendering vertex shader * * Copyright (c) 2017 Victor Fisac * **********************************************************************************************/ #version 330 // Input vertex attributes in vec3 vertexPosition; in vec2 vertexTexCoord; in vec3 vertexNormal; in vec4 vertexTangent; // Input uniform values uniform mat4 mvp; uniform mat4 matModel; // Output vertex attributes (to fragment shader) out vec3 fragPosition; out vec2 fragTexCoord; out vec3 fragNormal; out vec3 fragTangent; out vec3 fragBinormal; void main() { // Calculate binormal from vertex normal and tangent vec3 vertexBinormal = cross(vertexNormal, vec3(vertexTangent)); // Calculate fragment normal based on normal transformations mat3 normalMatrix = transpose(inverse(mat3(matModel))); // Calculate fragment position based on model transformations fragPosition = vec3(matModel*vec4(vertexPosition, 1.0f)); // Send vertex attributes to fragment shader fragTexCoord = vertexTexCoord; fragNormal = normalize(normalMatrix*vertexNormal); fragTangent = normalize(normalMatrix*vec3(vertexTangent)); fragTangent = normalize(fragTangent - dot(fragTangent, fragNormal)*fragNormal); fragBinormal = normalize(normalMatrix*vertexBinormal); fragBinormal = cross(fragNormal, fragTangent); // Calculate final vertex position gl_Position = mvp*vec4(vertexPosition, 1.0); }