본문 바로가기
셰이더 (Shader)/The Book of Shaders (완)

[GLSL] 2 - Hello World

by Minkyu Lee 2023. 4. 14.

// 예제

GPU에서 문자열을 출력하는것은 처음 예제로는 어렵다. 

그래서 밝은 색 하나를 출력하는 것으로 대신한다.

#ifdef GL_ES
precision mediump float;
#endif

uniform float u_time;

void main() {
gl_FragColor = vec4(abs(sin(u_time)),0.0,0.0,1.0);
}

 

// 예제 분석

쉐이더 언어는 color값을 리턴하는 main 함수이다.

C와 형태가 유사하다.

전처리기 매크로 사용한다.

 

// 매크로란?

매크로는 컴파일되기 전에 일어나는 스텝이다. 

#define을 이용해, 전역변수를 선언한다.

기본적인 논리구현도 가능하다. (#ifdef 또는 #endif)

 

/ 사용법

매크로는 해쉬태그(#)로 시작한다. 

이런 Pre-compilation은 컴파일이 일어나기 바로 전에 각 해쉬태그의 해당값을 이 코드로 카피한다.

위에 예제 'hello world!'를 보면, 우리는 GL_ES를 선언하였다.

이는 모바일 기기나, 브라우져에서 컴파일될 때 전처리되는 내용이다.

 

// 실수정밀도

실수 타입들은 쉐이더에서 신경써야 할 부분 중 하나이다.

precision(실수정확도)의 정도가 퍼포먼스에 영향을 미치기 때문이다.
낮은 정도의 precision을 가질수록 빠른 렌더 속도를 가지지만, 렌더 퀄리티가 그만큼 떨어진다.

 

첫번째 라인을 보면, (precision mediump float;) 라는 내용이 있다.

실수정확도를 중간정도로 맞춘것이다.

높게는 (precision highp float;) 낮게는 (precision lowp float;)이다.

 

// 자동 캐스팅

GLSL에서는 데이터 타입의 자동 캐스팅이 되지 않는다.

제조업체들은 그래픽카드의 연산을 가속화 하기위해, 

최소 사양을 보장하기 위해 이 기능을 지원하지 않는다.

 

쉐이더 프로그램을 하면서 실수의 경우에는 항상 점 (.) 을 포함하여 이 변수가, 값이 실수임을 명시하여야한다.

 

댓글