Attributes와 Uniforms
Attributes:
per-vertex data(정점당 데이터)이다
주로 정점의 position, color, texcoord, normal 등의 정보를 포함한다
Attributes는 정점 배열(Vertex Array)에 저장되어 있으며,
셰이더 프로그램에서 정점 셰이더(Vertex Shader)에 의해 사용된다
Uniforms:
per-object data(오브젝트당 데이터)이다
셰이더 프로그램의 모든 실행에 대해 일관된 값을 가지는 전역 변수로
주로 변환 행렬, 광원의 위치, 재질의 속성 등의 정보를 전달하는 데 사용되고
world matrix, view matrix, proj matrix가 포함된다
Uniforms는 셰이더 프로그램 내에서 모든 정점에 대해 동일한 값을 가지며, 정적으로 변경된다
Vertex Array Object
Vertex Array Object(VAO)는
OpenGL에서 그래픽 데이터의 저장과 관련된 상태 정보를 캡슐화하는 객체이다
정점 데이터를 어떻게 구성하고 어떤 Vertex Attributes가 어디에 위치하는지를 정의하는 역할을 한다
VAO를 사용하면 정점 데이터의 상태를 저장하고 필요할 때 다시 사용할 수 있으므로,
정점 배열(Vertex Array)의 설정을 반복하지 않아도 된다
이는 코드를 단순화하고 유지 관리를 용이하게 한다
일반적으로, VAO를 설정한 후,
해당 VAO를 바인딩하면 그래픽 데이터가 어디에 있는지 OpenGL에게 알려준다
그리고 정점 데이터가 렌더링 될 때 해당 VAO를 사용하여 OpenGL이 데이터를 가져오도록 할 수 있다
VAO는 버텍스 배열 객체(Vertex Buffer Object, VBO)와 함께 사용되는 것이 일반적이며, 이들을 결합하여 정점 데이터를 효율적으로 관리하고 렌더링 하는 데 사용됩니다
VAO가 없는 방식의 코드는 아래와 같다
//---------데이터를 전달하는 과정--------//
unsigned int bufferID;
glGenBuffers(1, &bufferID);//1. 버퍼 생성
glBindBuffer(GL_ARRAY_BUFFER, bufferID);//2. 바인딩("activate")
glBufferData(GL_ARRAY_BUFFER, 8 * sizeof(float), positions, GL_STATIC_DRAW);//3. 작업 상태 버퍼에 데이터 전달
//---------데이터를 해석하는(법을 정의하는) 과정--------//
glEnableVertexAttribArray(0);//1. 몇 번째 Location의 attribute를 활성화(enable)
glVertexAttribPointer(0, 2, GL_FLOAT, GL_FALSE, sizeof(float)*2, 0);//2. 데이터 해석 방법을 전달
glBindBuffer(GL_ARRAY_BUFFER, bufferID);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, ibo);
glUseProgram(shader);
// draw call 전에 항상 이렇게 설정해줘야 함
GLCall(glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_INT, nullptr);// draw call
VAO를 활용한 방식의 코드는 아래와 같다
unsigned int vao;
glGenVertexArrays(1, &vao);//vao 생성
glBindVertexArray(vao);//vao 바인딩(="작업 상태")
//---------데이터를 전달하는 과정--------//
unsigned int vbo;//개념적으로 buffer ID라 불렀고, 실제로는 vbo(vertex buffer object)라는 용어를 많이 씀
glGenBuffers(1, &vbo);//1. 버퍼 생성
glBindBuffer(GL_ARRAY_BUFFER, vbo);//2. 바인딩("작업 상태")
glBufferData(GL_ARRAY_BUFFER, 8 * sizeof(float), positions, GL_STATIC_DRAW);//3. 작업 상태 버퍼에 데이터 전달
//---------데이터를 해석하는(법을 정의하는) 과정--------//
glEnableVertexAttribArray(0);//1. 몇 번째 Location의 attribute를 활성화(enable)
glVertexAttribPointer(0, 2, GL_FLOAT, GL_FALSE, sizeof(float)*2, 0);//2. 데이터 해석 방법을 전달. (실제로 VAO에 정보가 저장되는 시점)
GLCall(glBindVertexArray(vao));// VAO 바인딩만으로 설정 끝
GLCall(glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_INT, nullptr));// draw call
'게임 그래픽스 > [전북대] OpenGL' 카테고리의 다른 글
[OpenGL Note] Rasterizer (0) | 2024.04.17 |
---|---|
[OpenGL Note] Vertex Shader (0) | 2024.04.16 |
[OpenGL Note] Projection Transform (0) | 2024.04.15 |
[OpenGL Note] View Frustrum (0) | 2024.04.15 |
[OpenGL Note] View Transform (0) | 2024.04.14 |