Visual Studio
[Vulkan] Tangent, Bitangent, Normal 시각화 본문
Geometry Shader를 사용하여 TBN 행렬의 각 요소를 시각화하였다.
아래는 사용된 쉐이더 소스코드이다.
#version 450
struct Light
{
vec3 position;
vec4 ambient;
vec4 diffuse;
vec4 specular;
vec4 attenuation;
float shininess;
};
layout(std140, binding = 0) uniform TransformBufferObject
{
mat4 view;
mat4 projection;
vec3 cameraPosition;
} transformBuffer;
layout(location = 0) in vec3 inPosition;
layout(location = 1) in vec3 inNormal;
layout(location = 2) in vec2 inTexCoord;
layout(location = 3) in vec3 inTangent;
layout(location = 4) in mat4 inModel;
layout(location = 8) in mat4 inModelView;
layout(location = 12) in mat4 inNormalMatrix;
layout(location = 0) out vec3 outNormal;
layout(location = 1) out vec3 outTangent;
layout(location = 2) out vec3 outBitangent;
void main()
{
mat3 normalMatrix = mat3(inNormalMatrix);
vec4 position = inModelView * vec4(inPosition, 1.0);
gl_Position = transformBuffer.projection * position;
outNormal = normalize(vec3(transformBuffer.projection * vec4(normalMatrix * inNormal, 0.0)));
outTangent = normalize(vec3(transformBuffer.projection * vec4(normalMatrix * inTangent, 0.0)));
outBitangent = normalize(cross(outNormal, outTangent));
}
#version 450
layout (triangles) in;
layout (line_strip, max_vertices = 18) out;
layout (location = 0) in vec3 normals[];
layout (location = 1) in vec3 tangents[];
layout (location = 2) in vec3 bitangents[];
layout (location = 0) out vec3 outColor;
const float MAGNITUDE = 0.04;
void GenerateLine(int index, vec3 offsets[3], vec3 color)
{
gl_Position = gl_in[index].gl_Position;
outColor = color;
EmitVertex();
gl_Position = gl_in[index].gl_Position + vec4(offsets[index], 0.0) * MAGNITUDE;
outColor = color;
EmitVertex();
EndPrimitive();
}
void main()
{
for (int i = 0; i < 3; ++i)
{
GenerateLine(i, normals, vec3(1.0, 1.0, 0.0));
GenerateLine(i, tangents, vec3(0.0, 0.0, 1.0));
GenerateLine(i, bitangents, vec3(1.0, 0.0, 0.0));
}
}
#version 450
layout(location = 0) in vec3 inColor;
layout(location = 0) out vec4 outColor;
void main()
{
outColor = vec4(inColor, 1.0);
}
'Graphics' 카테고리의 다른 글
[Vulkan] Framebuffer의 재활용에 대하여 (0) | 2024.12.13 |
---|---|
[Vulkan] Cubemap Texture 로드시 주의사항들 (0) | 2024.11.18 |
[Vulkan] Instanced Rendering 시에 Instance Buffer와 Storage Buffer의 성능 비교 (0) | 2024.10.23 |
[Vulkan] Push constants (0) | 2024.10.01 |
Early depth testing, Early z pass (0) | 2024.09.17 |