-
컴퓨터그래픽스 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); // ↑ 메시 종류, ↑ 정점의 개수
'Computer Graphics' 카테고리의 다른 글
컴퓨터 그래픽스 8장 - 이미지 텍스처링 - (0) 2024.05.04 컴퓨터 그래픽스 7장 - 래스터라이저 - (0) 2024.04.29 컴퓨터 그래픽스 5장 - 정점 처리(Vertex Processing) - (0) 2024.04.29 컴퓨터 그래픽스 4장 - 좌표계와 변환 - (1) 2024.04.27 컴퓨터 그래픽스 3장 - 모델링 - (0) 2024.04.26