본문 바로가기
Thinking/Graphics

정점 쉐이더(Vertex Shader)란? 쉽게 이해하기!

by Dev_카페인 2025. 2. 16.
반응형

정점 쉐이더(Vertex Shader)란? 쉽게 이해하기!

게임 속 3D 모델이 화면에 어떻게 보이는지 결정하는 중요한 요소 중 하나가 바로 정점 쉐이더(Vertex Shader)입니다. 정점 쉐이더는 게임의 그래픽을 더 생동감 있게 만들고, 다양한 효과를 적용하는 데 필수적인 역할을 합니다. 오늘은 정점 쉐이더가 무엇인지, 어떤 역할을 하는지, 그리고 어떻게 활용할 수 있는지 쉽게 알아보겠습니다!

 

🖌 1. 정점(Vertex)과 정점 쉐이더(Vertex Shader)란?

🔹 (1) 정점(Vertex)이란?

정점(Vertex)은 3D 모델을 구성하는 점입니다.
우리가 게임에서 보는 모든 3D 오브젝트(캐릭터, 건물, 나무 등)는 수많은 정점(점)으로 이루어진 삼각형들의 조합입니다.

예를 들어, 3D 큐브는 8개의 정점으로 이루어져 있으며, 이 정점을 연결하여 면(Face)이 만들어집니다.

🔹 (2) 정점 쉐이더(Vertex Shader)란?

정점 쉐이더(Vertex Shader)는 각 정점의 위치를 변경하고 변형하는 역할을 하는 프로그램입니다.
👉 쉽게 말해, 모델의 형태를 바꾸고, 화면에 어떻게 배치될지 계산하는 코드입니다.

✔ 캐릭터가 움직이거나,
✔ 카메라 각도에 따라 원근감을 조절하거나,
✔ 정점을 흔들어 나뭇잎이 바람에 흔들리는 효과를 주는 것

이런 모든 그래픽 효과는 정점 쉐이더를 활용해서 구현할 수 있습니다.

 

 

🌟 2. 정점 쉐이더의 역할

정점 쉐이더는 3D 모델의 정점 정보를 받아 다음과 같은 역할을 합니다.

🎬 (1) 3D 좌표를 화면에 맞게 변환하기

3D 모델은 가상의 공간(월드 좌표계)에서 만들어지지만, 화면에 출력되려면 2D 화면 좌표로 변환해야 합니다.
📌 정점 쉐이더는 정점의 위치를 계산하고, 월드 좌표 → 화면 좌표로 변환하는 역할을 합니다.

좌) 큐브의 로컬공간(중심축), 우) 큐브의 월드 좌표 (원점과 떨어져있음)

 

🌊 (2) 정점을 변형해서 애니메이션 효과 만들기

정점 쉐이더를 사용하면 정점의 위치를 실시간으로 변경할 수 있습니다.

  • 캐릭터가 뛰거나,
  • 천이 바람에 흔들리거나,
  • 물결이 출렁이는 효과를 줄 때

이런 모든 효과는 정점 쉐이더에서 정점의 위치를 수식으로 변형하여 만들 수 있습니다.

🎭 (3) 조명 효과를 계산하는 기초 작업

조명(빛)이 있는 게임에서는 각 정점의 법선 벡터(Normal)를 계산하는 과정이 필요합니다.
📌 정점 쉐이더에서 조명 효과를 계산할 수 있도록 법선 벡터를 조절하면, 더욱 사실적인 광원 효과를 만들 수 있습니다.

 

🚀 3. 정점 쉐이더는 어떻게 작동할까? (간단한 코드 예제)

정점 쉐이더는 GPU에서 실행되는 코드로, 일반적으로 HLSL(유니티), GLSL(OpenGL), CG 같은 언어로 작성됩니다.
다음은 HLSL로 작성된 간단한 정점 쉐이더 예제입니다.

struct appdata {
    float4 vertex : POSITION; // 정점 좌표 입력
};

struct v2f {
    float4 pos : SV_POSITION; // 변환된 정점 위치 출력
};

v2f vert(appdata v) {
    v2f o;
    o.pos = UnityObjectToClipPos(v.vertex); // 정점을 화면 좌표로 변환
    return o;
}

📌 이 코드에서 하는 일

1️⃣ float4 vertex : POSITION; → 정점의 위치를 입력받습니다.
2️⃣ o.pos = UnityObjectToClipPos(v.vertex); → 유니티 내장 함수를 이용해 화면 좌표로 변환합니다.
3️⃣ 결과를 return o; 로 반환하여 화면에 표시합니다.

 

🎨 4. 정점 쉐이더를 활용한 다양한 효과

정점 쉐이더를 활용하면 다음과 같은 멋진 효과를 만들 수 있습니다.

🔹 (1) 바람에 흔들리는 천 효과

천이나 깃발이 바람에 펄럭이는 효과는 정점의 위치를 주기적으로 변화시켜서 만들 수 있습니다.

float time = _Time.y; // 시간값을 가져오기

float4 vert(appdata v) {
    v2f o;
    o.pos = UnityObjectToClipPos(v.vertex);
    
    // 바람 효과 적용 (sin 함수를 사용하여 흔들리게 만들기)
    o.pos.y += sin(v.vertex.x * 5.0 + time) * 0.1;

    return o;
}

✔ 이 코드를 적용하면 X축 방향으로 sin() 함수를 사용해 정점을 위아래로 흔들리게 만들 수 있습니다.
✔ 이를 활용하면 천이 바람에 흔들리는 애니메이션 효과를 쉽게 구현할 수 있습니다.

 

🔹 (2) 웨이브 효과 (물결 출렁임)

물의 표면이 출렁이는 효과도 정점 쉐이더를 이용해 만들 수 있습니다.

o.pos.y += sin(v.vertex.x * 10.0 + time * 2.0) * 0.2;
 

✔ X축을 기준으로 sin() 함수를 적용하면 물결이 출렁이는 듯한 느낌을 줄 수 있습니다.
✔ 시간값을 곱하면 파도가 이동하는 듯한 애니메이션이 됩니다.

 

🏆 5. 결론

정점 쉐이더(Vertex Shader)는 3D 모델의 정점(점)을 변형하여 위치를 변경하고, 다양한 그래픽 효과를 적용하는 중요한 프로그램입니다.

정점의 위치를 변경하여 3D 모델을 화면에 표시하고
물결, 흔들림, 변형 등 다양한 애니메이션 효과를 구현할 수 있으며
GPU에서 빠르게 계산되므로 성능에 최적화된 그래픽 처리가 가능합니다.

쉐이더를 처음 접하는 사람이라면 정점 쉐이더로 간단한 변형 효과를 실험해보는 것부터 시작해보세요! 🚀

 

🎯 더 공부해볼 만한 주제!

🔹 유니티에서 Shader Graph를 활용해 정점 쉐이더 실습하기
🔹 조명과 그림자가 적용되는 원리 이해하기
🔹 프래그먼트 쉐이더(Fragment Shader)와 함께 활용하기

 

 

💡 여러분은 정점 쉐이더로 어떤 효과를 만들어 보고 싶나요?
궁금한 점이나 적용해보고 싶은 효과를 댓글로 남겨주세요! 😊🎮

반응형