목록Season 1/OpenGL (26)
Graphics Programming
전부 back end에 대한 이야기. 즉 래스터화(rasterization) 이후 - 단편 셰이더로 할 수 있는 흥미로운 것들 - 데이터가 단편 셰이더에 도착하면 일어나는 일들 - 그 데이터를 다시 애플리케이션으로 얻어오는 방법 - 이미지 품질을 향상시키는 방법 - HDR 렌더링 - 안티앨리어싱 기법들 - 다른 색공간들 보간(interpolation) flat in vec4 foo // 보간 없음(default: smooth) - 기본적으로 정수는 flat, float은 smooth - 입력이 점이면 아무 문제 없다 - 선이나 삼각형이면 어느 정점을 택하는가? void glProvokingVertex(GLenum provokeMode) GL_FIRST_VERTEX_CONVENTION, GL_LAST_VE..
기하 셰이더의 특징매 실행마다 프리미티브 하나를 통째로 처리 (정점 셰이더는 매 실행마다 정점 하나만 처리)OpenGL 파이프라인의 데이터 양을 프로그래밍으로 변경 가능기하 셰이더에 들어오는 정점의 수 ≠ 나오는 정점의 수기하 셰이더에 들어오는 프리미티브 타입 ≠ 나오는 프리미티브 타입 기하 셰이더의 기본 사양 // 그냥 거쳐가는 기하 셰이더 layout (triangles) in; layout (triangle_strip) out;layout (max_vertices = 3) out; void main() { int i; for(i=0; i 아무것도 생성되지 않는다 정점 셰이더에서 기하 셰이더로 값 전달하기 // 정점 셰이더의 출력out VS_OUT { vec4 color; vec3 normal;} v..
다양한 그리기 명령의 구분 기준: index/non-indexed, direct/indirect 기본 명령은 glDrawArrays()와 glDrawElements() 다른 명령들 Draw Type Command direct, non-indexed glDrawArraysInstancedBaseInstance() direct, indexed glDrawElementsInstsancedBaseVertexBaseInstance() indirect, non-indexed glMultiDrawArraysIndirect() indirect, indexed glMultiDrawElementsIndirect() glDrawElements => glDrawElementsBaseVertex(mode, count, type..
정점 셰이더의 역할: 정점의 위치를 정하여 다음 단계에 넘긴다 그리고 기타 사용자 정의 출력 또는 내장된 출력을 설정한다 vertex fetch: 모든 OpenGL 그래픽스 파이프라인의 시작(vertex attribute가 필요하다면) - 정점 셰이더 전에 실행된다 - glVertexAttribPointer()는 버퍼 내의 데이터를 정점 셰이더 입력으로 돌린다. 이 함수는 다음 함수들을 합친 것이다. - glVertexAttribFormat() - glVertexAttribBinding() - glBindVertexBuffer() 정점 셰이더 애플리케이션 layout (location = 0) in vec4 position; layout (location = 1) in vec3 normal; layout..
텍스처 - 셰이더가 읽고 쓸 수 있는 구조화된 저장 형태 - 주로 이미지 데이터를 저장하는 데 쓰임 사용법 1. 이름을 생성한다 2. 텍스처 타겟에 그 이름을 바인딩한다 3. 원하는 이미지 크기를 명시한다 종류 - 1D, 2D, 3D, rectangle 텍스처 읽기 - 텍스처는 샘플러 변수(sampler variable)로 표현된다 - 2D 텍스처 => sampler2D uniform sampler2D s; out vec4 color; void main() { color = texelFetch(s, ivec2(gl_FragCoord.xy), 0); } sampler1D, sampler2D, ... => floating-point prefix i => integer(signed) prefix u => un..
vertex attribute: 데이터를 정점 셰이더에 넘긴다 interface block: 한 셰이더 스테이지에서 다른 스테이지로 데이터를 넘긴다 uniform: 애플리케이션에서 한 셰이더 스테이지로 데이터를 넘긴다 유니폼은 default block uniform과 uniform block으로 나뉜다. uniform block에서는 값이 버퍼 개체 안에 저장된다. 유니폼은 항상 상수이며 셰이더가 값을 할당할 수 없다. 단 유니폼 선언 시의 할당만은 가능하다. 유니폼 선언 예시 layout(location = 17) uniform vec4 myUniform; // layout 한정자는 생략 가능하며 생략시 자동으로 설정된다. 유니폼의 location 찾기 GLint glGetUniformLocation(..
버퍼: linear allocation of memory 버퍼는 이름(name)에 의해 표현된다. name은 OpenGL이 버퍼를 식별하기 위해 사용하는 opaque handle이다. data store: 버퍼 개체에 할당된 메모리 기본적인 사용법 1. 버퍼의 이름을 얻는다. 2. 버퍼를 OpenGL 컨텍스트에 붙인다. 그러려면 버퍼를 buffer binding point(또는 target이라고 함)에 바인딩한다. target은 정점 셰이더의 입력 또는 셰이더들의 변수다. 메모리 할당: glBufferData(target, size, data, usage) GL은 버퍼에 타입을 할당하지 않는다. 버퍼는 어느 목적으로든 쓰일 수 있다. usage의 조합: GL_[STREAM/STATIC/DYNAMIC]_[..
Tessellation: high-order primitive, 즉 patch를 작고 단순한 수많은 primitive들로 쪼개는 작업 OpenGL은 테셀레이션 엔진을 내장하고 있다. 이 엔진은 고정 기능이지만 여러 설정이 가능하다. 테셀레이션 엔진은 quadrilateral, triangle, line을 point, line, triangle으로 조각내어, 일반적인 래스터라이제이션 하드웨어가 바로 쓸 수 있게 만든다. 테셀레이션 단계는 3단계로 나뉜다. 1. Tessellation Control Shader(TCS): 입력되는 control point들을 처리하고 여러 테셀레이션 인자를 결정한다. 2. Fixed-function Tessellation Engine: patch를 단순한 primitive들..