From dd2a7ed915521950099deae6bb587f9a78dd73d9 Mon Sep 17 00:00:00 2001 From: "re.kovalev" Date: Wed, 28 Feb 2024 12:41:10 +0300 Subject: [PATCH] =?UTF-8?q?=D0=A8=D0=B5=D0=B9=D0=B4=D0=B5=D1=80=D1=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- shaders/gshader.vert | 34 ++++++++++++++++++++++++++++++---- shaders/sun_shadow.vert | 26 +++++++++++++++++++++++++- 2 files changed, 55 insertions(+), 5 deletions(-) diff --git a/shaders/gshader.vert b/shaders/gshader.vert index 1b070e3..ec19eaa 100644 --- a/shaders/gshader.vert +++ b/shaders/gshader.vert @@ -5,6 +5,8 @@ layout(location = 1) in vec2 inTexCoord; layout(location = 2) in vec3 normals; layout(location = 3) in vec3 tangent; layout(location = 4) in vec3 bitangent; +layout(location = 5) in ivec4 boneIds; +layout(location = 6) in vec4 boneWeights; layout(std140, binding = 0) uniform Camera { @@ -25,6 +27,13 @@ layout(std140, binding = 1) uniform Material bool displacementmapped; }; +layout(std140, binding = 5) uniform BonesMatrices +{ + mat4 bonesMatrices[100]; +}; + +uniform bool hasBones = false; + uniform sampler2D tex_heights; uniform float displacement_heightScale = 0.1; @@ -39,15 +48,32 @@ out vec3 view; // Вектор от поверхности к камере void main() { - vec4 P = model * vec4(pos, 1.0); // трансформация вершины + mat4 totalTransform; + if (!hasBones) + totalTransform = model; + else + { + totalTransform = mat4(0.0); + for (int i = 0; i < 4; i++) + { + if (boneIds[i] == -1 || boneIds[i] >= 100) + continue; + + totalTransform += bonesMatrices[boneIds[i]] * boneWeights[i]; + } + + totalTransform = totalTransform * model; + } + + vec4 P = totalTransform * vec4(pos, 1.0); // трансформация вершины vertex = P.xyz; - N = normalize(mat3(model) * normals); // трансформация нормали + N = normalize(mat3(totalTransform) * normals); // трансформация нормали texCoord = inTexCoord; // Текстурные координаты - T = normalize(mat3(model) * tangent); - B = normalize(mat3(model) * bitangent); + T = normalize(mat3(totalTransform) * tangent); + B = normalize(mat3(totalTransform) * bitangent); view = camera.position - vertex; diff --git a/shaders/sun_shadow.vert b/shaders/sun_shadow.vert index cbe3f11..431ca1d 100644 --- a/shaders/sun_shadow.vert +++ b/shaders/sun_shadow.vert @@ -1,10 +1,34 @@ #version 420 core layout (location = 0) in vec3 pos; +layout(location = 5) in ivec4 boneIds; +layout(location = 6) in vec4 boneWeights; + +layout(std140, binding = 5) uniform BonesMatrices +{ + mat4 bonesMatrices[100]; +}; + +uniform bool hasBones = false; uniform mat4 model; void main() { - gl_Position = model * vec4(pos, 1.0); + mat4 totalTransform; + if (!hasBones) + totalTransform = model; + else + { + totalTransform = mat4(0.0); + for (int i = 0; i < 4; i++) + { + if (boneIds[i] == -1 || boneIds[i] >= 100) + continue; + + totalTransform += bonesMatrices[boneIds[i]] * boneWeights[i]; + } + totalTransform = totalTransform * model; + } + gl_Position = totalTransform * vec4(pos, 1.0); }