ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 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

     

    Type Qualifier (GLSL) - OpenGL Wiki

    A type qualifier is used in the OpenGL Shading Language (GLSL) to modify the storage or behavior of global and locally defined variables. These qualifiers change particular aspects of the variable, such as where they get their data from and so forth. They

    www.khronos.org

     

    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
Designed by Tistory.