Unity/Shader

Unity: 정점 셰이더와 프래그먼트 셰이더 #Vertex Shader #Fragment Shader

여르므 2024. 8. 11. 17:22

셰이더를 사용하면 움직임도 만들어낼 수 있는거야?
색깔이나 투명도같은 정적인 부분만 건드릴 수 있는 줄 알았는데.

맞아, 셰이더는 보통 색상, 투명도, 텍스처 등 그래픽적 특성을 제어하는 데 사용되지만
정점 셰이더를 통해 오브젝트의 위치나 형상을 변화시킬 수도 있어.
셰이더는 크게 두 가지로 나눌 수 있어.

프래그먼트 셰이더(Fragment Shader):
이미지의 색상, 밝기, 투명도 등 픽셀 단위의 그래픽 특성을 제어해.
예를 들어, 특정 색상으로 오브젝트를 칠하거나, 텍스처를 적용하거나, 투명도를 조절할 수 있어.

정점 셰이더(Vertex Shader):
오브젝트의 정점(Vertex) 데이터를 제어해, 즉 오브젝트의 형상이나 위치를 변경할 수 있어.
예를 들어, 물결 효과를 만들기 위해 정점의 위치를 시간에 따라 변형시키거나, 바람에 흔들리는 나뭇잎 효과를 만들 수 있어.

 

 

정점 셰이더(Vertex Shader)의 활용 예시

정점 셰이더를 이용하면 오브젝트의 형상을 다양하게 변형할 수 있어.
예를 들어, 물결 효과, 진동 효과, 불규칙한 움직임 등 다양한 효과를 만들 수 있어.
아래는 정점 셰이더를 활용한 다양한 예시야:

1. 물결 효과:
- 정점의 위치를 사인(sin) 함수로 변형시켜서 물결 효과를 만들 수 있어.

2. 진동 효과:
- 정점의 위치를 코사인(cos) 함수로 변형시켜서 진동하는 효과를 줄 수 있어.

3. 바람에 흔들리는 나뭇잎:
- 정점의 위치를 잡음 함수로 변형시켜서 나뭇잎이 바람에 흔들리는 듯한 효과를 줄 수 있어.

 

 

그럼 세이더 코드랑 Shader Graph랑 무슨 차이야?

Shader Graph는 Unity에서 비주얼 스크립팅 방식으로 셰이더를 작성할 수 있는 도구로,
코드를 작성하지 않고도 복잡한 셰이더를 만들 수 있어.

Shader Graph를 사용하면 다양한 그래픽 효과와 함께 정점 변형 같은 동적 효과도 쉽게 구현할 수 있어.
따라서 앞서 설명한 물결 효과나 흔들림 효과도 Shader Graph로 만들 수 있어.

 

 

셰이더 코드와 셰이더 그래프중 실제로는 어떤걸 많이 사용해?

Unity에서 셰이더를 구현할 때 셰이더 코드와 Shader Graph 모두 사용되지만,
각 방법은 사용자의 요구와 프로젝트의 복잡성에 따라 선택돼.

 

 

Shader Graph의 장점과 사용 예시

장점:
1. 비주얼 인터페이스: 코드 작성 없이 시각적으로 셰이더를 구성할 수 있어, 직관적이고 학습 곡선이 낮아.
2. 빠른 프로토타이핑: 셰이더를 빠르게 실험하고 변경할 수 있어.
3. 초보자 친화적: 프로그래밍 지식이 없어도 셰이더를 작성할 수 있어.
4. 변경 사항 실시간 확인: Unity 에디터에서 즉시 셰이더 변경 사항을 확인할 수 있어.

사용 예시:
- 프로토타이핑 및 간단한 셰이더: 빠르게 시각적 효과를 테스트하고 싶을 때.
- 비개발자 팀원: 아티스트나 디자이너가 셰이더를 작성할 때.
- 간단한 효과: 물결, 진동, 간단한 색상 변경 등.

 

 

셰이더 코드의 장점과 사용 예시

장점:
1. 세부 제어: 정밀한 제어가 가능하여 복잡한 셰이더나 고급 효과를 구현할 수 있어.
2. 최적화: 직접 최적화할 수 있어 성능이 중요한 프로젝트에 유리해.
3. 복잡한 로직 구현: Shader Graph로는 어렵거나 불가능한 복잡한 로직을 작성할 수 있어.
4. 유연성: Shader Graph에서는 불가능한 커스터마이즈가 가능해.

