여러 가지 종류의 한정자가 있는데 각각의 차이를 잘 모르겠어서
알아보는 시간을 가지고자...
Vertex shader, Fragment shader와 코드가 있을 때, varying을 사용하면 Vertex shader와 Fragment shader에서 그 값이 공유된다.
Vertex shader에서 Fragment shader로 데이터를 넘길 때 사용한다.
Ex.
#version 130 varying vec3 v_color; void main(){ gl_FragColor = vec4(v_color, 1.0); } +) gl_FragColor는 vec4(1.0, 1.0, 1.0, 1.0)을 가지게 된다. in과 out은 인풋의 역할을 하는 오른쪽 변수에게 in,
아웃풋의 역할을 하는 왼쪽 변수에게 out을 선언한다고 생각하면 될 거 같다.
역할은 varying과 같다.
Vertex shader에서 사용한 out을 Fragment shader에서 in으로 접근할 수 있다.
Ex.
//Vertex shader
#version 130 in vec4 a_position; in vec3 a_color; out vec3 v_color; //pass! void main() { v_color = a_color; gl_Position = a_position; }
//Fragment shader
#version 130 in vec3 v_color; //access! void main() { gl_FragColor = vec4(v_color, 1.0); } +) gl_Position이나 gl_FragColor 등의 global 변수는 out을 사용하면 중복 선언이다. uniform 한정자도 varying과 같이 vertex shader와 fragment shader 사이의 정보를 공유하게 해준다. 하지만 항상 같아야하는(uniform) read-only 변수로, shader 내에서 정의되거나 값이 변할 수 없다. uniform으로 전달되는 예로는 매질, 광원, 시간 변수 등이 있다.