Study/C, C++ (MFC, UE)

OpenGL 함수 (진행 중.....)

BlueBright 2018. 5. 10. 16:25

<내용 출처>

https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/indexflat.php

 

OpenGL 4.x Reference Pages

 

www.khronos.org

 

http://docs.gl/

 

docs.gl

 

docs.gl

 

https://heinleinsgame.tistory.com/7

 

https://rito15.github.io/posts/opengl-study-02/

 

 

 


<명칭>

  • GL (Graphic Library) : 
  • UT (Utility Toolkit) : 
  • FW (FrameWork) : 
  • EW (Extenstion Wrangler library) :  
  • M (Math) :  
  • SL (Shading Language) : 
  • ES (Embedded Systems) : 

 

<유의 사항>

  • 헤더 포함시 glew를 glfw 보다 먼저 포함 할 것 (glfw 헤더와 충돌을 피하기 위함)
  • glfwInit() 호출 이후, 추후(프로그램 종료)에 glfwTerminate()를 반드시 호출 할 것.
  • glfwInit() 호출 이후, Context를 생성하고 glewInit()를 호출
  • SetPixelFormat 함수를 두 번 이상 호출시 오류가 나는 경우가 존재하므로 임시 context를 생성하고 호출하는 것이 안전함.

 

<함수>

 

  • VBO (Vertex Buffer Object) :  여러개의 정점의 정보가 저장된 GPU 메모리 버퍼, 고유 ID를 가질 수 있다.
    • glGenBuffers(GLsizei n, GLuint * buffers) : 개수 만큼 VBO를 생성하여 해당 ID변수에 ID를 반환해줌.
      • n : 생성할 버퍼 갯수
      • buffers : 버퍼 ID를 저장할 Gluint 변수
    • glBindBuffer(버퍼 유형, 버퍼 ID 변수) : glGenBuffers로 생성한 버퍼를 어떻게 사용할 것인가 유형 설정
    • glBufferData(버퍼 유형, 버퍼에 저장할 데이터 크기 (바이트 단위), 사용자 데이터, 데이터 관리 방법) : 사용자의 데이터를 버퍼에 복사
    • glDeleteBuffers(제거할 버퍼 갯수, 버퍼 ID) : 버퍼 갯수 만큼 제거. 버퍼 개체가 삭제된 이후 내용이 없으면, 다시 재사용 가능함 (glGenBuffers)

 

  • VAO (Vertex Array Object) : 여러개의 VBO를 담을 수 있는 객체, 고유 ID를 가질 수 있다. 
    • glGenVertexArray : VAO 생성
    • glBindVertexArray : 
    • glDeleteVertexArrays : 
  • glVertexAttribPointer(GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, const GLvoid * pointer) : Vertex 해석 정보를 알림
    • index : 정점 속성. vertex shader의 layout location 부분과 연관 있는 것 같은데...
    • size : 정점 속성의 구성 크기. 1,2,3,4 또는 GL_BGRA 중 하나만 가능
    • type : 배열 내 데이터 타입
    • normalized : 배열 내 데이터를 정규화 해야하는지 설정. GL_TRUE로 설정되면 정수 형식의 저장된 값이 [-1,1] 또는 [0,1] 범위의 부동 소수점으로 매핑됨. GL_FALSE의 경우에는 정규화 없이 직접 부동 소수점으로 변환됨
    • stride : 배열 내 각각 데이터의 byte 오프셋 크기. vertex 데이터와 다음 vertext 데이터 사이 크기
    • pointer : 버퍼에서 데이터의 시작 위치
  • glEnableVertexAttribArray : sharder 코드에 location에 매칭되는 값이 파라미터로 들어감
  • glDisableVertexAttribArray : 

 

 

  • Shader (GLSL)
    • glCreateShader : 
    • glShaderSource : 
    • glCompileShader : 
    • glGetShaderiv : 
    • glGetShaderInfoLog : 
    • glAttachShader : 
    • glLinkProgram : 
    • glDetachShader : 
    • glDeleteShader : 
    •  
    • GLint glGetUnifromLocation(GLint program, const GLchar * name) : sharder program에서 name으로 입력된 변수의 location 값을 반환
    • void glUseProgram(GLuint program) : 
    • glUniform(GLint location, 접미사에 따른 파라미터 여러개) : Shader program (GLSL)에서 사용되는 uniform 변수에 넘길 값을 설정. 반드시 glUseProgram과 같이 호출해야한다. (program ID)
      • location : 
      • 함수 접미사 종류
        • Point
          • 1f, 2f, 3f, 4f : 
          • 1i, 2i, 3i, 4i : 
          • 1ui, 2ui, 3ui, 4ui : 
        • Vector
          • 1fv, 2fv, 3fv, 4fv : 
          • 1iv, 2iv, 3iv, 4iv : 
          • 1uiv, 2uiv, 3uiv, 4uiv : 
        • Matrix
          • Matrix2fv, Matrix3fv, Matrix4fv
          • Matrix2x3fv, Matrix3x2fv
          • Matrix2x4fv, Matrix4x2fv
          • Matrix3x4fv, Matrix4x3fv
    • glDeleteProgram :

 

  • glDrawArrays(드로잉 모드, 배열 시작 인덱스, 렌더링할 인덱스 개수) : 버퍼의 배열 데이터 드로잉, 단 드로잉 콜만 한 것이기 때문에, 그려지지는 않음

 

 

 

 

 

 

 

/**
https://stackoverflow.com/a/45861149/7017299
*/

//여러개를 별도로 선언하는 경우 (Gen 먼저하고 Bind)
GLuint VAO, VBO; 
glGenVertexArrays(1, &VAO);
glBindVertexArray(VAO);
glGenBuffers(1, &VBO);
glBindBuffer(GL_ARRAY_BUFFER, VBO);

GLuint VAO2, VBO2; 
glGenVertexArrays(1, &VAO2);
glGenBuffers(1, &VBO2);
glBindVertexArray(VAO2);
glBindBuffer(GL_ARRAY_BUFFER, VBO2);


//여러개를 동시 선언하는 경우
std::array<GLuint,3> VAOs;
std::array<GLuint,3> VBOs;

glGenVertexArrays(VAOs.size(), &VAOs[0]);
glGenBuffers(VBOs.size(), &VBOs[0]);

 

 

 

 

 

 

 

// 1. 버퍼 생성
glGenBuffers

// 2. 정점 배열을 OpenGL에서 사용하기 위해 버퍼에 복사
glBindBuffer(GL_ARRAY_BUFFER, VBO);
glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW);

// 3. vertex 속성 포인터를 설정
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 3 * sizeof(float), (void*)0);
glEnableVertexAttribArray(0);  

// 4. 오브젝트를 그리고 싶을 때 우리가 생성한 shader program을 사용
glUseProgram(shaderProgram);

// 3. 드로잉
  ~~~~