(Microsoft PowerPoint - lecture16-ch8.ppt [\310\243\310\257 \270\360\265\345])

Similar documents
Microsoft PowerPoint - lecture18-ch8

Microsoft PowerPoint - lecture17-ch8.ppt

Microsoft PowerPoint - lecture16-ch8.ppt [호환 모드]

Microsoft PowerPoint - lecture16-ch8.ppt [호환 모드]

Microsoft PowerPoint - lecture16-ch8 [호환 모드]

Microsoft PowerPoint - lecture15-ch8.ppt [호환 모드]

Microsoft PowerPoint - lecture15-ch8.ppt [호환 모드]

(Microsoft PowerPoint - lecture15-ch8.ppt [\310\243\310\257 \270\360\265\345])

Microsoft PowerPoint - lecture17-ch8

Microsoft PowerPoint - lecture17-ch8.ppt [호환 모드]

단국대학교멀티미디어공학그래픽스프로그래밍기말고사 (2012 년봄학기 ) 2012 년 6 월 12 일학과학번이름 기말고사 담당교수 : 단국대학교멀티미디어공학전공박경신 l 답은반드시답안지에기술할것. 공간이부족할경우반드시답안지몇쪽의뒤에있다고명기한후기술할것. 그외의경우의답안지뒤

歯Lecture2.PDF

(Microsoft PowerPoint - JXEUOAACMYBW.ppt [\310\243\310\257 \270\360\265\345])

Microsoft Word - cg08-final-answer.doc

Microsoft Word - cg09-final-answer.doc

PowerPoint 프레젠테이션

Microsoft PowerPoint - lecture19-ch8.ppt

Microsoft Word - cg07-midterm.doc

Microsoft PowerPoint - lecture3-ch2.ppt [호환 모드]

Microsoft Word - cg07-final.doc

Microsoft PowerPoint - lecture16-ch6

Microsoft PowerPoint - lecture15-ch6.ppt

WebGL 레슨 5 - 텍스쳐에 대하여

Overview OSG Building a Scene Graph 2008 년여름 박경신 Rendering States StateSet Attribute & Modes Texture Mapping Light Materials File I/O NodeKits Text 2

Łø·ŸÕ=¤ ¬ ÇX±xÒ¸ 06 - Èpº– 1

PowerPoint 프레젠테이션

Microsoft Word - cg12-midterm-answer

Open GL

슬라이드 1

Microsoft PowerPoint - 05geometry.ppt

Microsoft PowerPoint - lecture11-ch4

Microsoft PowerPoint - lecture11-ch4.ppt

Microsoft Word - cg09-midterm.doc

Microsoft PowerPoint - 06-Body Data Class.pptx

Microsoft PowerPoint - IP11.pptx

Microsoft PowerPoint - lecture4-ch2.ppt

(Microsoft PowerPoint - \301\24608\260\255 - \261\244\277\370\260\372 \300\347\301\372)

untitled

서강대학교 공과대학 컴퓨터공학과 CSE4170 기초 컴퓨터 그래픽스 중간고사 (1/7) [CSE4170: 기초 컴퓨터 그래픽스] 중간고사 (담당교수: 임 인 성) 답은 연습지가 아니라 답안지에 기술할 것. 답 안지 공간이 부족할 경우, 답안지 뒷면에 기술 하고, 해당

서피스셰이더프로그램 셰이더개발을쉽게! Thursday, April 12, 12

Microsoft PowerPoint - java1-lab5-ImageProcessorTestOOP.pptx

단국대학교멀티미디어공학그래픽스프로그래밍중간고사 (2011 년봄학기 ) 2011 년 4 월 26 일학과학번이름 중간고사 담당교수 : 단국대학교멀티미디어공학전공박경신 l 답은반드시답안지에기술할것. 공간이부족할경우반드시답안지몇쪽의뒤에있다고명기한후기술할것. 그외의경우의답안지뒤

(Microsoft PowerPoint - ADEFNJKEPXSQ.ppt [\310\243\310\257 \270\360\265\345])

서강대학교공과대학컴퓨터공학과 CSE4170 기초컴퓨터그래픽스기말고사 (2/8) 다음과같이설정되어있는데, cam.pos[0] = 0.0, cam.pos[1] = 0.0, cam.pos[2] = 500.0; 이때의 cam.naxis[] 벡터의세원소값을기술하라. Figure

