-
OpenGL ES 3.0 - in/out 한정자Graphics/OpenGL ES 3.0 2020. 6. 1. 15:35반응형
이 글은 OpenGL ES 3.0 Programming Guide (2nd ed.) [Ginsburg & Purnomo 2014-03-10] 를 나름 번역한 글입니다.
GLSL 1.x에 있던 attribute, varying 한정자는 deprecated되었다. vertex shader의 input으로 들어오던 vertex attribute들과 fragment shader로 보낼 texture 좌표는 GLSL ES 3.0에서 어떻게 표시되는지 보자.
사라진 이유 - https://stackoverflow.com/questions/34627576/why-did-glsl-change-varying-to-in-out
공식https://www.khronos.org/opengl/wiki/Type_Qualifier_(GLSL)#Removed_qualifiers
Vertex and Fragment Shader Inputs/Outputs
GLSL에 특별한 variable type은 vertex input(혹은 attribute)을 받는 변수 타입이다. Vertex input 변수는 in이라는 키워드로 vertex shader에 각 vertex의 input을 정의하는데에 사용된다. Vertex input 변수들은 일반적으로 position, texture 좌표, color 값 등을 저장한다. 즉, vertex input은 화면에 그려질 각 vertex를 정의한 data라고 생각하면 쉽다. 아래 소스코드는 vertex shader인데, 하나의 position과 color 값을 input으로 받는 예제이다.
이 shader의 두 개의 vertex input은 a_position, a_color이다. 이 변수는 application에 의해서 data가 로드된다. Application은 vertex array를 생성하는데, 이 vertex array는 position의 값과 각 vertex에 매칭되는 color 값을 가진다. 예제의 vertex input들은 앞에 layout 한정자가 있다. 이 한정자는 vertex attribute의 index를 나타낸다. 이 한정자는 사용하지 않아도 무방하나, 이 경우엔 vertex input에 대한 location은 자동적으로 정의된다.
우리는 이 전체 프로세스를 Chapter 6 “Vertex Attributes, Vertex Arrays, and Buffer Objects.” 에서 살펴본다.
#version 300 es uniform mat4 u_matViewProjection; layout(location = 0) in vec4 a_position; layout(location = 1) in vec3 a_color; out vec3 v_color; void main(void) { gl_Position = u_matViewProjection * a_position; v_color = a_color; }
하드웨어는 uniform과 마찬가지로 vertex shader에 입력할 수 있는 attribute의 갯수를 제한한다. gl_MaxVertexAttribs 함수 혹은 GL_MAX_VERTEX_ATTRIBS파라미터와 glGetIntegerv함수 로 attribute의 최대 갯수를 알 수 있다. hadware별로 다르지만 OpenGL ES 3.0에서는 최소 16개는 지원하도록 되어있다.
vertex shader의 output 변수는 out 키워드로 정의한다. 위의 예제에서 v_color변수가 output으로 정의되어 있고 a_color input 변수로부터 값이 복사된다. 각 vertex shader는 fragment shader에게 전달하는데 필요한 하나 이상의 변수에 data를 출력한다. 이 출력된 변수들은 fragment shader에서 in이라는 변수로 정의되고 래스터라이재이션되는 동안 기본 선을 따라서 색상이 보간된다.
위 코드의 예제에서는 fragment shader라면, 아래 코드로 설명된다.
in vec3 v_color;
Vertex shader input과 다르게, vertex shader output/fragment shader input 변수는 layout 한정자를 갖지 못한다. 이 구현은 자동적으로 location을 정의한다. uniform 변수와 vertex input attribute들과 마찬가지로 vertex shader ouput와 fragment shader input 들의 갯수도 제한된다. gl_MaxVertexOutputVectors 함수 혹은 glGetIntegerv 함수와 GL_MAX_VERTEX_OUTPUT_COMPONENTS 파라미터로 알 수 있다. 마찬가지로 fragment shader input 지원 갯수는 gl_MaxFragmentInputVectors 함수 혹은 파라미터 GL_MAX_FRAGMENT_INPUT_COMPONENTS 와 glGetIntegerv 함수로 알 수 있다.
다음 예제는 vertex, fragment shader 의 input과 output이 매칭하는 정의이다.
#version 300 es uniform mat4 u_matViewProjection; // Vertex shader inputs layout(location = 0) in vec4 a_position; layout(location = 1) in vec3 a_color; // Vertex shader output out vec3 v_color; void main(void) { gl_Position = u_matViewProjection * a_position; v_color = a_color; } // Fragment shader #version 300 es precision mediump float; // Input from vertex shader in vec3 v_color; // Output of fragment shader layout(location = 0) out vec4 o_fragColor; void main() { o_fragColor = vec4(v_color, 1.0); } }
위 예제에서 fragment shader는 output 변수 o_fragColor에 대한 정의를 가지고 있다.
layout(location = 0) out vec4 o_fragColor;
Fragment shader는 하나 이상의 색상을 출력할 수 있다. 일반적으로, 우리는 하나의 color buffer에 렌더링을 하는데, layout 한정자는 작성하지 않아도 된다. 마찬가지로 location은 0으로 정의된다.
하지만, MRT(multiple render target)을 사용해 렌더링할 때, 우리는 layout 한정자를 이용해 각 output으로 render target지정할 수 있다. MRT에 대해서는 Chapter 11 “Fragment Operations”에서 다룬다. 일반적인 방법은 우리는 하나의 output 변수를 fragment shader에 정의하고, 그 값은 GL pipeline에서 각 fragment 의 output 색상으로 사용된다.
반응형'Graphics > OpenGL ES 3.0' 카테고리의 다른 글
OpenGL ES 3.0 - Hello Triangle Example (0) 2020.05.25