사용 예시:
- 고급 셰이더: 복잡한 물리 기반 렌더링, 커스텀 라이팅 모델 등.
- 성능 최적화: 성능이 중요한 프로젝트에서 직접 최적화할 때.
- 특수 효과: 매우 특정한 그래픽 효과를 구현할 때.

 

 

실제 사용 예시

Shader Graph:
- 많은 프로젝트에서 Shader Graph는 특히 초기 개발 단계나 시각적 프로토타이핑에 널리 사용돼.
- 비개발자 팀원들이 시각적인 결과물을 빠르게 실험하고 변경할 수 있어 프로젝트의 속도를 높여줘.

셰이더 코드:
- 복잡한 3D 게임이나 고성능 요구 사항이 있는 프로젝트에서는 여전히 셰이더 코드가 널리 사용돼.
- 고급 렌더링 기술을 사용하는 AAA 게임 개발에서는 세부 제어와 최적화를 위해 셰이더 코드를 많이 사용해.

 

 

결론

프로젝트의 요구 사항에 따라 Shader Graph와 셰이더 코드 중 적합한 방식을 선택하는 것이 중요해.

Shader Graph는 빠르고 직관적인 셰이더 제작에 강점을 가지며, 셰이더 코드는 더 복잡하고 최적화된 그래픽 효과를 구현하는 데 유리해. 많은 개발자는 두 가지 방법을 혼용하여 사용하기도 해. 초기에는 Shader Graph로 빠르게 프로토타이핑하고, 필요에 따라 셰이더 코드를 사용하여 최적화하거나 고급 기능을 추가하는 방식으로 작업해.

 

 

 

관련 개념: 3D 그래픽스 - 렌더링 파이프라인

3D 그래픽스를 화면에 그리기 위한 일련의 단계들

더보기

렌더링 파이프라인에서 정점 셰이더프래그먼트 셰이더의 처리 순서를 이해하는 것은 3D 그래픽스의 기본 개념 중 하나야.

전체 과정은 다음과 같은 순서로 진행돼.

 

  1. 정점 처리(Vertex Processing)
    • 정점 셰이더(Vertex Shader): 가장 먼저 처리되는 셰이더로, 3D 모델의 각 정점에 대해 위치와 속성을 변환하는 역할을 해. 정점 셰이더는 월드 좌표계에서 화면 좌표계로의 변환을 담당해.
  2. 프래그먼트 처리(Fragment Processing)
    • 프래그먼트 셰이더(Fragment Shader): 정점 셰이더를 통해 화면 좌표로 변환된 정점들이 삼각형으로 연결되면, 그 삼각형 내의 각 픽셀(프래그먼트)에 대해 색상과 텍스처 등을 계산해. 프래그먼트 셰이더는 최종적인 화면 색상을 결정해.

 

렌더링 파이프라인의 기본 순서

  1. 정점 셰이더(Vertex Shader)
    • 입력된 정점 데이터를 처리하여 화면에 나타날 위치를 계산한다.
  2. 픽셀 셰이더(Primitive Assembly)
    • 정점 셰이더에서 출력된 정점들을 사용하여 화면에 표시할 삼각형, 선, 점 등을 만든다.
  3. 속성 보간(Interpolation)
    • 삼각형 내의 픽셀을 위해, 각 정점에서 계산된 속성(색상, 텍스처 좌표 등)을 삼각형의 픽셀 간에 보간한다.
  4. 프래그먼트 셰이더(Fragment Shader)
    • 보간된 속성을 바탕으로 각 픽셀의 최종 색상을 계산해. 이 과정에서 텍스처를 적용하거나 조명 효과를 추가할 수 있다.
  5. 프래그먼트 테스트(Fragment Testing)
    • 최종 픽셀 색상과 깊이 테스트를 통해, 어떤 픽셀이 최종적으로 화면에 표시될지를 결정한다.

 

이렇게 정점 셰이더는 3D 모델의 기하학적 위치를 처리하는 반면,

프래그먼트 셰이더는 화면에 최종적으로 표시될 색상을 결정하는 역할을 해.

이 두 단계는 서로 연관되어 있지만 각기 다른 단계에서 처리되며, 파이프라인의 흐름에 따라 진행돼.