묻공러
[OpenGL Note] Uniforms, VAO
묻공러
묻지마공부
묻공러
전체
오늘
어제
  • 분류 전체보기 (521) N
    • C (54)
      • [코드조선] C 핵심 (35)
      • [언어본색] C 기초 (19)
    • C++ (72)
      • [루키스] C++ (9)
      • [루키스] 콜백함수 (6)
      • [루키스] STL (8)
      • [루키스] Modern C++ (11)
      • [노코프] C++ (10)
      • [노코프] Tips (16)
      • [일지] C++ (12)
    • C# (20) N
      • [루키스] C# (9)
      • [루키스] 자료구조 (3)
      • [루키스] 실전 문법 (8) N
    • 자료구조 & 알고리즘 (50)
      • [코드조선] C 자료구조 & 알고리즘 (6)
      • [합격자되기] C++ 코딩테스트 (12)
      • [루키스] C++ 자료구조 & 알고리즘 (32)
    • CS (69)
      • [널널한 개발자] CS 개론 (19)
      • [혼자 공부하는] 컴퓨터 구조 (16)
      • [혼자 공부하는] 운영체제 (18)
      • [널널한 개발자] 네트워크 (16)
    • 게임 그래픽스 (46)
      • [전북대] OpenGL (25)
      • [일지] DirectX (21)
    • 게임 엔진 - 언리얼 (123)
      • [코드조선] 언리얼 (53)
      • [코드조선] 언리얼 데디서버 (8)
      • [일지] 언리얼 (59)
      • [일지] 언리얼 (2) (3)
    • 게임 엔진 - 유니티 (14)
      • [최적화] 유니티 (4)
      • [루키스] 유니티 (10)
    • 게임 서버 (17)
    • 게임 수학 & 물리 (19)
      • 게임 수학 (12)
      • 게임 물리 (7)
    • GIT & GITHUB (4)
    • 영어 (18)
      • [The Outfit] 대본 공부 (11)
      • the others (7)
    • 그 외 (14)
      • In (5)
      • Out (5)
      • Review (4)

인기 글

최근 글

hELLO · Designed By 정상우.
게임 그래픽스/[전북대] OpenGL

[OpenGL Note] Uniforms, VAO

2024. 4. 16. 12:10

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
'게임 그래픽스/[전북대] OpenGL' 카테고리의 다른 글
  • [OpenGL Note] Rasterizer
  • [OpenGL Note] Vertex Shader
  • [OpenGL Note] Projection Transform
  • [OpenGL Note] View Frustrum
묻공러
묻공러
상단으로

티스토리툴바

개인정보

  • 티스토리 홈
  • 포럼
  • 로그인

단축키

내 블로그

내 블로그 - 관리자 홈 전환
Q
Q
새 글 쓰기
W
W

블로그 게시글

글 수정 (권한 있는 경우)
E
E
댓글 영역으로 이동
C
C

모든 영역

이 페이지의 URL 복사
S
S
맨 위로 이동
T
T
티스토리 홈 이동
H
H
단축키 안내
Shift + /
⇧ + /

* 단축키는 한글/영문 대소문자로 이용 가능하며, 티스토리 기본 도메인에서만 동작합니다.