Notice
Recent Posts
Recent Comments
Link
«   2025/02   »
1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28
Tags
more
Archives
Today
Total
관리 메뉴

Visual Studio

[Vulkan] Tangent, Bitangent, Normal 시각화 본문

Graphics

[Vulkan] Tangent, Bitangent, Normal 시각화

emacser 2024. 11. 9. 14:20

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);
}