태그: OpenGL

Missing GL version

목표: C code에서 offscreen rendering을 하고싶다. (내가 원하는 곳에서 내 마음대로 내 GPU를 사용해서 OpenGL drawing을 하고싶다.) 이렇게 하면 편한 경우가 종종 있다. (예를 들면, depth test, per pixel image processing 등) GLSL vertex shader와 fragment shader를 사용하면, 간단하게 GPU computing이 가능하며, texture sampling시 자동적인 interpolation과 hardware 기반의 빠른 access가 가능하다. 하지만, window creation 없이

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(*) 함수를 호출하지 않는 한 모든 도형들이 파란색으로 그려지게 된다.

Linux에서 Glut 설치법

리눅스에서 Glut 설치법 (주의: 본 설명은 완벽 버전이 아님) OS: CentOS 5.1 64bit 1. glut-3.7.tar.gz을 download한다. 2. 적당한 위치로 옮긴다. 3. 압축을 푼다.    tar xvfz glut-3.7.tar.gz    -> glut-3.7 디렉토리가 생김 4. cd glut3-7 5. ./mkmkfiles.imake 를 실행    만약, error: GL/glu.h: No such file or directory 라는 에러가 뜨는 경우…    /usr/include/GL/glu.h 파일이

How to install OpenGL @ Ubuntu

$ sudo apt-cache search glut $ sudo apt-get install glutg3 $ sudo apt-get install glutg3-dev /usr/bin/ld: cannot find -lXinerama : libxinerama-dev 를 설치해준다. /usr/bin/ld: cannot find -lXft : libxft-dev를 설치해준다. /usr/bin/ld: cannot find -lXi : libxi-dev를 설치해준다.

OpenGL tearing problem

OS: Ubuntu (우분투) nVidia gtx 250 사용시에는 나타나지 않던 문제점이 nVidia gtx 470 사용시에 발생하였다. 삼각형 두개를 정확한 좌표로 맞물려 그렸는데 3D 카드가 이것을 레스터라이즈 할 때 오차가 발생해서 마지막 픽셀들이 조금 덜 채워지는 현상이며, 흔히 티어링(tearing)이 발생하였다고 말한다. (http://www.gpgstudy.com/forum/viewtopic.php?topic=6677) 찾아보니 동일한 문제를 겪는 경우는 종종 있는데, 확실한 해결책은 없어보인다. 최신 그래픽 카드 드라이버를 설치해도

Off-screen Rendering (Render to Texture) using OpenGL

((Preliminaries)) 1. download the most recent version of GLEW library at http://glew.sourceforge.net/ 2. copy *.h files to “C:\Program Files\Microsoft Visual Studio 8\VC\include\GL” 3. copy *.lib files to “C:\Program Files\Microsoft Visual Studio 8\VC\lib” 4. copy *.dll files to “C:\WINDOWS\system32” #include <GL/glew.h> #include <GL/glut.h> #include <iostream> using namespace std;#pragma comment( lib, "glew32.lib"  ) #pragma comment( lib, "glew32s.lib"

How to get depth value form depth buffer in OpenGL

glEnable( GL_DEPTH_TEST ); glDepthMask( 1 ); glDepthFunc( GL_LEQUAL ); float onePixel; glReadPixels( xPos, yPos, 1, 1, GL_DEPTH_COMPONENT, GL_FLOAT, &onePixel ); float *depth = new float[w*h]; glReadPixels( xPos, yPos, w, h, GL_DEPTH_COMPONENT, GL_FLOAT, depth ); delete depth;