<4D F736F F F696E74202D20C1A63130B0AD202D20C1F6C7FCB0FA20C7CFB4C3C0C720B7BBB4F5B8B5>

PowerPoint 프레젠테이션

Microsoft PowerPoint - GameProgramming23-PixelShader.ppt

서강대학교공과대학컴퓨터공학과 CSE4170 기초컴퓨터그래픽스기말고사 (1/9) [CSE4170: 기초컴퓨터그래픽스 ] 기말고사 담당교수 : 임인성 답은연습지가아니라답안지에기술할것. 답안지공간이부족할경우, 답안지뒷면에기술하고, 해당답안지칸에그사실을명기할것. 연습지는수거하

BMP 파일 처리

(Microsoft PowerPoint - GEWZKYNMIJWQ.ppt [\310\243\310\257 \270\360\265\345])

LIDAR와 영상 Data Fusion에 의한 건물 자동추출

Microsoft PowerPoint - NV40_Korea_KR_2.ppt

Microsoft PowerPoint - GameDesign6-Graphics.ppt [호환 모드]

Microsoft PowerPoint - 13prac.pptx

목차 제 1 장 inexio Touch Driver소개 소개 및 주요 기능 제품사양... 4 제 2 장 설치 및 실행 설치 시 주의사항 설치 권고 사양 프로그램 설치 하드웨

슬라이드 1

서강대학교 공과대학 컴퓨터공학과 CSE4170 기초 컴퓨터 그래픽스 중간고사 (1/8) [CSE4170: 기초 컴퓨터 그래픽스] 중간고사 (담당교수: 임 인 성) 답은 연습지가 아니라 답안지에 기술할 것. 있는 변환 행렬은 일반적으로 어떤 좌표계 에서 어떤 좌표계로의

Microsoft PowerPoint - chap02.ppt

슬라이드 1

K_R9000PRO_101.pdf

04_오픈지엘API.key

untitled

쉽게 풀어쓴 C 프로그래밍

<4D F736F F F696E74202D B30395FBAEDB7BBB5F95FBDBAC5D9BDC7B9F6C6DB5FB1D7B8B2C0DA2E >

쉽게 풀어쓴 C 프로그래밍

12 강. 문자출력 Direct3D 에서는문자를출력하기위해서 LPD3DXFONT 객체를사용한다 LPD3DXFONT 객체생성과초기화 LPD3DXFONT 객체를생성하고초기화하는함수로 D3DXCreateFont() 가있다. HRESULT D3DXCreateFont

