39 lines
1.1 KiB
GLSL
39 lines
1.1 KiB
GLSL
#version 330
|
|
layout(location = 0) in vec3 aPosition;
|
|
layout(location = 1) in vec3 aNormal;
|
|
|
|
out vec3 vPosition;
|
|
out vec3 vNormal;
|
|
|
|
// Model View Projection matrix found by P * V * M
|
|
struct MVP {
|
|
mat4 model;
|
|
mat4 view;
|
|
mat4 projection;
|
|
// Additional uniform to allow CPU to provide mat3(transpose(inverse(uModel)))
|
|
// + Makes a big difference in quality of diffuse shading
|
|
// + QMatrix4x4.normalMatrix() returns a mat3 that can be used as a uniform
|
|
mat3 normalMatrix;
|
|
};
|
|
uniform MVP uMVP;
|
|
|
|
vec4 VertexPosition(in MVP mvp, in vec3 position)
|
|
{
|
|
return mvp.projection * mvp.view * mvp.model * vec4(position, 1.0f);
|
|
}
|
|
|
|
void main()
|
|
{
|
|
// Find normals, pass to fragment shader
|
|
vNormal = uMVP.normalMatrix * aNormal;
|
|
// vNormal = aNormal; // This is possible without the additional uniform
|
|
// Or you could find this on the GPU using the uModel matrix
|
|
// vNormal = mat3(transpose(inverse(uModel))) * aNormal;
|
|
|
|
// Set the vertex position to pass to fragment shader using only model matrix
|
|
vPosition = vec3(uMVP.model * vec4(aPosition, 1.0f));
|
|
|
|
// Set vertex gl_Position using MVP matrix
|
|
gl_Position = VertexPosition(uMVP, aPosition);
|
|
}
|