1
Fork 0
mirror of https://github.com/redstrate/Novus.git synced 2025-04-21 11:57:44 +00:00
novus/renderer/shaders/skinned.vert
Joshua Goins f95fd2efc2 Add a dedicated skinned shader
This is to prevent trying to use bone transforms on terrain.
2024-02-02 14:37:58 -05:00

49 lines
1.5 KiB
GLSL

// SPDX-FileCopyrightText: 2023 Joshua Goins <josh@redstrate.com>
// SPDX-License-Identifier: CC0-1.0
#version 450
layout(location = 0) in vec3 inPosition;
layout(location = 1) in vec2 inUV0;
layout(location = 2) in vec2 inUV1;
layout(location = 3) in vec3 inNormal;
layout(location = 4) in vec4 inBiTangent;
layout(location = 5) in vec4 inColor;
layout(location = 6) in vec4 inBoneWeights;
layout(location = 7) in uvec4 inBoneIds;
layout(location = 0) out vec3 outNormal;
layout(location = 1) out vec3 outFragPos;
layout(location = 2) out vec2 outUV;
layout(binding = 3) uniform sampler2D diffuseTexture;
layout(binding = 4) uniform sampler2D normalTexture;
layout(binding = 5) uniform sampler2D specularTexture;
layout(binding = 6) uniform sampler2D multiTexture;
layout(std430, push_constant) uniform PushConstant {
mat4 vp, model;
int boneOffset;
int type;
};
layout(std430, binding = 2) buffer readonly BoneInformation {
mat4 bones[128];
};
void main() {
mat4 BoneTransform = bones[boneOffset + inBoneIds[0]] * inBoneWeights[0];
BoneTransform += bones[boneOffset + inBoneIds[1]] * inBoneWeights[1];
BoneTransform += bones[boneOffset + inBoneIds[2]] * inBoneWeights[2];
BoneTransform += bones[boneOffset + inBoneIds[3]] * inBoneWeights[3];
BoneTransform = model * BoneTransform;
vec4 bPos = BoneTransform * vec4(inPosition, 1.0);
vec4 bNor = BoneTransform * vec4(inNormal, 0.0);
gl_Position = vp * bPos;
outNormal = bNor.xyz;
outFragPos = vec3(model * vec4(inPosition, 1.0));
outUV = inUV0;
}