목록Season 1 (107)
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..
원문: http://brandon.si/code/the-state-monad-a-tutorial-for-the-confused/ 원작자 Brandon Simmons의 허락을 받아 번역한 글입니다. 원글의 라이센스는 Creative Commons BY-NC-SA로서 저작자 표시, 비영리, 동일조건변경허락 제약이 걸려있습니다. 하스켈의 State 모나드에 대한 이 튜토리얼은, 내가 읽었던 다른 글들에서 직면한 알기 어려웠던 차이점들을 이해하고, 모든 난해한 추상화를 파헤치기 위해 작성한 것이다. 이 글은 Maybe 모나드와 List 모나드는 잘 이해했지만 State 모나드에서 턱 막힌 사람들을 위한 것이다. 도움이 되기를! 데이터 선언 모나드를 이해하려면 그것의 자료형과 bind(>>=)의 정의를 살펴봐야 ..
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]_[..