diff --git a/include/mesh.h b/include/mesh.h index 55b2afd..95b61b3 100644 --- a/include/mesh.h +++ b/include/mesh.h @@ -6,7 +6,7 @@ #include struct Vertex { - glm::vec3 position; + glm::vec3 position, normal; }; class Mesh { diff --git a/shaders/triangle.frag b/shaders/triangle.frag index de2fc6a..f43ff2b 100644 --- a/shaders/triangle.frag +++ b/shaders/triangle.frag @@ -1,7 +1,14 @@ #version 460 core +layout(location = 0) in vec3 inFragPos; +layout(location = 1) in vec3 inNormal; + layout(location = 0) out vec4 outColor; void main() { - outColor = vec4(1.0); + const vec3 norm = normalize(inNormal); + const vec3 lightDir = normalize(vec3(5) - inFragPos); + + const float diff = max(dot(norm, lightDir), 0.0); + outColor = vec4(vec3(0.1) + vec3(diff), 1.0); } diff --git a/shaders/triangle.vert b/shaders/triangle.vert index ff6a7db..0f770fd 100644 --- a/shaders/triangle.vert +++ b/shaders/triangle.vert @@ -1,6 +1,10 @@ #version 460 core layout(location = 0) in vec3 inPosition; +layout(location = 1) in vec3 inNormal; + +layout(location = 0) out vec3 outFragPos; +layout(location = 1) out vec3 outNormal; layout(push_constant) uniform PushConstants { mat4 mvp; @@ -8,4 +12,6 @@ layout(push_constant) uniform PushConstants { void main() { gl_Position = pushConstants.mvp * vec4(inPosition, 1.0); + outFragPos = inPosition; + outNormal = inNormal; } diff --git a/src/main.cpp b/src/main.cpp index ff58593..15b96cd 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -48,7 +48,8 @@ int main(int, char*[]) { for(unsigned int i = 0; i < m->mNumVertices; i++) { Vertex vertex; vertex.position = glm::vec3(m->mVertices[i].x, m->mVertices[i].y, m->mVertices[i].z); - + vertex.normal = glm::vec3(m->mNormals[i].x, m->mNormals[i].y, m->mNormals[i].z); + mesh->vertices.push_back(vertex); } diff --git a/src/worldpass.cpp b/src/worldpass.cpp index 5822208..86d7287 100644 --- a/src/worldpass.cpp +++ b/src/worldpass.cpp @@ -58,12 +58,22 @@ void WorldPass::createPipeline() { VkVertexInputAttributeDescription positionAttributeDescription = {}; positionAttributeDescription.format = VK_FORMAT_R32G32B32_SFLOAT; + VkVertexInputAttributeDescription normalAttributeDescription = {}; + normalAttributeDescription.location = 1; + normalAttributeDescription.offset = offsetof(Vertex, normal); + normalAttributeDescription.format = VK_FORMAT_R32G32B32_SFLOAT; + + const std::array attributes = { + positionAttributeDescription, + normalAttributeDescription + }; + VkPipelineVertexInputStateCreateInfo vertexInputInfo = {}; vertexInputInfo.sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO; vertexInputInfo.vertexBindingDescriptionCount = 1; vertexInputInfo.pVertexBindingDescriptions = &vertexBindingDescription; - vertexInputInfo.vertexAttributeDescriptionCount = 1; - vertexInputInfo.pVertexAttributeDescriptions = &positionAttributeDescription; + vertexInputInfo.vertexAttributeDescriptionCount = attributes.size(); + vertexInputInfo.pVertexAttributeDescriptions = attributes.data(); VkPipelineInputAssemblyStateCreateInfo inputAssembly = {}; inputAssembly.sType = VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;