본문 바로가기

개인공부/C++ Graphics

OpenGL #4 Shader

이전 글에서 설명했드시 쉐이더는 gpu 에 존재하는 프로그램(코드)이며 Vertex Buffer 를 이용해 넘겨받은 데이터를

처리하는 역할을 한다.

 

크게 두가지가 있다.

 

Vertex Shader :

 

 

Fragment(Pixel) Shader

 

물론 다른놈들도있지만 이놈들을 제일 많이쓴다.

 

크게 OpenGL 파이프라인에서 이녀석을이 어떻게쓰이냐면

 

CPU (Drawcall 을 보낸다) -> GPU (Vertex Shader 사용후 Fragment Shader 를 사용) -> 삼각형 렌더링

 

물론 사이사이 많은 스텝들이 존재하지만 크게는 이런식으로 간다.

 

 

 

그래서 우리의 코드예제인 삼각형에서 Vertex Shader 는 어떻게 사용될까?

삼각형에는 3개의 Vertex 가 존재한다. (3개의 점) 고로 Vertex Shader 는 세번 Called 된다.

 

이녀석들이 그럼 세번 불려서 무슨일을 하냐? 

 

한마디로 Vertex Shader 는 화면에서 정확히 어떤 위치에 Vertex 를 표현할것인가를 OpenGL 에게 말해준다.

이 경우에는 3개의 점

 

 

그 다음으로

 

 

Fragment(Pixel) Shader 는 픽셀마다 한번씩 Called 된다 그리고 불릴때마다 픽셀 하나하나 그린다(Rasterization).

결국 Fragment Shader 는 rbg 에서 픽셀 하나가 어떤 색으로 렌더링될지를 결정하는 녀석이다.

즉 만번이든 십만번이든 백만번이든 Called 될수있다.

 

 

자 그래서 실제 코드로는?

 

처음엔 쉐이더를 컴파일 하는 함수와 이를 이용하는 쉐이더를 만드는 함수를 짠다.

 

 

 

 

이후 쉐이더 코드를 받아 컴파일후 프로그램에 Attach , Link 를 하는 함수를 짠다.

일련의 과정이 끝났다면 Shader 를 지워준다.

 

 

 

 

 

자 소스는 이런식으로 생겼다.

Version 330 core 는 330 버전에서 이런식으로 사용하겠다 라는 선언문이다.

vec4 를 사용하는이유는 저녀석은 항상 vec4 를 사용해야한다. vec2 를 그안에 선언해도 알아서 vec2 인것을 알아챈다.

 

Fragment 에서 이번엔 빨간색으로 삼각형을 만들어보겠다.

vec4 (r , g ,b ) 순.

 

 

이후 쉐이더를 지워준다.

 

 

결과는?

 

 

 

 

성공

 

 

 

 

 

하지만 여기서 멈추면 조금 아쉽기 때문에 쉐이더를 조금더 쉽게 쓸수있게 설정을 해보겠다.

 

 

 

일단 res/shaders/ 안에 shader 파일을 하나 만들어준다.

 

 

내용물은 이렇게.

맨날 string 으로 줄바꿈과 큰따옴표로 쉐이더를 정의할순 없는 노릇이니까.

 

 

 

 

그럼 이제 쉐이더 소스 구조체를 하나 만들어준다.

 

이후 쉐이더 내용을 쉐이더 파일에서 받아오는 함수를 하나만든다.

 

 

 

길고 복잡해보이지만 한마디로 쉐이더 파일에서 #태그로

줄 하나하나 읽어서 저 구조체에 맞는 쉐이더를 저장해주는 함수이다.

 

 

마지막으로

 

 

 

이렇게 사용해주면 가독성도 훨씬 좋아진다.

 

결과는?

 

 

성공. 색깔도 바꿔봤다.

'개인공부 > C++ Graphics' 카테고리의 다른 글

OpenGL #6 Error Handling  (1) 2025.01.11
OpenGL #5 Index Buffer  (0) 2025.01.11
OpenGL #3 Vertex Buffer  (1) 2025.01.10
OpenGL #2 GLEW 설치  (2) 2025.01.10
OpenGL # 1 설치 및 개념  (0) 2025.01.10