Structure and Interpretation of Computer Programs: Assignment 3 Seung-Hoon Na October 4, George (아래 3개의 문제에 대한 구현이 모두 포함된 george.rkt파일을 제출하시오.

; struct point p[10] = {{1, 2, {5, -3, {-3, 5, {-6, -2, {2, 2, {-3, -3, {-9, 2, {7, 8, {-6, 4, {8, -5; for (i = 0; i < 10; i++){ if (p[i].x > 0 && p[i

4.1 힘의모멘트 스칼라공식 4.1 힘의모멘트 스칼라공식 모멘트크기 (resultant moment) 2

Microsoft PowerPoint - 3ÀÏ°_º¯¼ö¿Í »ó¼ö.ppt

PowerPoint 프레젠테이션

Microsoft PowerPoint - 07-Data Manipulation.pptx

OpenGL 프로그래밍 가이드 : OpenGL 1.2 공식 학습 가이드 제3판

歯9장.PDF

<4D F736F F F696E74202D20C1A63037B0AD202D20B1A4BFF8B0FA20B1D7B8B2C0DA>

chapter2.hwp

Open GL

Microsoft PowerPoint - ch10 - 이진트리, AVL 트리, 트리 응용 pm0600

Microsoft PowerPoint - chap11-포인터의활용.pptx

(Microsoft PowerPoint - CNVZNGWAIYSE.ppt [\310\243\310\257 \270\360\265\345])

PowerPoint 프레젠테이션

슬라이드 제목 없음

C++-¿Ïº®Çؼ³10Àå

[ReadyToCameral]RUF¹öÆÛ(CSTA02-29).hwp

API 매뉴얼

chap10.PDF

Microsoft PowerPoint - Practical performance_KR_3.ppt

Microsoft Word - cg09-midterm-answer.doc

Microsoft PowerPoint - 04-Model Class.pptx

OpenGL ES2.0 기초 강좌

(Microsoft PowerPoint - 07\300\345.ppt [\310\243\310\257 \270\360\265\345])

<4D F736F F F696E74202D20C1A63034B0AD202D20C7C1B7B9C0D3B8AEBDBAB3CABFCD20B9ABB9F6C6DBC0D4B7C2>

C# Programming Guide - Types

ez-md+_manual01

<4D F736F F F696E74202D204347C3E2BCAEBCF6BEF D315FC4C4C7BBC5CDB1D7B7A1C7C8BDBA20B0B3B0FC2E >

Microsoft PowerPoint D View Class.pptx

룩업테이블기반비선형렌즈플레어실시간렌더링방법 (Real-Time Nonlinear Lens-Flare Rendering Method Based on Look-Up Table) 조성훈 정유나 이성길 (Sunghun Jo) (Yuna Jeong) (Sungkil Lee) 요

K&R2 Reference Manual 번역본

chap8.PDF

PowerPoint 프레젠테이션

Transcription:

OpenGL Texturing Texture Mapping 514780 2016 년가을학기 11/18/2016 박경신 OpenGL 에서텍스쳐맵핑 (texture mapping) 을위한 3 단계 텍스쳐활성화 glenable(gl_texture_2d) 텍스쳐맵핑방법 ( 랩핑, 필터등 ) 정의 gltexparameteri(gl_texture_2d, GL_TEXTURE_WRAP_S, GL_REPEAT) gltexparameteri(gl_texture_2d, GL_TEXTURE_WRAP_T, GL_REPEAT) gltexparameteri(gl_texture_2d, GL_TEXTURE_MAG_FILTER, GL_LINEAR) gltexparameteri(gl_texture_2d, GL_TEXTURE_MIN_FILTER, GL_LINEAR) glteximage2d(gl_texture_2d, 0, GL_RGB, width, height, 0, GL_RGB, GL_UNSIGNED_BYTE, imagedata) 텍스쳐좌표 (texture coordinates) 지정 // Square Vertices Texture Coordinates squaretexturecoords.push_back(glm::vec2(0.0f, 0.0f)); squaretexturecoords.push_back(glm::vec2(1.0f, 0.0f)); squaretexturecoords.push_back(glm::vec2(1.0f, 1.0f)); squaretexturecoords.push_back(glm::vec2(0.0f, 1.0f)); OpenGL Texturing Modern OpenGL 텍스쳐맵핑 (texture mapping) 은 fragment shading 에서 sampler 로구현됨 Sampler 는텍스쳐색을반환 //TextureFragmentShader.fs in vec2 texcoordpass; // texure coordinate from rasterizer out vec4 Color; // output color uniform sampler2d gtexturesampler; //texture object from application void main() { Color = texture2d( gtexturesampler, texcoordpass ); //TransformVertexShader.vs in vec3 vposition;// vertex position (in model space) in vec2 vtexcoord;// texture coordinate (in model space) out vec2 texcoordpass; // Output data will be interpolated for each fragment. uniform mat4 gmvp; // Values that sta constant for the whole mesh. void main() { gl_position = gmvp * vec4(vposition,1); // Output position of the vertex texcoordpass = vtexcoord; OpenGL Texture Names 텍스쳐의이름 (name) 지정하기 (textureid) GLuint textureid; glgentextures(1, &textureid); glbindtexture(gl_texture_2d, textureid); glteximage2d( ); gltexparameterf(..); glbindtexture(gl_texture_2d, 0); 텍스쳐이름으로텍스쳐불러오기 glactivetexture(gl_texture0); glbindtexture(gl_texture_2d, textureid);

glteximage2d glteximage2d(glenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum tpe, const GLvoid *pixels); target: GL_TEXTURE_2D level: 텍스쳐맵의다양한해상도를지원하기위해설정. 1 개의해상도를지정하려면 1 로설정. 밉맵 (mipmapping) 에사용 각텍스쳐를위한다수의크기를가지고있는이미지를사용하지않는다면 0 으로지정 internalformat: 일반적으로 format 과같음. RGB 라면 3, RGBA 라면 4 로설정 width, height: 텍스쳐이미지의너비와높이는 2 의자승으로되어야함 ( 즉, 2, 4, 8, 16, 32, 64, 128, 256, 512, etc) border: 텍스쳐의경계선너비를지정. 보통 0 이고이미지데이터가 border 를가지고있으면 1 로지정. tpe: 텍스쳐이미지데이터의형식을설정. glteximage1d glteximage1d(glenum target, GLint level, GLint internalformat, GLsizei width, GLint border, GLenum format, GLenum tpe, const GLvoid *pixels); glteximage2d() 함수는 2 차원텍스처이미지를정의하고 glteximage1d() 함수는 1 차원텍스처이미지를정의한다. glteximage1d() 함수와 glteximage2d() 함수의사용방법과인자의의미는거의동일하며 glteximage2d() 함수에만이미지텍스처의 height( 높이 ) 인자가추가된다. gltexsubimage2d 텍스쳐크기가 2 의승수 (e.g., 64x64, 128x256,..) 가아닌경우텍스쳐이미지의일부분만읽어들일때사용함 gltexsubimage2d(glenum target, GLint level, GLint xoffset, GLint offset, GLsizei width, GLsizei height, GLenum format, GLenum tpe, const GLvoid *pixels); OpenGL Texture Coordinates 텍스쳐맵핑이사용되려면객체에텍스쳐좌표를정의해야한다. GLUT teapot 은텍스쳐좌표를포함하고있다. GLU quadrics 도텍스쳐좌표를옵션으로정의할수있다. gluquadrictexture(quadric, GL_TRUE) 를사용하여텍스쳐맵핑활성화

OpenGL Texture Coordinates OpenGL에서텍스쳐좌표는텍스쳐이미지의각방향 (S, T) 의 0부터 1의영역으로형성됨. OpenGL에서각정점별로텍스쳐좌표를지정해야함. 정점의텍스쳐좌표가객체의표면에보간되어나타남. t (2.5,5.0,0.0) (0,1) (1,1) (0.0,0.0,0.0) OpenGL Texture Coordinates 텍스쳐는다각형에고르게입힐필요는없음. 기하하적모델이나텍스쳐좌표사용에따라서, 이미지가때론왜곡되게나타날수도있음. Texture Coordinates (0,0) (1,0) (1,1) (0,1) Vertex Positions (-1.0, -1.0, 0.0) (1.0, -1.0, 0.0) (rmouseposx, rmouseposy, 0.0) (lmouseposx, lmouseposy, 0.0) (0,0) Texture space (1,0) s Object space (3.0,-2.0,0.0) OpenGL Texture Filtering OpenGL 에서텍스쳐좌표가 [0, 1] 영역을벗어날경우에 texture wrapping 방법으로정의함 : GL_CLAMP, GL_CLAMP_TO_EDGE, GL_REPEAT, GL_MIRRORED_REPEAT 사각형에 4 개의텍스쳐좌표를 (0,0), (0,3.5), (3.5,0), (3.5,3.5) 로정의한예 OpenGL Texture Filtering Mipmap 은이전 mipmap 너비와폭의절반크기임. 텍스쳐가작아질수록, 보다많은텍셀이한픽셀에적용되야하므로 GL_NEAREST 나 GL_LINEAR 필터가정확한계산결과를만들지않을수있음. 따라서객체가움직일때텍스쳐가 flickering 하게나타날수있음. 밉맵은이런 flickering 문제를줄여줄수있음. 그러나일반적으로희미하게보임. Repeat Clamp Repeat &Clamp GL_LINEAR GL_LINEAR_MIPMAP_LINEAR

OpenGL Texture Filtering 텍스쳐맵핑을위한필터링방법 최근점필터 (nearest neighbor filter) GL_NEAREST 이선형필터 (bilinear interpolation filter) GL_LINEAR 삼선형필터 (trilinear interpolation filter) mipmap filter GL_LINEAR_MIPMAP_LINEAR 혼합필터 (hbrid filter) GL_NEAREST_MIPMAP_LINEAR GL_LINEAR_MIPMAP_NEAREST GL_NEAREST_MIPMAP_NEAREST OpenGL Texture Filtering gltexparameter{ifv(glenum target, GLenum pname, TYPE *param); GL_TEXTURE_WRAP_S, GL_TEXTURE_WRAP_T GL_CLAMP, GL_CLAMP_TO_EDGE, GL_REPEAT, GL_MIRRORED_REPEAT GL_TEXTURE_MAG_FILTER GL_NEAREST, GL_LINEAR GL_TEXTURE_MIN_FILTER GL_NEAREST, GL_LINEAR (Mipmap 을사용하지않는경우 ) GL_NEAREST_MIPMAP_NEAREST, GL_NEAREST_MIPMAP_LINEAR, GL_LINEAR_MIPMAP_NEAREST, GL_NEAREST_MIPMAP_NEAREST GL_TEXTURE_BORDER_COLOR [0.0, 1.0] 영역의값 GL_TEXTURE_PRIORITY 0 또는 1 Texture Environment Parameters Texture Environment Parameters gltexenv{fi[v](..) 를사용하여텍스쳐의색 (C t, A t ) 과현재처리하는프레임버퍼의픽셀색 (C f, A f ) 을어떻게혼합할지설정함 GL_TEXTURE_ENV_MODE 의모드 : GL_MODULATE: 텍스쳐의색성분과음영에서주어지는색성분을곱함으로써텍스쳐맵핑없이할당될음영을변조가능 GL_DECAL: 텍스쳐의색이객체의색을완전히결정 GL_BLEND: 환경색과합성함 GL_REPLACE: 텍스쳐색만사용함 GL_BLEND 의합성색은 GL_TEXTURE_ENV_COLOR 으로지정함 GLfloat blendcolor[] = {0.0, 1.0, 0.0, 0.5; gltexenvfv(gl_texture_env, GL_TEXTURE_ENV_COLOR, blendcolor);

OpenGL Texture Movies 텍스쳐이미지 sequence 를이용하여 flipbook 애니메이션제작 inittexture() 함수에서전체텍스쳐이미지를읽어들임 idle() 함수에서 currenttextureid 를 update 함 drawtexture() 함수에서는동일한정점좌표와텍스쳐좌표에 glbindtexture(gl_texture_2d, currenttextureid); 를사용하여프레임당한텍스쳐를 binding 함 애니메이션효과를줌 OpenGL Texture Coordinate Generation OpenGL 에서는텍스쳐좌표를자동적으로생성할수있음 S, T 방향으로텍스쳐좌표자동생성을활성화해야함 glenable(gl_texture_gen_s), glenable(gl_texture_gen_t) GL_TEXTURE_GEN_MODE 모드 : GL_OBJECT_LINEAR, GL_EYE_LINEAR, GL_SPHERE_MAP 평면 (plane) 을지정해야함 - 평면으로부터의거리에바탕을둔텍스쳐좌표를생성 gltexgenfv(gl_s, GL_OBJECT_PLANE, planecoefficients) image1 image2 image3 image4 image5 image6 planecoefficients = { 1, 0, 0, 0 ; gltexgeni(gl_s, GL_TEXTURE_GEN_MODE, GL_OBJECT_LINEAR) ; gltexgenfv(gl_s, GL_OBJECT_PLANE, planecoefficients); glenable(gl_texture_gen_s) ; glbegin(gl_quads) ; glvertex3f(-3.25, -1, 0); glvertex3f(-1.25, -1, 0) ; glvertex3f(-1.25, 1, 0); glvertex3f(-3.25, 1, 0) ; glend() ; OpenGL Sphere Mapping OpenGL 에서는구형맵핑 (sphere mapping) 지원 구형맵핑텍스쳐좌표는 view 벡터가구표면의법선벡터에반사된 reflection 벡터로계산됨. 반사벡터를 2차원텍스쳐좌표로맵핑하는것이간단하고하드웨어, 소프트웨어로도구현이가능. 그러나원형이미지를구하는것이어려움 (360도의주변환경을담은이미지여야함 ). 아주넓은광학렌즈에의한원근투영을구하거나, 입방체투영을이용하여근사한값을얻음. gltexgeni(gl_s, GL_TEXTURE_GEN_MODE, GL_SPHERE_MAP) ; gltexgeni(gl_t, GL_TEXTURE_GEN_MODE, GL_SPHERE_MAP) ; glenable(gl_texture_gen_s) ; glenable(gl_texture_gen_t) ; OpenGL Box Mapping OpenGL 에서는입방체맵핑 (box mapping) 지원 입방체맵은반사맵핑 (reflection mapping) 의하나임 그러나입방체맵은 3 차원텍스쳐좌표를사용해야함 반사텍스쳐는환경을둘러싸고있는입방체의 6 면 2 차원텍스쳐 gltexgeni(gl_s, GL_TEXTURE_GEN_MODE, GL_REFLECTION_MAP) ; gltexgeni(gl_t, GL_TEXTURE_GEN_MODE, GL_REFLECTION_MAP) ; gltexgeni(gl_r, GL_TEXTURE_GEN_MODE, GL_REFLECTION_MAP) ; glenable(gl_texture_gen_s) ; glenable(gl_texture_gen_t) ; glenable(gl_texture_gen_r) ; glenable(gl_texture_cube_map);

Multitexturing 멀티텍스쳐 (Multitexturing) 하나이상의텍스쳐를객체에적용해서렌더링효과를높이는경우 + = OpenGL 1.2.1 revision (ARB_multitexture extension) Multitexturing Single-Pass vs. Multi-Pass Multitexturing 싱글패스다중텍스쳐링은하나의렌더링패스안에서텍스쳐를여러개입히는것 다중패스다중텍스쳐링은블렌딩으로장면이나다각형자체를여러번렌더링하는것 라이트매핑 (Light Mapping) 물체면의밝기를계산하는대신텍스쳐와조명결과를혼합하여결과적으로영상을직접물체면에입힘 (e.g. Quake 등게임 ) Incoming Fragment Color Texture 0 Environme nt Texture 1 Environme nt Resulting Color + = Texture 0 Color Texture 1 Color v Single-Pass Multitexturing (1,1) (1,1) Single-Pass Multitexturing void SetMultitexturSquareData() { // 중간생략.. x glgenbuffers(4, &vbo[0]); u (-1,-1) (0,0) glbindbuffer(gl_array_buffer, vbo[0]); glbufferdata(gl_array_buffer, 4*sizeof(glm::vec3), &quadvertices[0], GL_STATIC_DRAW); glvertexattribpointer(0, 3, GL_FLOAT, GL_FALSE, 0, 0); glenablevertexattribarra(0); glbindbuffer(gl_array_buffer, vbo[1]); glbufferdata(gl_array_buffer, 4*sizeof(glm::vec3), &quadnormals[0], GL_STATIC_DRAW); glvertexattribpointer(1, 3, GL_FLOAT, GL_FALSE, 0, 0); glenablevertexattribarra(1); glbindbuffer(gl_array_buffer, vbo[2]); glbufferdata(gl_array_buffer, 4*sizeof(glm::vec2), &quadtexturecoords[0], GL_STATIC_DRAW) glvertexattribpointer(2, 2, GL_FLOAT, GL_FALSE, 0, 0); glenablevertexattribarra(2); glbindbuffer(gl_array_buffer, vbo[3]); glbufferdata(gl_array_buffer, 4*sizeof(glm::vec2), &quadtexturecoords[0], GL_STATIC_DRAW) glvertexattribpointer(3, 2, GL_FLOAT, GL_FALSE, 0, 0); glenablevertexattribarra(3); Bind and enable two 2D multitextures to draw a quad // stage 0 activate glactivetexture(gl_texture0); glbindtexture(gl_texture_2d, texture0); // stage 1 activate glactivetexture(gl_texture1); glbindtexture(gl_texture_2d, texture1); drawsquare(); // texture disabled glbindtexture(gl_texture_2d, 0);

Billboarding 빌보드기법 (-1,1,0) z (0,0,0) x (1,1,0) 사각형의정면이항상카메라의정면을향하여바라보도록만드는것으로, 결과적으로카메라가어느방향에서바라보아도사각형은항상같은면을보여주게됨 사용예로써, 넓은지면위에나무를나타내고자할때나무를메쉬모델링으로표현하지않고나무이미지를빌보드로구현함 알파텍스처기법과애니메이션이결합된빌보드기법은고체표면을갖지않는여러현상을표현하는데사용 : 연기, 불, 안개, 폭발등 (-1,-1,0) (1,-1,0) Billboarding 적용후 Billboarding 빌보드원리 구현의핵심은, 항상시점을바라보도록 Modelview 행렬을이용하여빌보드사각형을이루는 vertex 를조정해야함 Modelview 행렬에는관찰자의시점에대한수직벡터 (up vector) 와우측벡터 (right vector) 정보가있음 Glfloat M[16]; glgetfloatv(gl_modelview_matrix, M); Right-vector Up-vector Look-vector m 0 m 1 m 2 m 3 m 4 m 5 m 6 m 7 m 8 m 9 m 10 m 11 m 12 m 13 m 14 m 15 Up-vector Right-vector Billboarding Axial Smmetr 빌보드사각형이 vertical axis 를중심으로회전 (rotate) 해야함 Modelview matrix M 에서부터카메라의 aw angle 을계산함 theta = atan2f(m[8], M[10]); Look.x Look.z 빌보드사각형의 Rotation matrix R 은 arbitrar axis ( 일반적으로 up vector=(0, 1, 0)) 과 angle ( 카메라 aw angle 의반대 ) 로계산함 R= Icosθ + Smmetric 2 2 ax + cosθ(1 ax) = axa(1 cosθ) + azsin θ axaz(1 cosθ) asinθ (1 cosθ) + Skew sin θ aa (1 cosθ) a sinθ x 2 2 a + cosθ(1 a ) a a (1 cosθ) + a sinθ z z x a xaz(1 cosθ) + asinθ aaz(1 cosθ) axsin θ 2 2 a + cos (1 ) z θ az

Point Sprites Point Sprites 이란하드웨어기반의빌보드기법으로, 사용예로써파티클시스템 (Particle Sstem) 에서다수의입자 (Particle) 을텍스쳐사각형메쉬 (Quad) 대신점 (Point) 를사용하여지정함 OpenGL extension (GL_ARB_point_parameters & GL_ARB_point_sprite) Point Sprites 확장지원헤더포함 #include <GL/glext.h> PFNGLPOINTPARAMETERFARBPROC glpointparameterfarb = NULL; PFNGLPOINTPARAMETERFVARBPROC glpointparameterfvarb = NULL; Point Sprites 확장지원여부확인및함수포인터설정 char *ext = (char*) glgetstring(gl_extensions); if(strstr(ext, "GL_ARB_point_parameters") == NULL) { printf("gl_arb_point_parameters extension was not found\n"); return; else { glpointparameterfarb = (PFNGLPOINTPARAMETERFARBPROC) wglgetprocaddress("glpointparameterfarb"); glpointparameterfvarb = (PFNGLMULTITEXCOORD2FARBPROC) wglgetprocaddress(" glpointparameterfvarb "); if(! glpointparameterfarb! glpointparameterfvarb ) { printf("one or more GL_ARB_point_parameters were not found\n"); return; Point Sprites glpointparameterf[v]arb (GLenum pname, GLfloat param); GL_POINT_SIZE_MIN_ARB (default: 0.0) GL_POINT_SIZE_MAX_ARB GL_POINT_FADE_THRESHOLD_SIZE_ARB (default: 1.0) GL_POINT_DISTANCE_ATTENUATION_ARB (default: 0, 0, 0) Point sprite 으로 texture coordinate 을지정하고 enable 함 gltexenvf(gl_point_sprite_arb, GL_COORD_REPLACE_ARB, GL_TRUE); glenable(gl_point_sprite_arb);

Point Sprites Point 를렌더링 // enable point sprites... glenable(gl_point_sprite_arb); glbegin(gl_points); for (int i = 0; i < MAX_PARTICLES; ++i) { glcolor4f(g_particles[i].col[0], g_particles[i].col[1], g_particles[i].col[2], 1.0f); glvertex3fv(g_particles[i].pos); glend(); Reference OpenGL Billboarding Tutorial http://www.lighthouse3d.com/opengl/billboarding SIGGRAPH 97 Advanced OpenGL Programs http://www.opengl.org/resources/code/samples/advanced/advanc ed97/programs/programs.html OpenGL Point Sprites http://www.informit.com/articles/article.aspx?p=770639&seqnum= 7 Particle Sstems http://www.gamedev.net/ // disable point sprites gldisable( GL_POINT_SPRITE_ARB );