월: 2013 11월

Uniform, Varying, and Attribute in GLSL

GLSL shader에서 input 또는 output으로 사용하는 변수 type은 3가지가 있다. 1. uniform rendering하는 동안 변하지 않는 변수이다. 마치 C 언에에서의 global extern variable의 개념이라고 생각하면 된다. OpenGL application으로 부터 값을 전달받을 수 있다. vertex shader와 fragment shader에서 모두 공유하여 사용하는 것이 가능하지만, 값을 읽는 것만 가능하다. 예) light position, light color 2. atttibute uniform과 마찬가지로

GLSL

OpenGL에서 사용하는 shader를 작성하는 데 쓰이는 언어를 OpenGL Shading Language (GLSL)이라고 한다. GLSL은 GLslang이라고도 한다. GLSL은 C 언어와 유사한데, C언어를 기초로 만들어진 상위 레벨의 shading 언어이기 때문이다. C언어에서 source code가 compile되어 object 파일로 만들어진 후에 합쳐져서 하나의 프로그램이 되는 것과 마찬가지로, GLSL 또한 source code가 compile되어 shader object로 만들어진 후에 program object에 link되어 사용된다. 하지만 C언어 프로그램은

OpenGL graphics pipeline

Shader란 rendering pipeline (graphics pipeline)의 중간에 위치하여 어떠한 필요한 계산을 해주는 비교적 작은 크기의 programmable unit을 말한다. OpenGL에서 사용 가능한 shader의 종류는 다음 세 가지가 있다. 1. vertex shader (VS) 2. geometry shader (GS) 3. fragment shader (FS) 우선 OpenGL에서 사용하는 vertex의 개념부터 알아보자. Vertex란 한 점에 정의된 attribute들의 집합을 말한다. 예) location in space,

OpenGL framebuffer object

Framebuffer는 rendering의 최종 결과가 기록되는 buffer들의 집합이다. OpenGL context가 생성되면서 기본적으로 하나의 framebuffer를 생성하여 사용하는데, 이러한 default framebuffer를 window-system-provided framebuffer라고 부른다. 반면, 필요 시 임의의 framebuffer를 동적으로 생성하여 사용하는 것이 가능한데, 이렇게 생성된 framebuffer를 application-created framebuffer라고 하며, 일반적으로 framebuffer object (FBO)라고 한다. FBO는 display 외의 목적으로도 많이 사용된다. Buffer란 OpenGL이 관리하는 memory 영역을 말한다. (buffer=array=image) 이러한

OpenGL texturing

//////////// // global // GLuint tex; // texture object name int width=100, height=100; // image size (100x100) unsigned char* bitmapData; // image data ///////////////////// // pre-step (once) // // memory allocation on system memory (RGBA per pixel) bitmapData = new unsigned char[width*height*4]; // loading image data from a file LoadBitmapFromFile( bitmapData, "testImage.bmp" ); // 2D

OpenGL object

OpenGL object는 다수의 state를 저장하는 구조체이다. OpenGL object가 어떤 context에 연결되면, object가 저장하고 있는 state가 context의 state로 나타나게 된다. 따라서, context 상에서의 변경 내용은 현재 연결되어 있는 object의 상태를 변경하게 된다. 또한, context 상에서 수행하는 함수들은 현재 연결되어 있는 object에 저장되어 있는 상태를 기반으로 작동한다. OpenGL object를 사용하려면 우선 각 object 마다 고유한 이름이 필요한데,

DC (Device Context) & RC (Rendering Context)

OpenGL이 OS상에서 구동되려면 OS에서 제공하는 window에 연결되어야 한다. 만약 동시에 두 개 이상의 OpenGL applications가 실행되고 있다면 이들 사이에는 상호간 영향이 있어서는 안된다. (A application에서 색상이나 선의 두께를 조절하였을 때, B application에서도 그 결과가 나오면 안된다는 뜻이다.) OpenGL은 이러한 문제를 해결하기 위해서 rendering context (RC)를 사용한다. MFC 등과 같은 Windows programming을 해보았다면 device context (DC)라는 용어를

OpenGL as a State Machine

State machine이란 state를 변경하는 명령을 받기 전에는 현재의 state를 계속 유지하는 machine을 말한다. OpenGL은 미리 정의되어 있는 유한개의 state들을 가지고 있으므로 finite state machine (FSM)의 일종으로 볼 수 있다. (실제로 유한개이긴 하지만 매우 많은 state들이 정의되어 있다.) 예를 들면, glColor3f(0,0,1)을 호출한 이후에는 또 다른 값으로 glColor3f(*) 함수를 호출하지 않는 한 모든 도형들이 파란색으로 그려지게 된다.