ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 컴퓨터그래픽스 6장 - OpenGL ES와 셰이더 -
    Computer Graphics 2024. 4. 29. 20:33

    고려대학교 한정현 교수님의 컴퓨터그래픽스 강의 영상을 보고 작성한 포스트입니다 

    https://www.youtu be.com/watch?v=Jvz0XPSRbx4&list=PLYEC1V9tJOl03WLDoUEKbiYW_Xt4W6LTl&index=1

     

    OpenGL ES 3.0 API - shading language를 사용함

     

    GLSL: OpenGL의 Shader Language

     

    vec4(4D 벡터), ivec3(int형 3D 벡터), mat3(3차원 행렬) 등 행렬에 최적화된 자료형을 제공하나 전반적으로는 C와 비슷함

     

    Vertex Shader

    Attribute: 포지션, 노멀 벡터 등 vertex array를 구성하는 요소

    Uniform: World transform, view transform 등 셰이더에 모든 정점마다 uniform하게 적용되는 요소 

     

    gl_Position: vertex shader의 output인 clip-space vertex postion을 저장함

     

    GL API

    - 함수 접두사 gl

    - 데이터 타입 접두사 GL

     

    Attribute Processing

    1. Shader 호출

    // Shdaer 호출과 컴파일 
    GLuint shader = glCreateShader(GL_VERTEX_SHADER);
    glShaderSource(shader, 1, &source, NULL);
    glCompileShader(shader);

     

    2. 호출한 shader들을 program object로 묶기 

    // vertex shader object, fragment shader object를 program object로 묶는 작업
    // 지금은 vertex shader만 묶어서 fragment shader를 다시 묶는 작업을 해 줘야 함(반복)
    
    GLuint program = glCreateProgram();
    glAttachShader(program, shader);
    glLinkProgram(program);
    glUseProgram(program);
    struct Vertex {
    	glm::vec3 pos; // position
        glm::vec3 nor; // normal
        glm::vec2 tex; // texture coordinates
    }
    
    typedef GLushort Index;
    
    struct ObjData {
    	std::vector<Vertex> vertices;
        std::vector<Index> indices;
    };
    
    ObjData objData;

     

     

    3. CPU 메모리에서 GPU 메모리로 옮기기

     

    OpenGL 용어

    array buffer object = vertex array

    element array buffer object = index array

    // CPU 메모리에서 GPU 메모리 버퍼로 복사하는 과정
    
    GLuint abo;
    glGenBuffers(1, &abo);
    glBindBuffer(GL_ARRAY_BUFFER, abo);
    glBufferData(GL_ARRAY_BUFFER, (GLsizei) objData.vertices.size() * sizeof(Vertex),
    			objData.vertices.data(), GL_STATIC_DRAW);
                
    GLuint eabo;
    glGenBuffers(1, &eabo);
    glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, eabo);
    glBufferData(GL_ELEMENT_BUFFER, (GLsizei) objData.indices.size() * sizeof(Index),
    			objData.indices.data(), GL_STATIC_DRAW);

     

    4. Vertex Shader가 정점들을 자유롭게 처리할 수 있도록 Attribute Array 활성화

    // 위 사진과 같은 Vertex Attribute를 활성화시킴
    
    
    glEnableVertexAtrribArray(0); // position = attribute 0
    glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, sizeof(Vertex), (const GLvoid*) offsetof(Vertex, pos));
    
    glEnableVertexAtrribArray(1); // normal = attribute 1
    glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, sizeof(Vertex), (const GLvoid*) offsetof(Vertex, pos));
    
    glEnableVertexAtrribArray(2); // texture coordinates = attribute 2
    glVertexAttribPointer(2, 2, GL_FLOAT, GL_FALSE, sizeof(Vertex), (const GLvoid*) offsetof(Vertex, pos));
    //                       ↑ 차원 수              ↑ stride        ↑ 시작점

     

     

    Uniforms

    Vertex shader는 worldMat, viewMat, projMat가 있음

     

    scene object가 움직이면 worldMat이 바뀌고, viewpoint가 움직이면 viewMat이 바뀜 매 프레임 동적으로 움직이는 환경

     

    glm::mat4 worldMatrix; // repeatedly updated for a dynamic object
    
    GLint loc = glGetUniformLocation(program, "worldMat");
    glUniformMatrix4fv(loc, 1, GL_FALSE, glm::value_ptr(worldMatrix));

     

     

    Drawcall

    - 폴리곤 메시를 그리라는 call을 명령하는 것

    glDrawElements(GL_TRIANGLES, 144, GL_UNSIGNED_SHORT, 0);
    //             ↑ 메시 종류,  ↑ 정점의 개수

     

     

     

Designed by Tistory.