#version 450 #extension GL_KHR_vulkan_glsl : enable layout(location = 0) in vec3 aVertexPos; layout(location = 1) in vec2 aUV; layout(location = 2) in vec3 aNormal; layout(location = 3) in vec3 aTangent; layout(location = 4) in mat4 worldTransform; layout(location = 8) in uvec2 integerData; layout(location = 0) out struct { vec4 vertPos; // location 0 vec2 uv; // location = 1 vec4 normal; // location = 2 vec4 worldPos; // location = 3 vec3 worldNormal; // location = 4 } Out; struct GenericData { //! Delta time float dt; //! Elapsed time of the application float elapsedTime; //! Viewport width of the scene (excluding imgui, that means smaller than window) uint viewportWidth; //! Ditto but for height uint viewportHeight; }; // material stuff layout(location = 5) out struct { int materialIndex; uint eid; uint lightLayerIndex; vec3 screenSpacePos; } Out2; layout(set = 1, binding = 0) uniform CameraData { vec4 position; mat4 vpMat; mat4 viewMat; mat4 projMat; } cameraData; layout (set = 0, binding = 0) uniform GenericDataBuffer { GenericData data; } genericDataBuffer; void main() { Out2.materialIndex = gl_InstanceIndex; Out2.eid = integerData[0]; Out2.lightLayerIndex = integerData[1]; // for transforming gBuffer position and normal data mat4 modelViewMat = cameraData.viewMat * worldTransform; // gBuffer position will be in view space Out.vertPos = modelViewMat * vec4(aVertexPos, 1.0f); Out.worldPos = worldTransform * vec4 (aVertexPos, 1.0f); // uvs for texturing in fragment shader Out.uv = aUV; mat3 mvTransInv = mat3 (transpose(inverse(modelViewMat))); mat3 modelTransInv = mat3 (transpose(inverse(worldTransform))); // normals are also in view space Out.normal.rgb = mvTransInv * aNormal.rgb; Out.normal.rgb = normalize (Out.normal.rgb); Out.worldNormal = normalize (modelTransInv * aNormal); // Get center of object in world position vec4 worldPos = vec4(worldTransform[3][0], worldTransform[3][1], worldTransform[3][2], 1.0f); // transform to clip space worldPos = cameraData.vpMat * worldPos; worldPos.xyz /= worldPos.w; // transform to screen space worldPos.xy = ((worldPos.xy + vec2(1.0f)) * vec2 (0.5f)) * vec2 (genericDataBuffer.data.viewportWidth, genericDataBuffer.data.viewportHeight); Out2.screenSpacePos = worldPos.xyz; // clip space for rendering gl_Position = cameraData.vpMat * worldTransform * vec4 (aVertexPos, 1.0f); }