49 lines
No EOL
1.5 KiB
GLSL
49 lines
No EOL
1.5 KiB
GLSL
/*******************************************************************************************
|
|
*
|
|
* 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.0))
|
|
|
|
# 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)
|
|
] |