목록전체 글 (140)
Graphics Programming
Transorm Feedback - 정점, 테셀레이션, 기하 셰이더의 결과를 하나 이상의 버퍼 개체에 저장하기 위한 기능 - front end의 마지막 단계 - 프로그래밍 불가능, 고정 기능 스테이지 - 현 파이프라인의 마지막 단계에서 출력된 attribute들 중 명시한 것들이 버퍼에 기록된다 - 기하 셰이더가 없을 경우: 정점/테셀레이션 출력 정점들이 기록됨 - 기하 셰이더가 있을 경우: EmitVertex()에 의해 생성된 정점들이 저장됨 => 데이터 양이 변함 - Transform Feedback Buffer: 셰이더들의 출력을 포착하기 위해 쓰이는 버퍼 data -> TFB -> glGetBufferSubData() -> glMapBuffer() 사용법: GL에게 우리가 기록하길 원하는 출력을 ..
전부 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(..