OpenGL ES2.0 기초 강좌

Size: px
Start display at page:

Download "OpenGL ES2.0 기초 강좌"

Transcription

1 OpenGL ES2.0 기초강좌 나의별

2 소개글 OpenGL ES 2.0 의 Shader Programming 을이용하여, MFC 와 Android 용기초강좌 1. MFC EGL 구성 2. Android EGL 구성

3 목차 1 [GLES20] 01. Android 3D Programming을위한 MFC 프로젝트설정 4 2 [GLES20] 02. Android 3D Programming을위한 Android 프로젝트설정 12 3 [GLES20] 03. Color Shading 23 4 [GLES20] 04. Geometry Transform 32 5 [GLES20] 05. Vertex Position 처리 (1) 44 6 [GLES20] 06. Vertex Position 처리 - Obj 와 VBO (2) 53 7 [GLES20] 07. Parametric Surface 69 8 [GLES20] 08. 조명적용하기 - 확산광, Diffuse Vertex Light 77 9 [GLES20] 09. 조명적용하기 - 주변광, Ambient Vertex Light [GLES20] 10. 조명적용하기 - 경면광, Specular Vertex Light [GLES20] 11. 조명적용하기 - Pixel Light [GLES20] 12. 조명적용하기 - Flat Shading과 Smooth Shading [GLES20] 13. 조명적용하기 - Point Light와감쇠방정식 [GLES20] 14. 조명적용하기 - Spot Light [GLES20] 15. 조명적용하기 - Toon Shading [GLES20] 16. Q/A 몇가지와 FBO 사용시유의점정리 [GLES20] 17. 텍스쳐적용하기앞서서준비사항정리 [GLES20] 18. 텍스쳐적용하기 - 2D Texture 155

4 [GLES20] 01. Android 3D Programming 을위한 MFC 프로젝트설정 :20 OGLES20Template 네이버카페 3D Programming 의매니저이신바른생활님이 Android 용으로 GLSL 강좌를정리해보는것도좋을것같다는추천이있어 서한번도전해봅니다 ^^; 구성은바른생활님이 페이지에서만들고있는내용위주로진행할까생각중입니다. 중간중간 NeHe Tutorial 과 PowerVR SDK 의내용도추가해볼생각입니다. 이곳에정리하는내용은 3D의기본적인사항인 PROJECTION MATRIX, MODEL MATRIX, VIEW MATRIX, EULER/QUATERNION TRASFORMATION, FRAME BUFFER OBJECT, VERTEX BUFFER OBJECT, COLOR BUFFER ARRAY, DEPTH BUFFER ARRAY, STENCIL BUFFER ARRAY, VERTEX, TEXTURE, LIGHT, BLEND 등에대해서일일히서술하지는않도록하겠습니다. 위의내용은바른생활님 3D Programming 카페나기타다른 OpenGL ES 용도서를참고하셔서병행공부해나가면좋을것같습니다. 저는 OpenGL Super bible 과 iphone 3D Programming Developing Graphical Applications With OpenGL ES(Oreilly), OpenGLES 2.0 Programming Guide(Addison Wesley), OpenGL Shading Language 3/E(Addison Wesley) 등의 책을추천합니다. [GLES20] 01. Android 3D Programming 을위한 MFC 프로젝트설정 4

5 참고로제가구현한 Android Native Renderer 엔진은위의 iphone 3D Programming 책에서소개한 Native Renderer를기초로만들었으며, 차후혹여나상용화를하실경우라이센스상에문제가발생할수있습니다. ( 책에보면, 저자가소스에대해서 O'REILLY 출판사에권한이있음으로, 소스사용시문의는해달라는요청글등이있었던것같네요. ^^;) 들어가기에앞서서밝혀두지만, 저또한 3D 를마스터한상태는아닌 1 인이기때문에, 내용자체가저의주관적으로이해한것을바탕으로 정리될것입니다. 혹틀린부분이있다면바로바로지적해주십시요 ^^; 1. 폴더구성 기본적으로프로젝트를 Android Java 3D 가아닌, Native Renderer 로 3D 를구성할예정입니다. Java 로짤경우, Debugging 이쉬운장점이있지만, Native Renderer 보다속도가좀느리고, 아이폰이나윈모등다른플랫폼으로이식 하기에는어렸다는단점도있습니다. 이에 Native Renderer 를 C++ 로짜서 Android, ios, Windows Mobile 등에이식하게편하게만들어볼예정입니다. Native Renderer 의경우, Debugging 이어려운점이있지만, Renderer 부분은 MFC 로호환되게금해서 Visual Studio 로연계할예 정입니다. 프로젝트의기본구성은아래와같습니다. [GLES20] 01. Android 3D Programming 을위한 MFC 프로젝트설정 5

6 폴더설명 1. Builds : OpenGL, EGL Library 와 android ndk-r5b 에서사용할 stlport 등이있다. 향후추가적인 prebuilt library 등은이폴더에추가할예정이다. 2. Android : Android Project 폴더이다. 안드로이드로 App 개발시필요한 Activity 등이있으며, Native Renderer 용 JNI 도이곳에있다. 3. Windows : MFC Project 폴더이다. MFC 을구성하는 Frame, View, Document 파일등과 GLView, EGLView, Native Renderer Interface 등이있다. 4. Classes : Renderer 소스가있는폴더이다. 이폴더는 MFC 와 Android 에서공용으로사용한다. 5. Shaders : Shader Language 인 vertex shader 와 fragment shader 가있는폴더이다. 이폴더는 MFC 와 Android 에서공용으로사용한다. [GLES20] 01. Android 3D Programming 을위한 MFC 프로젝트설정 6

7 6. Utils : Renderer 를구성하는데필요한수학함수, 리소스매니저등과같은도우미모듈등이있는폴더이다. 이폴더는 MFC 와 Android 에서공용으로사용한다. 2. MFC 프로젝트구성 프로젝트패키지설명 1. Classes : 렌더링클래스가모여있다. 템플릿예제에서는 Grid 형의바닥과 X-Y-Z 축을그리고있다. 실제사용되는파일은 RenderingEngine.ES1.cpp와 RenderingEngine.ES2.cpp이며, EGLRenderer와 OGLRenderer는더이상사용되지는않는다. ( 렌더러모듈은 iphone 3D Programming 책내용과유사한구성을따르고있으며, 책의 1장내용과비교해서보시면됩니다.) 이폴더는 MFC와 Android에서공용으로사용한다. [GLES20] 01. Android 3D Programming 을위한 MFC 프로젝트설정 7

8 2. OpenGL.ES : MFC 에서사용할 EGLView 로서 libegl.lib 구현화한부분이다. EGView.cpp 는 MFC 의 CView 를상속받은 User View 이다. EGLSurface.cpp 는 EGL 을생성한 Surface 모듈이다. 3. Shaders : GLSL 용 Shader 파일들이있다. 이폴더는 MFC 와 Android 에서공용으로사용한다. 4. Utils : Renderer 를구성하는데필요한수학함수, 리소스매니저등과같은도우미모듈등이있다. 이폴더는 MFC 와 Android 에서공용으로사용한다. 5. 소스파일 : MFC 의 Frame, View, Document 의소스부분이다. 이중 NativeInterface.cpp 는 ResourceManager 에서 bmp 와 tga 파일을읽어올때거쳐가는 Bridge 역활을한다. 6. 헤더파일.gles : OpenGL ES 1.0 용 header 파일이다. 7. 헤더파일.gles2 : OpenGL ES 2.0 용 header 파일이다. 3. 실행결과 MFC 에서실행한결과는다음과같습니다. [GLES20] 01. Android 3D Programming 을위한 MFC 프로젝트설정 8

9 4. 예외사항정리 GLES 2.0 은 GLES1.0 의하위호환성을배제하고만들어졌습니다. 이때문에, GLES2.0 세서는기존 GLES1.0 에서지원하는 glmatrixmode, glpushmatrix, glpopmatrix, glrotatef, gltranslatef, glscalcef 등등등많은 API 가지원하지않습니다. 즉, 라이브러리에담겨있는 header 파일내의내용도서로다릅니다. 하나의 OGLES20Template 프로젝트내에 GLES1.0 과 GLES2.0 을담다보니서로충돌이나는문제가발생합니다. 이는 ios 개발시에도동일하며보통 Macro 처리를통해서컴파일시점에 GLES1.0 으로할지 GLES2.0 으로할지결정합니다. MFC 프로젝트에서는다음과같이수정해줘야두버전을사용할수있습니다. 4.1 GLES 2.0 으로빌드하기 프로젝트속성창의 " 링크 -> 입력 -> 추가종속성 " 탭에서 libglesv2.lib 를추가해줘야합니다. [GLES20] 01. Android 3D Programming 을위한 MFC 프로젝트설정 9

10 또한 EGLView.cpp 의 CEGLView::OnCreate() 에서렌더러생성을 RenderingEngine.ES2.cpp 로맞춰줘야합니다. 이부분은 iphone 3D Programming 책에서 GLView.mm 에서처리하는부분과유사하게처리하였습니다. 4.2 GLES 1.0 으로빌드하기 GLES1.0 으로빌드하기위해서는프로젝트속성창의 " 링크 -> 입력 -> 추가종속성 " 탭에서 libglesv2.lib 를삭제해준뒤에 또한 EGLView.cpp 의 CEGLView::OnCreate() 에서렌더러생성을 RenderingEngine.ES1.cpp 로맞춰줘야합니다. 이부분은 iphone 3D Programming 책에서 GLView.mm 에서처리하는부분과유사하게처리하였습니다. 다음에는 Android Project 설정에대해서다뤄보도록하겠습니다. 프로젝트는 16MB 정도로커져버려서, myastro google code 에올렸습니다. OGLES20 Template Application ported to mfc and android [GLES20] 01. Android 3D Programming 을위한 MFC 프로젝트설정 10

11 [GLES20] 01. Android 3D Programming 을위한 MFC 프로젝트설정 11

12 [GLES20] 02. Android 3D Programming 을위한 Android 프로젝트설정 :59 OGLES20Template 1. Android 프로젝트구성 [GLES20] 02. Android 3D Programming 을위한 Android 프로젝트설정 12

13 프로젝트패키지설명 1. com.myastro.gles.demo : Android App 의 Main Activity 이다. 2. com.myastro.gles : List Activity 이다. GLES20.Lesson 과 GLES10.Lesson 두가지 List Activity 가있다. 대체로 GLES20 에대해서다룰예정이지만, 시간여유가생기면, GLES10 용도업데이트할예정이다. 3. com.myastro.gles.view : EGL View용모듈이다. EGLView.java : GLSurfaceView를상속받은추상클래스 (abstract class) 이다. 또한 EGLView에는사용자로부터의이벤트도수신함으로 Touch 이벤트을통한 Gesture 기능구현은이곳에이루어져있다. EGLView20.java : EGLView를상속받아서 abstract method 들을구현한다. GLES20 용 EGL Configuration으로구성되어있다. [GLES20] 02. Android 3D Programming 을위한 Android 프로젝트설정 13

14 EGLView10.java : EGLView 를상속받아서 abstract method 들을구현한다. GLES10 용 EGL Configuration 으로구성되어있다. 4. com.myastro.main.jni : C++ 로구현한 NativeRenderer 와통신하는 Java native interface 이다. NativeRenderer.java : GLES10용 NativeRenderer.cpp와 GLES20용 NativeRender20.cpp를호출하기위한 native method로구성되어있다. CBJavaHandler.java : Java 단의 Main Activity Thread가아닌 Native 단의 NativeRenderer 로부터 Androd SDK내의 API를이용할때사용하기위한모듈이다. 이모듈에는 "utf-8 to ecu-kr" converting 함수, "bmp, png, jpg, tga" 등과같은이미지파일로딩을위한함수가있다.. 5. com.myastro.utils : TGA 이미지파일로딩클래스인 TGA.java(cocos2d java 버전에서가져옴 ) 와이미지로딩후 Integer 형을 Byte 형으로변환하기위한 ArrayCopy.java 클래스가있다. TGA.java : From cocos2d(zhouweikuan-cocos2d-2eb179b) 6. jni : Native Renderer를구성하는 Java Native Interface layer 이다. com_myastro_main_jni_nativerenderer.h : JNI의헤더파일이다.(Java Native Interface 참고 ) Anroid.mk : jni.gles10에있는 NativerRenderer.cpp 와앞장에서설명한 RenderingEngine.ES1.cpp 와 RenderingEngine.ES2.cpp를컴파일한다. 빌더는 ndk-r5b을이용하였으며, STL 라이브러리의경우, crystax 라이브러리가아닌 stlport 라이브러리를이용하였습니다. stlport library 는이전페이지에서언급했듯이 "OGLES20Application->Builds->Android->stlport" 폴더에있습니다. Application.mk : native module 생성파일로 ndk-r4b까지는그다지의미가없었지만, ndk-r5b에서는 stlport 를설정해주기도합니다.(APP_STL := stlport_static) 7. jni.gles10 : OpenGL ES 1.0 용 Native Renderer 이다. 8. jni.gles20 : OpenGL ES 2.0 용 Native Renderer 이다. 9. libs.armeabi : 빌드한 Shared Library 인 libnative.renderer.so 와 libnative.renderer20.so 가있다. 기본적으로 Android 프로젝트는위와같이구성되어있습니다. 그런데, Android 프로젝트에는 MFC 프로젝트에서설명했던 Renderer 클래스인 RenderingEngine.ES1.cpp와 RenderingEngine.ES2.cpp 등이보이지않습니다. 또한도우미라이브러리인 Interfaces.hpp, Matrix.hpp, Quaternion.hpp, Vector.hpp 등도보이지않습니다. 이프로젝트의구성을멀티플렛폼에맞춰서구성하다보니, 소스의위치를 Android Project 보다상위디렉토리레벨에배치하였습니다. [GLES20] 02. Android 3D Programming 을위한 Android 프로젝트설정 14

15 Eclipse 내에서프로젝트내에배치할경우, jni 폴더하위에두면되긴하지만, mfc 와 ios등과디렉토리레벨이틀어지기때문에현재와같이상위디렉토리레벨에배치하였습니다. 어차피 GDB을이용해서 native 단에서의 android debugging이쉽지않기때문에, mfc 에서디버깅할수있도록배치하였습니다. ( 이구성은 Imagination Technology 사의 PowerVR SDK 와유사한방식입니다.) 2. 실행결과 Android Galaxy Tab 에서실행하였으며, 결과는다음과같습니다. [GLES20] 02. Android 3D Programming 을위한 Android 프로젝트설정 15

16 Perspective Projection 으로 X 축 Red, Y 축 Green, Z 축 Blue 로표현되어있다. 3. 렌더러설명 제가여기에소개하는 Nativer Renderer 는기본적으로 iphone 3D Programming 책에설명이다나와있습니다. 그럼으로이책을사서보시는게이해는더빠르실거라생각됩니다. 또한렌더러설계에대해서는제블로그 에서한번소개했었습니다. 렌더링엔진구성은다음과같습니다. 제가 Android 3D 로포팅한렌더러엔진도 ios 프레임워크부분을 Android Java 프레임워크로변경하였을뿐위에있는구조와유 [GLES20] 02. Android 3D Programming 을위한 Android 프로젝트설정 16

17 사합니다. Classes/RenderingEngine.ES2.cpp 에있는 Render 함수의구성에대해서간단하게설명하도록하겠습니다. PROJECTION MATRIX if (width > height) ratio = (GLfloat)width / (GLfloat)height; else ratio = (GLfloat)height / (GLfloat)width; mat4 projectionmatrix = mat4::perspective(45.0f, ratio, 1.0f, 100.0f); gluniformmatrix4fv(m_simple.uniforms.projection, 1, 0, projectionmatrix.pointer()); CAMERA MATRIX /* Setting the camera */ vec3 eye(10, 10, 10); vec3 target(0, 0, 0); vec3 up(0, 1, 0); mat4 camera = mat4::lookat(eye, target, up); [GLES20] 02. Android 3D Programming 을위한 Android 프로젝트설정 17

18 틀릴수도있지만, 저는위의코드를아래와같이해석합니다. 카메라설정기능으로머리위인상향벡터 (up(0, 1,0 ) 로두었으며, 물체는원점 (target(0, 0, 0)) 으로설정되었고, 시점은 X, Y, Z 축으로 -10 만큼떨어져있다. 만약 3차원좌표계가아닌 2D 좌표계인 X-Y 기준으로보고싶다면, eye(0, 0, 10) 을하시면 X와 Y축만남게되고, Z축은시점에서정면이됩니다. VERTICES /* Draw Grid and Axis */ /* 20x20 의격자형바닥을그린다. */ GLfloat gridvertices[] = { -10.0f, 0.0f, 0.0f, 10.0f, 0.0f, 0.0f, 0.0f, 0.0f, -10.0f, 0.0f, 0.0f, 10.0f, ; /* X(Red)-Y(Green)-Z(Blue) 축을그린다. */ GLfloat axisvertices[] = { // x 0.0f, 0.0f, 0.0f, 6.0f, 0.0f, 0.0f, // y 0.0f, 0.0f, 0.0f, 0.0f, 4.0f, 0.0f, // z 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 6.0f, ; MODELVIEW MATRIX // 배경화면 Shader 인 Simple shader 프로그램바인딩. gluseprogram(m_simple.program); // GLES10에있는 glenableclientstate(gl_vertex_array) 를대체하는함수. glenablevertexattribarray(m_simple.attributes.position); // Draw Grid. // Grid Vertices Buffer Array 등록 [GLES20] 02. Android 3D Programming 을위한 Android 프로젝트설정 18

19 // GLES10에있는 glvertexpointer(3, GL_FLOAT, 0, gridvertices); glvertexattribpointer(m_simple.attributes.position, 3, GL_FLOAT, GL_FALSE, 0, gridvertices); gllinewidth(1.0f); GLint grid_axis_diffuse = m_simple.attributes.diffusematerial; // OGLES20에서는색을칠하는 Color Buffer Array 나 glcolor4f등의 API는지원하지않는다. // 이를대체하는방법으로 model에재질을입혀서색을표현해야한다. // diffuse material( 난반사재질 ) 색상을회색으로칠했다. vec3 grid_axis_material_dif = vec3(0.5f, 0.5f, 0.5f); glvertexattrib3fv(grid_axis_diffuse, grid_axis_material_dif.pointer()); mat4 grid_axis_modelview; for (int i = -10; i <= 10; ++i) { grid_axis_modelview = mat4::translate(0, 0, (GLfloat)i); grid_axis_modelview = grid_axis_modelview * camera; gluniformmatrix4fv(m_simple.uniforms.modelview, 1, 0, grid_axis_modelview.pointer()); gldrawarrays(gl_lines, 0, 2); for (int i = -10; i <= 10; ++i) { grid_axis_modelview = mat4::translate((glfloat)i, 0, 0); grid_axis_modelview = grid_axis_modelview * camera; gluniformmatrix4fv(m_simple.uniforms.modelview, 1, 0, grid_axis_modelview.pointer()); gldrawarrays(gl_lines, 2, 2); // Draw Axis. // Axis Vertices Buffer Array 등록 // GLES10에있는 glvertexpointer(3, GL_FLOAT, 0, axisvertices); 를대체하는함수. glvertexattribpointer(m_simple.attributes.position, 3, GL_FLOAT, GL_FALSE, 0, axisvertices); gllinewidth(1.5f); // Axis X // 빨간색난반사재질입히기 grid_axis_material_dif = vec3(1.0f, 0.0f, 0.0f); glvertexattrib3fv(grid_axis_diffuse, grid_axis_material_dif.pointer()); // gltranslatef() 를대체하는함수. grid_axis_modelview = mat4::translate(0.05f, 0.05f, 0.05f); [GLES20] 02. Android 3D Programming 을위한 Android 프로젝트설정 19

20 grid_axis_modelview = grid_axis_modelview * camera; gluniformmatrix4fv(m_simple.uniforms.modelview, 1, 0, grid_axis_modelview.pointer()); gldrawarrays(gl_lines, 0, 2); // Axis Y // 녹색난반사재질입히기 grid_axis_material_dif = vec3(0.0f, 1.0f, 0.0f); glvertexattrib3fv(grid_axis_diffuse, grid_axis_material_dif.pointer()); gldrawarrays(gl_lines, 2, 2); // Axis Z // 파란색난반사재질입히기 grid_axis_material_dif = vec3(0.0f, 0.0f, 1.0f); glvertexattrib3fv(grid_axis_diffuse, grid_axis_material_dif.pointer()); gldrawarrays(gl_lines, 4, 2); // GLES10 에있는 gldisableclientstate(gl_vertex_array) 를대체하는함수. gldisablevertexattribarray(m_simple.attributes.position); GLES20 용 RenderingEngine.ES2.cpp 와 GLES10 용 RenderingEngine.ES1.cpp 파일두개를비교해서보면, 양자간에 API 들의구성이어떻게변경되었는지이해하기편할것같습니다. 4. Shader Language 바른생활님이작성한 강좌플보면, EGLSL과달리 GLSL에서는 OpenGL 1.1 스펙에있는 API들과같이사용할수잇는것을볼수있습니다. 하지만, Embedded Graphic Library Shader Language 에서는임베디드용으로최적화되면, OpenGL 1.1 스펙에서 Shader 언어로처리할수있는 API 들에대해서는전부제거되었습니다. 이에대한스펙을이해하기위해서는앞장에서소개했던 OpenGL ES 2.0 Programming Guide 책을한번보시는것도좋습니다. 그런데이책에대한서평들을읽어보시면알겠지만, 너무않좋습니다. 저같은경우는원서로봤는데, 책이출판된시점이크로노스그룹에서 GLES2.0이만들어진지얼마되지않은시점에나와서그런지예제는아주많이부실하고왠지스펙문서를읽는듯한느낌이듭니다 ^^; [GLES20] 02. Android 3D Programming 을위한 Android 프로젝트설정 20

21 그래도한번쭉읽어보는것이도움이됨으로추천은합니다. ( 솔직히 OpenGL ES 2.0 관련된다른책이없어서추천할대체제가없습니다. 전돈주고샀지만인터넷에 PDF 파일이많음으로블랙마켓에서구해서보는것도... ㅠㅠ ) 각설하고,... 아래와같이배경화면그리는수준의 Shader 언어에서는별내용이없습니다. 이부분은바른생활님이설명하신 장과비교하시면서한번쭈욱보시면, 이해하실수있을겁니다. Simple.vert : Vertex Shader tatic const char* SimpleVertexShader = STRINGIFY( precision highp float; precision highp int; // Attributes attribute vec4 a_position;//position; attribute vec3 a_diffusematerial; uniform mat4 u_modelviewprojectionmatrix;//projection; uniform mat4 u_modelviewmatrix;//modelview; varying vec3 v_diffuse;//diffuse; void main(void) { v_diffuse = a_diffusematerial; gl_position = u_modelviewprojectionmatrix * u_modelviewmatrix * a_position; Simple.frag : Fragment Shader static const char* SimpleFragmentShader = STRINGIFY( varying lowp vec3 v_diffuse;//diffuse; void main(void) { gl_fragcolor = vec4(v_diffuse, 1.0); [GLES20] 02. Android 3D Programming 을위한 Android 프로젝트설정 21

22 이장은프로젝트설정부분임으로여기까지만소개하겠습니다. ^^; 다음장에서는 Model 에 Material 재질값을입히고색상을표현하는방법에대해서알아보도록하겠습니다. ( 솔직히이미아시는분들은알겠지만, 이글에서소개한정도만으로도 glcolor4f 를대체하는색상그리는방법은이해하실수있을 겁니다.) OGLES20 Template Application ported to mfc and android [GLES20] 02. Android 3D Programming 을위한 Android 프로젝트설정 22

23 [GLES20] 03. Color Shading :50 1. Color Shading 앞절에서간략하게설명한 RenderingEngine.ES2.cpp 에대해서좀더풀어서설명하도록하겠습니다. Classes/RenderingEngine.ES2.cpp 1. Create the GLSL program m_simple.program = BuildProgram(SimpleVertexShader, SimpleFragmentShader); BuildProgram 함수에서는 GLSL source 인 Vertex Shader text(simple.vert) 와 Fragment Shader text(simple.frag) 파일 을아래의 GLES 함수를이용해서컴파일합니다. Vertex Shader 생성 GLuint vertexshader= glcreateshader(gl_vertex_shader); glshadersource(vertexshader, 1, &source, 0); [GLES20] 03. Color Shading 23

24 glcompileshader(vertexshader); Fragment Shader 생성 GLuint fragmentshader= glcreateshader(gl_fragment_shader); glshadersource(fragmentshader, 1, &source, 0); glcompileshader(fragmentshader); Vertex Shader와 Fragment Shader 링크 GLuint programhandle = glcreateprogram(); glattachshader(programhandle, vertexshader); glattachshader(programhandle, fragmentshader); gllinkprogram(programhandle); 2. Program 선택 바탕화면이하나짜리를사용할경우에는아래와같이생성한 Program 한개를사용한다고 GLES 라이브러리에알립니다. gluseprogram(m_simple.program); 만약한개이상의 Program 을사용할경우에는필요할때마다 gluseprogram 을이용해서변경가능합니다. 이는 glpushmatrix()-glpopmatrix() 쌍으로묶여있는렌더러구성과유사하게응용할수있습니다. GLES10에서는바탕화면을그리고상자를그린다고하면다음과같이그릴수있다. glpushmatrix(); drawbackground(); glpopmatrix(); glpushmatrix(); drawcubebox(); glpopmatrix(); GLES20에서는 glpushmatrix()-glpopmatrix() 함수를지원하지않는다. gluseprogram(m_simple.program); drawbackground(); gluseprogram(m_cubebox.program); drawcubebox(); 와같이처리할수있다. [GLES20] 03. Color Shading 24

25 3. PROJECTION MATRIX m_simple.uniforms.projection = glgetuniformlocation(program, "u_modelviewprojectionmatrix"); m_simple.uniforms.projection = glgetuniformlocation(program, "u_projectionmatrix"); if (width > height) ratio = (GLfloat)width / (GLfloat)height; else ratio = (GLfloat)height / (GLfloat)width; mat4 projectionmatrix = mat4::perspective(45.0f, ratio, 1.0f, 100.0f); gluniformmatrix4fv(m_simple.uniforms.projection, 1, 0, projectionmatrix.pointer()); m_simple.uniforms.projection 은 glgetuniformlocation() 함수를이용해서 simple.vert 내에선언된 uniform mat4 u_projectionmatrix;//projection; 과연결되는 ID 를얻을수있습니다. 이 ID 에 Perspective, Frustum, Ortho 투영행렬을 gluniformmatrix4fv() 함수를이용해서저장합니다. 4. MODELVIEW MATRIX 4.1 CAMERA MATRIX /* Setting the camera */ vec3 eye(10, 10, 10); vec3 target(0, 0, 0); vec3 up(0, 1, 0); mat4 camera = mat4::lookat(eye, target, up); 틀릴수도있지만, 저는위의코드를아래와같이해석합니다. 카메라설정기능으로머리위인상향벡터 (up(0, 1,0 ) 로두었으며, 물체는원점 (target(0, 0, 0)) 으로설정되었고, 시점은 X, Y, Z 축으로 -10 만큼떨어져있다. 만약 3차원좌표계가아닌 2D 좌표계인 X-Y 기준으로보고싶다면, eye(0, 0, 10) 을하시면 X와 Y축만남게되고, Z축은시점에서정면이됩니다. [GLES20] 03. Color Shading 25

26 camera 행렬을 modelview 행렬에곱해서사용합니다. (camera 행렬은 Option으로서없어도 3D를표현할수있습니다. 하지만명확하게 3D를표현할때는 Camera 행렬을이용하는것이좋습니다.) camera에대해서는바른생활님기초강좌님다음페이지들을참고하십시요 VERTICES /* Draw Grid and Axis */ /* 20x20 의격자형바닥을그린다. */ GLfloat gridvertices[] = { -10.0f, 0.0f, 0.0f, 10.0f, 0.0f, 0.0f, 0.0f, 0.0f, -10.0f, 0.0f, 0.0f, 10.0f, ; /* X(Red)-Y(Green)-Z(Blue) 축을그린다. */ GLfloat axisvertices[] = { // x 0.0f, 0.0f, 0.0f, 6.0f, 0.0f, 0.0f, // y 0.0f, 0.0f, 0.0f, 0.0f, 4.0f, 0.0f, // z 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 6.0f, ; 20x20 격자형바닥을표현할 gridvertices 배열과 X-Y-Z 축을표현할 axisvertices 배열입니다. 이정점들은 simple.vert 내의 attribute vec4 a_position; 에값들을저장합니다. [GLES20] 03. Color Shading 26

27 m_simple.attributes.position = glgetattriblocation(program, "a_position"); m_simple.attributes.position 은 glgetattriblocation(program, "a_position"); 함수를이용해서 simple.vert 내에선언된 uniform mat4 attribute vec4 a_position; 과연결되는 ID 를얻을수있습니다. a_position 에정점값을저장할려면, glenablevertexattribarray() 과 glvertexattribpointer() 함수를이용합니다. 이함수는 GLES1.0 과비교하면다음과같습니다. GLES10 glenableclientstate(gl_vertex_array); gldisableclientstate(gl_vertex_array); glvertexpointer(3, GL_FLOAT, 0, gridvertices); GLES20 glenablevertexattribarray(m_simple.attributes.position) gldisablevertexattribarray(m_simple.attributes.position glvertexattribpointer(m_simple.attributes.position, 3, G GL_FALSE, 0, gridvertices); glvertexpointer(3, GL_FLOAT, 0, axisvertices); glvertexattribpointer(m_simple.attributes.position, 3, G GL_FALSE, 0, axisvertices); 4.3 MODELVIEW MATRIX // 배경화면 Shader 인 Simple shader 프로그램바인딩. gluseprogram(m_simple.program); // GLES10에있는 glenableclientstate(gl_vertex_array) 를대체하는함수. glenablevertexattribarray(m_simple.attributes.position); // Draw Grid. // Grid Vertices Buffer Array 등록 // GLES10에있는 glvertexpointer(3, GL_FLOAT, 0, gridvertices); glvertexattribpointer(m_simple.attributes.position, 3, GL_FLOAT, GL_FALSE, 0, gridvertices); gllinewidth(1.0f); GLint grid_axis_diffuse = m_simple.attributes.diffusematerial; // OGLES20에서는색을칠하는 Color Buffer Array 나 glcolor4f등의 API는지원하지않는다. // 이를대체하는방법으로 model에재질을입혀서색을표현해야한다. // diffuse material( 난반사재질 ) 색상을회색으로칠했다. [GLES20] 03. Color Shading 27

28 vec3 grid_axis_material_dif = vec3(0.5f, 0.5f, 0.5f); glvertexattrib3fv(grid_axis_diffuse, grid_axis_material_dif.pointer()); mat4 grid_axis_modelview; for (int i = -10; i <= 10; ++i) { grid_axis_modelview = mat4::translate(0, 0, (GLfloat)i); grid_axis_modelview = grid_axis_modelview * camera; gluniformmatrix4fv(m_simple.uniforms.modelview, 1, 0, grid_axis_modelview.pointer()); gldrawarrays(gl_lines, 0, 2); for (int i = -10; i <= 10; ++i) { grid_axis_modelview = mat4::translate((glfloat)i, 0, 0); grid_axis_modelview = grid_axis_modelview * camera; gluniformmatrix4fv(m_simple.uniforms.modelview, 1, 0, grid_axis_modelview.pointer()); gldrawarrays(gl_lines, 2, 2); // Draw Axis. // Axis Vertices Buffer Array 등록 // GLES10에있는 glvertexpointer(3, GL_FLOAT, 0, axisvertices); 를대체하는함수. glvertexattribpointer(m_simple.attributes.position, 3, GL_FLOAT, GL_FALSE, 0, axisvertices); gllinewidth(1.5f); // Axis X // 빨간색난반사재질입히기 grid_axis_material_dif = vec3(1.0f, 0.0f, 0.0f); glvertexattrib3fv(grid_axis_diffuse, grid_axis_material_dif.pointer()); // gltranslatef() 를대체하는함수. grid_axis_modelview = mat4::translate(0.05f, 0.05f, 0.05f); grid_axis_modelview = grid_axis_modelview * camera; gluniformmatrix4fv(m_simple.uniforms.modelview, 1, 0, grid_axis_modelview.pointer()); gldrawarrays(gl_lines, 0, 2); // Axis Y // 녹색난반사재질입히기 grid_axis_material_dif = vec3(0.0f, 1.0f, 0.0f); [GLES20] 03. Color Shading 28

29 glvertexattrib3fv(grid_axis_diffuse, grid_axis_material_dif.pointer()); gldrawarrays(gl_lines, 2, 2); // Axis Z // 파란색난반사재질입히기 grid_axis_material_dif = vec3(0.0f, 0.0f, 1.0f); glvertexattrib3fv(grid_axis_diffuse, grid_axis_material_dif.pointer()); gldrawarrays(gl_lines, 4, 2); // GLES10 에있는 gldisableclientstate(gl_vertex_array) 를대체하는함수. gldisablevertexattribarray(m_simple.attributes.position); 위에코드을이용해서 20x20 격자형바닥을그린후 X-Y-Z축을그립니다. 여기서색상 Color Shading 에대해서나옵니다. GLES10에서는물체에색상을입힐때, COLOR BUFFER ARRAY 또는 glcolor3f, glcolor4f 등을이용합니다. 하지만, GLES20에서는 glcolor를지원하지않습니다. 그럼으로위에서사용했던방법과같이 Position 정점을구하는방법과마찬가지로, Color에대해서 Attribute 로설정합니다. 저는난반사재질인 Diffuse material 로정하고회색 (0.5f, 0.5f, 0.5f) 을입혔습니다. ( 보통불투명색상을 diffuse 로정한다고합니다.) m_simple.attributes.diffusematerial = glgetattriblocation(program, "a_diffusematerial");... vec3 grid_axis_material_dif = vec3(0.5f, 0.5f, 0.5f); glvertexattrib3fv(grid_axis_diffuse, grid_axis_material_dif.pointer()); Color Shading 은다음과같이 vertex shader 인 simple.vert 에서는 a_diffusematerial 로받은색상값을 varying keyword 를이용해서 fragment shader 인 simple.frag 에전달합니다. simple.vert varying vec3 v_diffuse;//diffuse; void main(void) [GLES20] 03. Color Shading 29

30 { v_diffuse = a_diffusematerial; gl_position = u_modelviewprojectionmatrix * u_modelviewmatrix * a_position; varying keyword 로전달받은 v_diffuse 는 gl_fragcolor 에저장합니다. (gl_fragcolor 는 (r, g, b, a) 임으로 vec4 형태로변경해줘야합니다. 물론 varying 통해서전달받는값자체를 vec4 형으로받아와도됩니다.) simple.frag varying lowp vec3 v_diffuse;//diffuse; void main(void) { gl_fragcolor = vec4(v_diffuse, 1.0); 이장에서는간단하게 glcolor4f 를이용해서색상을입히는방법에대해서알아봤습니다. 색상에대한상세한정리는 Light 조명효과로유명한 Phong Shader 를다룰때설명하도록하겠습니다. OGLES20 Template Application ported to mfc and android [GLES20] 03. Color Shading 30

31 [GLES20] 03. Color Shading 31

32 [GLES20] 04. Geometry Transform :37 기하변환 이번장에서는 CubeBox 를뛰운후에이를확대, 회전, 이동시키는변환방법에대해서알아보도록하겠습니다. 1. 회전변환 GLES10 에서는모델에대해서회전변환을적용하기위해서 glrotatef() 함수를이용합니다. glrotatef(90.0f, 1.0f, 0.0f, 0.0f) : X 축을기준으로 90 도회전 glrotatef(90.0f, 0.0f, 1.0f, 0.0f) : Y 축을기준으로 90 도회전 glrotatef(90.0f, 0.0f, 0.0f, 1.0f) : Z 축을기준으로 90 도회전 하지만, GLES20 에서는 glrotatef() 함수를지원하지않습니다. 즉이를대체하는 Function Set 를직접만들어야합니다. 구현방법은예전에정리했었던, " 오일러회전 " 장에보시면기본원리가있습니다. ( 변환으로가는길 #2 : 오일러회전 ) [GLES20] 04. Geometry Transform 32

33 Utils/Matrix.hpp -. 오일러변환 X 축 static Matrix4<T> RotateX(T degrees) { T radians = degrees * f / 180.0f; T s = std::sin(radians); T c = std::cos(radians); Matrix4 m; m.x.x = 1; m.x.y = 0; m.x.z = 0; m.x.w = 0; m.y.x = 0; m.y.y = c; m.y.z =-s; m.y.w = 0; m.z.x = 0; m.z.y = s; m.z.z = c; m.z.w = 0; m.w.x = 0; m.w.y = 0; m.w.z = 0; m.w.w = 1; return m; -. 오일러변환 Y 축 static Matrix4<T> RotateY(T degrees) { T radians = degrees * f / 180.0f; T s = std::sin(radians); T c = std::cos(radians); Matrix4 m; m.x.x = c; m.x.y = 0; m.x.z = s; m.x.w = 0; m.y.x = 0; m.y.y = 1; m.y.z = 0; m.y.w = 0; m.z.x = -s; m.z.y = 0; m.z.z = c; m.z.w = 0; m.w.x = 0; m.w.y = 0; m.w.z = 0; m.w.w = 1; return m; -. 오일러변환 Z 축 static Matrix4<T> RotateZ(T degrees) { T radians = degrees * f / 180.0f; T s = std::sin(radians); [GLES20] 04. Geometry Transform 33

34 T c = std::cos(radians); Matrix4 m; m.x.x = c; m.x.y = -s; m.x.z = 0; m.x.w = 0; m.y.x = s; m.y.y = c; m.y.z = 0; m.y.w = 0; m.z.x = 0; m.z.y = 0; m.z.z = 1; m.z.w = 0; m.w.x = 0; m.w.y = 0; m.w.z = 0; m.w.w = 1; return m; 사용방법은다음과같습니다. X 축회전 void RenderingEngine::drawCubebox(int texturemode) { mat4 euler_x = mat4::rotatex(xrot); mat4 euler_y = mat4::rotatey(yrot); mat4 euler_z = mat4::rotatez(yrot); mat4 rotation = euler_x * m_orientation.tomatrix(); mat4 modelview = scale * rotation * translation; [GLES20] 04. Geometry Transform 34

35 Y 축회전 void RenderingEngine::drawCubebox(int texturemode) { mat4 euler_x = mat4::rotatex(xrot); mat4 euler_y = mat4::rotatey(yrot); mat4 euler_z = mat4::rotatez(yrot); mat4 rotation = euler_y * m_orientation.tomatrix(); mat4 modelview = scale * rotation * translation; [GLES20] 04. Geometry Transform 35

36 Z 축회전 void RenderingEngine::drawCubebox(int texturemode) { mat4 euler_x = mat4::rotatex(xrot); mat4 euler_y = mat4::rotatey(yrot); mat4 euler_z = mat4::rotatez(yrot); mat4 rotation = euler_z * m_orientation.tomatrix(); mat4 modelview = scale * rotation * translation; [GLES20] 04. Geometry Transform 36

37 2. 축척변환 GLES10 에서는모델에대해서축척변환을적용하기위해서 glscalef() 함수를이용합니다. 하지만, GLES20 에서는 glscalef() 함수를지원하지않습니다. 축척을변환하는방법은위의함수를사용하지않고도간단하게구현할수있습니다. 왜냐하면, 확대축소는수학적으로벡터량이아닌스칼라량이기때문에곱하기만하면됩니다. iphone 3D Programming 책에서제공하는모듈에서는이에대한함수를제공함으로이를이용하면됩니다. Utils/Matrix.hpp static Matrix4<T> Scale(T s) { Matrix4 m; m.x.x = s; m.x.y = 0; m.x.z = 0; m.x.w = 0; m.y.x = 0; m.y.y = s; m.y.z = 0; m.y.w = 0; [GLES20] 04. Geometry Transform 37

38 m.z.x = 0; m.z.y = 0; m.z.z = s; m.z.w = 0; m.w.x = 0; m.w.y = 0; m.w.z = 0; m.w.w = 1; return m; static Matrix4<T> Scale(T x, T y, T z) { Matrix4 m; m.x.x = x; m.x.y = 0; m.x.z = 0; m.x.w = 0; m.y.x = 0; m.y.y = y; m.y.z = 0; m.y.w = 0; m.z.x = 0; m.z.y = 0; m.z.z = z; m.z.w = 0; m.w.x = 0; m.w.y = 0; m.w.z = 0; m.w.w = 1; return m; 사용방법은다음과같습니다. void RenderingEngine::drawCubebox(int texturemode) { mat4 euler_x = mat4::rotatex(xrot); mat4 euler_y = mat4::rotatey(yrot); mat4 euler_z = mat4::rotatez(yrot); // mat4 scale = mat4::scale(1.0f); mat4 scale = mat4::scale(3.0f*cos(interpolation_z)); mat4 translation = mat4::translate(x, y, z); mat4 rotation = euler_x * m_orientation.tomatrix(); mat4 modelview = scale * rotation * translation; interpolation_z += (2*Pi) * f; 보간값을계산할때삼각함수인 cos을이용했습니다. cos에치역은 -1.0f ~ 1.0f 사이입니다. 위의 3.0f*cos(interpolation_z) 의경우, interpolation_z가 0에서부터시작함으로, cos(0) = 1 입니다. +3 ~ 0 ~ -3 ~ 0 ~ +3 의값을반복해서반환하게됩니다. 결국아래의동영상에서볼수있듯이 CubeBox 가원점을기준으로 +3 에큰크기에서시작했다가 원점으로수렴해가면서작아집니다. 이후 -3 에점점수렴해가기때문에그모양이뒤집혀서커지게됩니다. ((2*Pi) * f; 증가수치는 PowerVR SDK 내의보간증가수치를가져왔습니다. ^^;) [GLES20] 04. Geometry Transform 38

39 3. 이동변환 GLES10 에서는모델에대해서이동변환을적용하기위해서 gltranslatef() 함수를이용합니다. 하지만, GLES20 에서는 gltranslatef() 함수를지원하지않습니다. 이동변환의원리는 4x4 행렬상에서 4번째행에값을저장하면됩니다. 예를들어아래와같은회전행렬이있다고한다면, wx wy wz 1 wx, wy, wz 요소에이동변환값을저장한후 model matrix 에곱하면됩니다. 구현함수는다음과같습니다. [GLES20] 04. Geometry Transform 39

40 Utils/Matrix.hpp static Matrix4<T> Translate(T x, T y, T z) { Matrix4 m; m.x.x = 1; m.x.y = 0; m.x.z = 0; m.x.w = 0; m.y.x = 0; m.y.y = 1; m.y.z = 0; m.y.w = 0; m.z.x = 0; m.z.y = 0; m.z.z = 1; m.z.w = 0; m.w.x = x; m.w.y = y; m.w.z = z; m.w.w = 1; return m; 사용방법은다음과같습니다. void RenderingEngine::drawCubebox(int texturemode) { mat4 euler_x = mat4::rotatex(xrot); mat4 euler_y = mat4::rotatey(yrot); mat4 euler_z = mat4::rotatez(yrot); mat4 scale = mat4::scale(1.0f); // mat4 translation = mat4::translate(x, y, z); mat4 translation = mat4::translate(x, y, 15.0f*cos(interpolation_z)-7.5f); mat4 rotation = euler_x * m_orientation.tomatrix(); mat4 modelview = scale * rotation * translation; interpolation_z += (2*Pi) * f; 보간값은축척변환에적용했던삼각함수 cos을이용했습니다. cos에치역은 -1.0f ~ 1.0f 사이입니다. 15.0f*cos(interpolation_z)-7.5f 의경우, interpolation_z가 0에서부터시작함으로, cos(0) = 1 입니다 ~ -7.5 ~ 의값을반복해서반환하게됩니다. 특이사항은 cos(theta) 가 0 ~ -1 일경우, -7.5 에가중치를받기때문에, 아주약간 EaseOut 효과처럼가속를받게됩니다. ((2*Pi) * f; 증가수치는 PowerVR SDK 내의보간증가수치를가져왔습니다. ^^;) [GLES20] 04. Geometry Transform 40

41 4. vertex shader 내에서변환적용하기 이와같은변환의적용은 vertex shader 내에서적용해도됩니다. shader language 내에서처리할경우, 그연산처리를 GPU 에서하기때문에, CPU 에대한부하를줄일수있다고합니다. ( 저도실제측정해보지는않았습니다.) Shaders/SimpleLighting.vert // Attributes attribute vec4 a_position;//position; // Uniforms uniform mat4 u_projectionmatrix;//projection; uniform mat4 u_modelviewmatrix;//modelview; uniform mat3 u_normalmatrix;//normalmatrix; uniform float u_interpolation_z; varying vec3 v_eyespacenormal;//eyespacenormal varying vec3 v_diffuse;//diffuse; varying vec2 v_texturecoordout; [GLES20] 04. Geometry Transform 41

42 void main(void) { v_eyespacenormal = u_normalmatrix * a_normal; v_diffuse = a_diffusematerial; v_texturecoordout = a_texturecoordin; // Vertex Position vec4 newpos = vec4(a_position); mat4 translation = mat4(1.0); mat4 modelview = mat4(u_modelviewmatrix); translation[3][2] = (15.0*cos(u_interpolation_z) - 7.5); modelview *= translation; gl_position = u_projectionmatrix * modelview * newpos; translation[3][2] 는이동변환에서 Z 축을기준으로변환시키는요소입니다. [GLES20] 04. Geometry Transform 42

43 저는아직까지는 vertex shader 내에서논리연산을많이사용하지는않습니다. 튜닝적인요소가있을경우에는적용할가치가있을것같지만, 아직까지는 shader 코드내에서의 helper 함수를새로구성해야하는점과디버깅이불편하다는점때문에잘사용하지는않습니다. OGLES20 Template Application ported to mfc and android [GLES20] 04. Geometry Transform 43

44 [GLES20] 05. Vertex Position 처리 (1) :24 Vertex Shader 내에서 Vertex Position 조정 이번장에서는 Vertex shader 내에서정점위치를조정하는방법에대해서정리해보도록하겠습니다. 정리에앞서서 OpenGL GLSL 로만들어진바른생활님강좌를한번읽어보시면도움이될것같습니다 OpenGL ES 에서는 OpenGL 에서는지원하는즉시모드 (Immediate Mode) 형태의 glvertex3f() 를지원하지않습니다. 그럼으로당연히 GLSL 내에있는 gl_vertex 도지원하지않습니다. 정점을얻기위해서는 attribute keyword 형태로선언해서 OpenGL App( 이하본 App ^^) 에서정점값을얻어와야합니다. ( 나중에다루겠지만, Normal vector, Texture vector 값도 attribute 으로선언해서본 App 으로부터얻어옵니다.) 1. Cubebox 그리기 여기서구현한 Cubebox 는 GL_TRIANGLE_STRIP 으로구현하는방법으로정점을구성하는방법중하나일뿐입니다. 예를들어, vertices, normals, texcoords 배열을초기화시점에미리다설정해서구성해도됩니다. [GLES20] 05. Vertex Position 처리 (1) 44

45 GLfloat texcoords[4][2]; GLfloat vertices[4][3]; GLfloat normals[4][3]; GLubyte indices[4]={0, 1, 3, 2; /* QUAD to TRIANGLE_STRIP conversion; */ -- (0) gluseprogram(m_cubebox.program); // GLES10에있는 glenableclientstate(gl_vertex_array) 를대체하는함수. -- (1) glenablevertexattribarray(m_cubebox.attributes.position); glenablevertexattribarray(m_cubebox.attributes.normal); glenablevertexattribarray(m_cubebox.attributes.texturecoord); // GLES10에있는 glvertexpointer(3, GL_FLOAT, 0, gridvertices); (2) glvertexattrib3fv(diffuse, box_material_dif.pointer()); glvertexattribpointer(position, 3, GL_FLOAT, GL_FALSE, 0, vertices); glvertexattribpointer(normal, 3, GL_FLOAT, GL_FALSE, 0, normals); glvertexattribpointer(texcoord, 2, GL_FLOAT, GL_FALSE, 0, texcoords); /* Front Face */ (3) /* Normal Pointing Towards Viewer */ // 법선벡터를 Z축방향으로앞으로나오는면이므로, Z축열에 +1.0을넣는다. normals[0][0] = normals[1][0] = normals[2][0] = normals[3][0] = 0.0f; normals[0][1] = normals[1][1] = normals[2][1] = normals[3][1] = 0.0f; normals[0][2] = normals[1][2] = normals[2][2] = normals[3][2] = 1.0f; /* Point 1 (Front) */ texcoords[0][0] = 1.0f; texcoords[0][1] = 0.0f; vertices[0][0] = -1.0f; vertices[0][1] = -1.0f; vertices[0][2] = 1.0f; /* Point 2 (Front) */ texcoords[1][0] = 0.0f; texcoords[1][1] = 0.0f; vertices[1][0] = 1.0f; vertices[1][1] = -1.0; vertices[1][2] = 1.0f; /* Point 3 (Front) */ texcoords[2][0] = 0.0f; texcoords[2][1] = 1.0f; vertices[2][0] = 1.0f; vertices[2][1] = 1.0; vertices[2][2] = 1.0f; /* Point 4 (Front) */ texcoords[3][0] = 1.0f; texcoords[3][1] = 1.0f; vertices[3][0] = -1.0f; vertices[3][1] = 1.0; vertices[3][2] = 1.0f; [GLES20] 05. Vertex Position 처리 (1) 45

46 /* Blue Color */ (4) if (texturemode == 0) { box_material_dif = vec3(0.f, 0.f, 1.f) * 0.75f; glvertexattrib3fv(diffuse, box_material_dif.pointer()); /* Draw one textured plane using two stripped triangles */ (5) gldrawelements(gl_triangle_strip, 4, GL_UNSIGNED_BYTE, indices); /* Back Face */ (6) /* Normal Pointing Away From Viewer */ // 법선벡터를 Z축방향으로뒤로들어가는면이므로, Z축열에 -1.0을넣는다. normals[0][0] = normals[1][0] = normals[2][0] = normals[3][0] = 0.0f; normals[0][1] = normals[1][1] = normals[2][1] = normals[3][1] = 0.0f; normals[0][2] = normals[1][2] = normals[2][2] = normals[3][2] = -1.0f; /* Point 1 (Back) */ texcoords[0][0] = 0.0f; texcoords[0][1] = 0.0f; vertices[0][0] = -1.0f; vertices[0][1] = -1.0f; vertices[0][2] = -1.0f; /* Point 2 (Back) */ texcoords[1][0] = 0.0f; texcoords[1][1] = 1.0f; vertices[1][0] = -1.0f; vertices[1][1] = 1.0f; vertices[1][2] = -1.0f; /* Point 3 (Back) */ texcoords[2][0] = 1.0f; texcoords[2][1] = 1.0f; vertices[2][0] = 1.0f; vertices[2][1] = 1.0f; vertices[2][2] = -1.0f; /* Point 4 (Back) */ texcoords[3][0] = 1.0f; texcoords[3][1] = 0.0f; vertices[3][0] = 1.0f; vertices[3][1] = -1.0; vertices[3][2] = -1.0f; /* Black Color */ if (texturemode == 0) { box_material_dif = vec3(0.f, 0.f, 0.f) * 0.75f; glvertexattrib3fv(diffuse, box_material_dif.pointer()); /* Draw one textured plane using two stripped triangles */ gldrawelements(gl_triangle_strip, 4, GL_UNSIGNED_BYTE, indices); [GLES20] 05. Vertex Position 처리 (1) 46

47 /* Top Face */ (7) /* Normal Pointing Up */ // 법선벡터를 Y축방향으로위로올라가는면이므로, Y축열에 +1.0을넣는다. normals[0][0] = normals[1][0] = normals[2][0] = normals[3][0] = 0.0f; normals[0][1] = normals[1][1] = normals[2][1] = normals[3][1] = 1.0f; normals[0][2] = normals[1][2] = normals[2][2] = normals[3][2] = 0.0f; /* Point 1 (Top) */ texcoords[0][0] = 1.0f; texcoords[0][1] = 1.0f; vertices[0][0] = -1.0f; vertices[0][1] = 1.0f; vertices[0][2] = -1.0f; /* Point 2 (Top) */ texcoords[1][0] = 1.0f; texcoords[1][1] = 0.0f; vertices[1][0] = -1.0f; vertices[1][1] = 1.0f; vertices[1][2] = 1.0f; /* Point 3 (Top) */ texcoords[2][0] = 0.0f; texcoords[2][1] = 0.0f; vertices[2][0] = 1.0f; vertices[2][1] = 1.0f; vertices[2][2] = 1.0f; /* Point 4 (Top) */ texcoords[3][0] = 0.0f; texcoords[3][1] = 1.0f; vertices[3][0] = 1.0f; vertices[3][1] = 1.0f; vertices[3][2] = -1.0f; /* Green Color */ if (texturemode == 0) { box_material_dif = vec3(0.f, 1.f, 0.f) * 0.75f; glvertexattrib3fv(diffuse, box_material_dif.pointer()); /* Draw one textured plane using two stripped triangles */ gldrawelements(gl_triangle_strip, 4, GL_UNSIGNED_BYTE, indices); /* Bottom Face */ (8) /* Normal Pointing Down */ // 법선벡터를 Y축방향으로위로올라가는면이므로, Y축열에 -1.0을넣는다. normals[0][0] = normals[1][0] = normals[2][0] = normals[3][0] = 0.0f; normals[0][1] = normals[1][1] = normals[2][1] = normals[3][1] = -1.0f; normals[0][2] = normals[1][2] = normals[2][2] = normals[3][2] = 0.0f; /* Point 1 (Bottom) */ texcoords[0][0] = 0.0f; texcoords[0][1] = 1.0f; vertices[0][0] = -1.0f; vertices[0][1] = -1.0f; vertices[0][2] = -1.0f; [GLES20] 05. Vertex Position 처리 (1) 47

48 /* Point 2 (Bottom) */ texcoords[1][0] = 1.0f; texcoords[1][1] = 1.0f; vertices[1][0] = 1.0f; vertices[1][1] = -1.0f; vertices[1][2] = -1.0f; /* Point 3 (Bottom) */ texcoords[2][0] = 1.0f; texcoords[2][1] = 0.0f; vertices[2][0] = 1.0f; vertices[2][1] = -1.0f; vertices[2][2] = 1.0f; /* Point 4 (Bottom) */ texcoords[3][0] = 0.0f; texcoords[3][1] = 0.0f; vertices[3][0] = -1.0f; vertices[3][1] = -1.0f; vertices[3][2] = 1.0f; /* Yellow Color */ if (texturemode == 0) { box_material_dif = vec3(0.8f, 0.8f, 0.f) * 0.75f; glvertexattrib3fv(diffuse, box_material_dif.pointer()); /* Draw one textured plane using two stripped triangles */ gldrawelements(gl_triangle_strip, 4, GL_UNSIGNED_BYTE, indices); /* Right face */ (9) /* Normal Pointing Right */ // 법선벡터를 X축방향으로오른쪽으로이동하는면이므로, X축열에 +1.0을넣는다. normals[0][0] = normals[1][0] = normals[2][0] = normals[3][0] = 1.0f; normals[0][1] = normals[1][1] = normals[2][1] = normals[3][1] = 0.0f; normals[0][2] = normals[1][2] = normals[2][2] = normals[3][2] = 0.0f; /* Point 1 (Right) */ texcoords[0][0] = 0.0f; texcoords[0][1] = 0.0f; vertices[0][0] = 1.0f; vertices[0][1] = -1.0f; vertices[0][2] = -1.0f; /* Point 2 (Right) */ texcoords[1][0] = 0.0f; texcoords[1][1] = 1.0f; vertices[1][0] = 1.0f; vertices[1][1] = 1.0f; vertices[1][2] = -1.0f; /* Point 3 (Right) */ texcoords[2][0] = 1.0f; texcoords[2][1] = 1.0f; vertices[2][0] = 1.0f; vertices[2][1] = 1.0f; vertices[2][2] = 1.0f; /* Point 4 (Right) */ texcoords[3][0] = 1.0f; texcoords[3][1] = 0.0f; vertices[3][0] = 1.0f; vertices[3][1] = -1.0f; vertices[3][2] = 1.0f; [GLES20] 05. Vertex Position 처리 (1) 48

49 /* Red Color */ if (texturemode == 0) { box_material_dif = vec3(1.0f, 0.f, 0.f) * 0.75f; glvertexattrib3fv(diffuse, box_material_dif.pointer()); /* Draw one textured plane using two stripped triangles */ gldrawelements(gl_triangle_strip, 4, GL_UNSIGNED_BYTE, indices); /* Left Face*/ (10) /* Normal Pointing Left */ // 법선벡터를 X축방향으로왼쪽으로이동하는면이므로, X축열에 -1.0을넣는다. normals[0][0] = normals[1][0] = normals[2][0] = normals[3][0] = -1.0f; normals[0][1] = normals[1][1] = normals[2][1] = normals[3][1] = 0.0f; normals[0][2] = normals[1][2] = normals[2][2] = normals[3][2] = 0.0f; /* Point 1 (Left) */ texcoords[0][0] = 1.0f; texcoords[0][1] = 0.0f; vertices[0][0] = -1.0f; vertices[0][1] = -1.0f; vertices[0][2] = -1.0f; /* Point 2 (Left) */ texcoords[1][0] = 0.0f; texcoords[1][1] = 0.0f; vertices[1][0] = -1.0f; vertices[1][1] = -1.0f; vertices[1][2] = 1.0f; /* Point 3 (Left) */ texcoords[2][0] = 0.0f; texcoords[2][1] = 1.0f; vertices[2][0] = -1.0f; vertices[2][1] = 1.0f; vertices[2][2] = 1.0f; /* Point 4 (Left) */ texcoords[3][0] = 1.0f; texcoords[3][1] = 1.0f; vertices[3][0] = -1.0f; vertices[3][1] = 1.0f; vertices[3][2] = -1.0f; /* White Color */ if (texturemode == 0) { box_material_dif = vec3(1.f, 1.f, 1.f) * 0.75f; glvertexattrib3fv(diffuse, box_material_dif.pointer()); /* Draw one textured plane using two stripped triangles */ gldrawelements(gl_triangle_strip, 4, GL_UNSIGNED_BYTE, indices); // GLES10 에있는 gldisableclientstate(gl_vertex_array) 를대체하는함수. -- (11) gldisablevertexattribarray(position); [GLES20] 05. Vertex Position 처리 (1) 49

50 gldisablevertexattribarray(normal); gldisablevertexattribarray(texcoord); (0) : 사각형을 gldrawarrays 가아닌 gldrawelements 로그리기위한 indices 순서입니다. (1) : glenablevertexattribarray() 는 vertex shader 에선언된 attribute keyword 를활성화합니다. 이는 GLES10 의 glenableclientstate() 를대체합니다. (2) : glvertexattribpointer() 를이용해서 vertex shader에선언된 attribte keyword 벡터변수에정정, 법선또는텍셀정보를저장합니다. 이는 GLES10의 glvertexpointer(), glnormalpointer(), gltexcoordpointer() 를대체합니다. 이는 OpenGL의 glvertex3f(), glnormal3f(), gltexcoord3f() 를대체합니다. (3) : Front Face 즉앞부분사각면을그리는부분입니다. 파란색으로칠하고있으며, 아직 normals 와 texcoords 는사용하지는않습니다. (4) : 파란색으로칠하기위해서본 App 에서 vertex shader 로접근하는부분입니다. 정점당색상값인 Color Buffer Array 을대체하는부분니다. (5) : (0) 에서설정한색인값인 indices 순서로사각형을그립니다. (6) : Back Face 즉뒷부분사각면을그리는부분입니다. 검정색으로칠하고있으며, 아직 normals 와 texcoords 는사용하지는않습니다. (7) : Top Face 즉윗부분사각면을그리는부분입니다. 녹색으로칠하고있으며, 아직 normals 와 texcoords 는사용하지는않습니다. (8) : Bottom Face 즉아랫부분사각면을그리는부분입니다. 노란색으로칠하고있으며, 아직 normals 와 texcoords 는사용하지는않습니다. (9) : Right Face 즉우측부분사각면을그리는부분입니다. 빨간색으로칠하고있으며, 아직 normals 와 texcoords 는사용하지는않습니다. (10) : Left Face 즉뒷좌측부분사격면을그리는부분입니다. 흰색으로칠하고있으며, 아직 normals 와 texcoords 는사용하지는않습니다. [GLES20] 05. Vertex Position 처리 (1) 50

51 (11) : (1) 에서활성화한정점, 법선, 텍셀을비활성화합니다. 이는 GLES10 의 gldisableclientstate() 를대체합니다. 결과는다음과같습니다. 2. Vertex Position Vertex shader 는본 App 으로부터 Position 정점정보를 a_position 으로전달받게됩니다. attribute 와 uniform 으로선언된변수들은 shader 내에서는 constant( 상수?) 로동작합니다. 즉 shader 내에서는 data 를읽기 (read) 는가능하지만쓰기 (write) 를할수는없습니다. 그럼으로 vertex 위치를임의로변경하기위해서는다음과같이 vec4 newpos 변수를만들어주고이에저장합니다. /Shaders/SimpleLighting.vert // Vertex Position vec4 newpos = vec4(a_position); newpos.z = newpos.z + sin(2.0 * newpos.x); gl_position = u_projectionmatrix * u_modelviewmatrix* newpos; [GLES20] 05. Vertex Position 처리 (1) 51

52 3. 결론 Cubebox 의정점이변경하기전과약간변화된것을볼수있습니다. 변형시키는 sin 함수내의가중치값 2.0 을더크게하면변화가눈에 " 뛰게보이지만, 주전자만큼크게찌그러지지는않습니다. newpos.z = newpos.z + sin(2.0 * newpos.x); 이는상자의경우정점의갯수가많지않아서그런것으로보입니다. 바른생활님예제 ( 와같이주전자로그림을그리면, 얼추비슷한결과가나올겁니다. 그런데, OpenGL ES 에서는 glut lib 를지원하지않기때문에, OpenGL 과같이 glutsolidteapot() 함수를통해서쉽게주전자를그릴수는없습니다. ㅠㅠ 다음장에서는주전자를그리기위해서 wavefront obj 파일을 header 로추출한파일을이용해서, 주전자를그리고 Vertex Position 보간값을적용해보도록하겠습니다. (wavefront obj 파일은 3DMax 나 Blender 와같은 3D 그래픽도구를이용해서그린후 export 를 obj 형태로하면됩니다. ^^;) [GLES20] 05. Vertex Position 처리 (1) 52

53 [GLES20] 06. Vertex Position 처리 - Obj 와 VBO (2) : : teapot을그릴때, normal 값에대한 offset이빠져있었습니다. ^^; Wireframe 형태일때는잘못느껴지겠지만, 면으로그려보면느껴지네요. 참고하십시요. ( 이전에 Render To Texture 로그릴때뺀이후로계속빠져있었던듯싶네요ㅎㅎ ) Vertex Shader 내에서 Vertex Position 조정 앞장에이어서이번장에서는 Wavefront Obj 포맷으로구성된 Obj 파일에서 mesh data 를추출한후, 이를 Vertex Buffer Object 형으로구성한뒤, Wireframe 형식의주전자 (Teapot) 를그려보도록하겠습니다. 그리고이 OpenGL App( 이하본 App) 의결과를 Vertex Shader 내에서 Vertex Position 을조정해보겠습니다. 1. Wavefront Obj mesh data 주전자 Teapot 를그리는방법은구글링하면많이나옵니다. 예를들어, 애플에서발표한 WWDC 2010 에서발표했던 CorMotionTeapot 를참조해도되고, [GLES20] 06. Vertex Position 처리 - Obj 와 VBO (2) 53

54 Wavefront Obj 모델파일을구해서, header 로변환해서이용해도됩니다. Obj 스펙은구글링하면손쉽게얻을수있으며, iphone3d Programming 책의 4 장에도설명은나와있습니다. 그런데, iphone3d Programming 책의경우 OBJ 파일포맷이 3dsMax 나 Blender 와는다른형태의 mesh 구조입니다. 작명에도나와있지만, Insanely Simple ObJ File( 직역하면, " 제정신이아니게간단한 OBJ File) - ㅁ -; 입니다. 또한 vertex 와면만을구하고 normal 과 texture coordinate 은고려하지않고만들어진파서입니다. 책에서는 normal 값을 Triangle 를구성하는 3 개의정점이한개의면을이루게됩니다. 같은평면상에있는두개의벡터의외적을구하면법선을계산할수있습니다. 즉, 면을구성하는 3 개의정점이 a, b, c 라고한다면, N = (b - a).cross(c - a) 가됩니다. [GLES20] 06. Vertex Position 처리 - Obj 와 VBO (2) 54

55 혹이책을보시고 Obj 포맷파싱을책과같이하면되겠구나오해하시면안되며, Example 4.23 과같이 f(face) 값같이숫자사이에 '/' 으로구분자를인식하게금만드셔야합니다. 3ds Max 나 Blender 로만든 Obj 파일은 Example 4.23 과같은포맷을얻을수있습니다. 그럼으로이책에서소개하는 OBJ 파서는이런포맷도있다고이해하시고다른파서를구하시는것이좋습니다. 저는다음과같이 prebuilt header로이미파싱된데이타를이용합니다. obj2opengl 이라고 perl script 형태이며, 손쉽게헤더파일을생성해줍니다. (Material 까지파싱은하지못하기때문에, 이값은수작업으로설정해야합니다. ^^;) 주전자하나그리는데너무삼천포로빠져버렸네요ㅠㅠ 그만큼 Opengl es 는 opengl 보다뭔가를그리기가쉽지가않습니다. 자기만의 utility function 등을구현해서 Module 화해놓는것이좋습니다. 그럼다시 Teapot 주전자그리기로돌아가도록하겠습니다. [GLES20] 06. Vertex Position 처리 - Obj 와 VBO (2) 55

56 Mesh data 는정점 (teapot2verts) 과법선정보 (teapot2normals) 두가지만담겨있습니다.( 텍스쳐정보는없음 ) Models/teapot2.h /* (1) created with obj2opengl.pl source file :./teapot2.obj vertices : 3644 faces : 6320 normals : 5995 texture coords : 0 // include generated arrays #import! "./teapot2.h" // set input data to arrays glvertexpointer(3f, GL_FLOAT, 0, teapot2verts); glnormalpointer(gl_float, 0, teapot2normals); // draw data gldrawarrays(gl_triangles, 0, teapot2numverts); */ unsigned int teapot2numverts = 18960; // (2) float teapot2verts [] = { // (3) // f 2909//1 2921//1 2939// f, f, f, f, f, f, f, f, e-05f,... ; float teapot2normals [] = { // (4) // f 2909//1 2921//1 2939// f, f, f, f, f, f, f, f, f,... [GLES20] 06. Vertex Position 처리 - Obj 와 VBO (2) 56

57 ; (1) : obj2opengl.pl 스크립트를이용해서생성된 Obj 파일에대한정보입니다. GLES 1.0 에서사용하는 Example 을보여줍니다. (2) : 주전자의정점갯수를나타냅니다. teapot2numverts (18960) 이값은면의갯수가 6320 개임으로, 한개의면당 3 개의정점이있기때문에 개가됩니다. (3) : 주전자정점의위치입니다. = teapot2verts 배열정보는 1차원배열이지만, 한줄당면한개를표현하는데필요한정점 3개를나타냅니다. 그럼으로, 면의갯수가 6320임으로전체줄수는 6320줄이며한줄당 3개의정점을포함하고있기때문에, 요소가있습니다. 이는일차원배열로는 [18960] 이며이차원배열로는 [6320][3] 으로정의할수있습니다. 아래의정보는 (1) 번의 "obj2opengl.pl" 로생성한정점좌표입니다. // f 2909//1 2921//1 2939// f, f, f, f, f, f, f, f, e-05f, 간단하게살펴보면, "// f v/vt/vn" 한개의면을구성하는데필요한 vertex/texture/normal 정보를나타냅니다. 예를들어 "//f 2909//1" 값을보면 teapot2.obj 에는 texture 정보는없다는것을알수있습니다 : 면을표현하는데필요한 vertices 정보는 2909번째줄에있는면정점 VOID : slash 사이에 0을채우는게아니라비워둡니다. 1 : 면을표현하는데필요한 normal 정보는 1번째줄에있는면의법선을나타냅니다. 다시 teapot2.h 를보면 teapot2verts 의경우, 첫째줄의정점 x, y, z 정보는 teapot2.obj 의 2909 번째줄의정점값을나타내야합니다. 그런데, teapot2.obj 의 2909 줄의 vertex 정보는 "v " 으로그값이다릅니다. 이는 obj2opengl.pl 스크립트를만드신분의정점에대한정보를최적화? 시키면서변경된사항입니다. 대략적인알고리즘은각각의정점 x, y, z 중중간값 center(x, y, z) 정보를구하고, scale factor 값을 x, y, z 정점중각각의차중가장큰값을 1로나눠서정규화 scale factor를구합니다. 이 center 정보와 scalefac에의해서계산되었기때문에다른겁니다. teapot2.obj 나위의 obj2opengl.pl 패키지에포함된 banana.obj 는정점이많은모델이기때문에이해가어려울수있습니다. [GLES20] 06. Vertex Position 처리 - Obj 와 VBO (2) 57

58 obj2opengl.pl 패키지내에같이포함된 cube.obj와이를컨버팅한 cube.h를비교해서보시면좀더쉽게해석할수있을것같습니다. cubeverts[] = { // f 1//2 7//2 5//2-0.5, -0.5, -0.5, 0.5, 0.5, -0.5, 0.5, -0.5, -0.5, ; cube.obj v v v v v v v v Cube의경우, 정점의 range는 0 ~ 1.0 임으로 center(x, y, z) 는 (0.5, 0.5, 0.5) 입니다. scale factor는 xmax - min = xdiff 가 1임으로 1.0 / 1.0이되서 1.0입니다. (x_token - center.x) / 1.0 = ( ) / 1.0 = -0.5 (y_token - center.y) / 1.0 = ( ) / 1.0 = -0.5 (z_token - center.z) / 1.0 = ( ) / 1.0 = -0.5 첫번째줄의값이됩니다. 일곱번째줄의 face 값은 x(1.0), y(1.0), z(0.0) 임으로컨버팅값은 vx(0.5), vy(0.5), vz(-0.5) 가됩니다. 다섯번째줄의 face 값은 x(1.0), y(0.0), z(0.0) 임으로컨버팅값은 vx(0.5), vy(-0.5), vz(-0.5) 가됩니다. (4) : 주전자법선정보입니다. = teapot2normals 앞의 (3) 정점정보와같은방식으로계산할수있습니다. // f 2909//1 2921//1 2939// f, f, f, f, f, f, f, f, f, 엄하게 Vertex Position 을다룰려고했는데 Obj Parser 를다루게되어버렸네요 - ㅁ -; [GLES20] 06. Vertex Position 처리 - Obj 와 VBO (2) 58

59 책수준에서공부할때는이부분을넘겨도되지만, 차후상용프로젝트을진행할경우에는 3D 디자이너와협업을하게되는데, 이때 3D 디자이너는 3ds Max( 유료 ) 나 Blender( 무료 ) 툴을이용해서 Model 을그려서 Obj 포맷으로배포할수있습니다. 그럼으로 Obj spec( 을읽어보시고직접 Uitility module 을개발하시는것도좋 은공부가될수있습니다. 다음에 Texture 장을다룰때는텍스쳐정보가같이있는 Obj 파일인 banana.obj 와 banana.jpg 을다뤄보도록하겠습니다. 2. Vertex Buffer Object 앞절에서모델을 header로변환하는방법에대해서설명하였습니다. 이번절은주전자정보를 stl의 vector 클래스에보관한후이를 VBO에저장하는방법에대해서다루겠습니다. iphone 3D Programming 예제중 ModelViewer.ObjViewer 프로젝트가있습니다. ISurface interface를상속받아서 ObjSurface라는모듈을구현하고있습니다. 앞절에서소개했었던 Example 4.22 Insanely Simple Obj 파일로부터데이타를추출하고, vertices 정보를저장하고 normals 값은계산해서저장하고있습니다. 저는이파서를사용하지않고다음과같은 ObjSurfaceFromData 모듈을만들어서사용합니다. Utils/ObjSurfaceFromData.cpp 이모듈은 Obj 파일로부터추출한 vertices, textures, normals 의정보를 stl 의 vector 클래스를이용해서저장합니다. 특이사항은 obj2opengl.pl 이 indices 색인정보를이용해서삼각형을그리는 gldrawelements() 방식이아닌, 정점으로삼각형을그리는 gldrawarrays() 방식임으로 indices 정보는저장하지않습니다. ObjSurfaceFromData(int numverts, float* vertices, float* normals); 정점과법선정보한묶음 (stride) 으로만들어서 stl 의 vector 클래스에저장합니다. vertices(x, y, z) 와 normal(x, y, z) 임으로 stride 는 float 형으로 6 개가배치됩니다. ObjSurfaceFromData(int numverts, float* vertices, float* normals, float* texcoords); 정점, 법선그리고텍스쳐정보를한묵음 (stride) 으로만들어서 stl 의 vector 클래스에저장합니다. vertices(x, y, z), normal(x, y, z), texcoords(s, t) 임으로 stride 는 float 형으로 8 개가배치됩니다. void GenerateVertices(vector<float>& vertices, unsigned char flags) const; [GLES20] 06. Vertex Position 처리 - Obj 와 VBO (2) 59

60 저장된정점 (x, y, z), 법선 (x, y, z), 텍스쳐 (s, t) 정보를포함하는 vector 클래스의포인터를반환합니다. Vertex Buffer Object로 Data를옮기기위해서는 CreateDrawable() 함수를이용합니다. VBO에대해서는 iphone 3D Programming 책의 "3장정점과터치점, 3-3 정점버퍼객체를사용하여성능향상시키기 " 장에서설명이되어있으며, 바른생활님이정리하신다음포스트도읽어보시면도움이될것같습니다. // Create the VBO for the vertices (1) struct Drawable { GLuint VertexBuffer; GLuint IndexBuffer; int IndexCount; int VertexCount; int Flags; ; // Create the VBO for the vertices (2) struct Drawables { Drawable teapot; // ; void RenderingEngine::Initialize(int width, int height) { // Create the teapot drawable (3) int flags = VertexFlagsNormals;//VertexFlagsNormals VertexFlagsTexCoords; m_drawables.teapot = CreateDrawable(ObjSurfaceFromData(teapot2NumVerts, teapot2verts, teapot2normals), flags);... Drawable RenderingEngine::CreateDrawable(const ObjSurfaceFromData& surface, int flags) { // Create the VBO for the vertices (4) vector<float> vertices; surface.generatevertices(vertices, flags); GLuint vertexbuffer; [GLES20] 06. Vertex Position 처리 - Obj 와 VBO (2) 60

61 glgenbuffers(1, &vertexbuffer); glbindbuffer(gl_array_buffer, vertexbuffer); glbufferdata(gl_array_buffer, vertices.size() * sizeof(vertices[0]), &vertices[0], GL_STATIC_DRAW); // Create a new VBO for the indices if needed (5) int vertexcount = surface.getvertexcount(); int indexcount = surface.gettriangleindexcount(); GLuint indexbuffer; // 인덱스는사용하지않도록예외처리 (6) if (indexcount < 0) { indexbuffer = 0; indexcount = -1; else { // 이아래부분은이장에서는사용되지않는처리임 (7) vector<glushort> indices(indexcount); surface.generatetriangleindices(indices); glgenbuffers(1, &indexbuffer); glbindbuffer(gl_element_array_buffer, indexbuffer); glbufferdata(gl_element_array_buffer, indexcount * sizeof(glushort), &indices[0], GL_STATIC_DRAW); // Fill in the data into the drawable structure (8) Drawable drawable = {0; drawable.vertexbuffer = vertexbuffer; drawable.indexbuffer = indexbuffer; drawable.vertexcount = vertexcount; drawable.indexcount = indexcount; drawable.flags = flags; // GL_ARRAY_BUFFER 에 binding 했던것을해제하자 (9) glbindbuffer(gl_array_buffer, 0); [GLES20] 06. Vertex Position 처리 - Obj 와 VBO (2) 61

62 return drawable; (1) : Drawable 구조체입니다. VBO 로생성한 VertexBuffer ID, IndexBuffer ID, Index 갯수, Vertex 갯수, 그리고 Buffer 에저장된데이타가 Normal 이포함되어있는지 TexCoord 가포함되어있는지알려주는 Flag 값이있습니다. (2) : 여러개의 Drawable 포함하는 Drawables 구조체입니다. 현재는 teapot 하나이지만, 여러개의모델이있을경우여기에추가할예정입니다. (3) : teapot drawable를생성하는 CreateDrawable() 함수를호출합니다. 이함수는 Vertex Buffer ID, Index Buffer ID 등이포함된 Drawable 객체를반환해줍니다. 또한 ObjSurfaceFromData가 ISurface를상속받기때문에, 추후에 iphone 3D Programming에서이용하는 Parametric Surface 형으로만든기하구조와호환가능합니다. (Parametric Surface는매개변수방정식을이용해서만든 Geometry Sample( 구, 원뿔, 뫼비우스띠등 ) 입니다.) (4) : 정점정보를저장하는 VBO 을생성합니다. (5) : Vertex 의갯수를반환합니다. Index 의갯수는 Parametric Surface 에서이용되며, 여기서는 gldrawarrays() 로그리기때문에사용되지않습니다. (6) : IndexBuffer 와 IndexCount 를사용하지않는값으로설정합니다. (7) : VBO 의 Index Buffer 를등록하는부분입니다. gldrawelements() 로그릴때필요합니다. 주전자를그릴때는사용하지않습니다. 나중에 Parametric Surface 를이용해서기하구조를그릴때사용할예정입니다. (8) : Drawable 구조체에 VBO 로생성한 ID, Vertex count 등을저장합니다. [GLES20] 06. Vertex Position 처리 - Obj 와 VBO (2) 62

PowerPoint 프레젠테이션

PowerPoint 프레젠테이션 03 모델변환과시점변환 01 기하변환 02 계층구조 Modeling 03 Camera 시점변환 기하변환 (Geometric Transformation) 1. 이동 (Translation) 2. 회전 (Rotation) 3. 크기조절 (Scale) 4. 전단 (Shear) 5. 복합변환 6. 반사변환 7. 구조변형변환 2 기하변환 (Geometric Transformation)

More information

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

Łø·ŸÕ=¤ ¬ ÇX±xÒ¸ 06 - Èpº– 1 그래픽스강의노트 06 - 조명 1 강영민 동명대학교 2015 년 2 학기 강영민 ( 동명대학교 ) 3D 그래픽스프로그래밍 2015 년 2 학기 1 / 25 음영 계산의 필요성 음영(陰影) 계산, 혹은 셰이딩(shading)은 어떤 물체의 표면에서 어두운 부분과 밝은 부분을 서로 다른 밝기로 그려내는 것 모든 면을 동일한 색으로 그리면 입체감이 없다. 2 /

More information

Microsoft PowerPoint - lecture15-ch6.ppt

Microsoft PowerPoint - lecture15-ch6.ppt Lighting OpenGL Lighting OpenGL의조명에는 3가지요소가필요 광원 (Lights) 재질 (Materials) 면의법선벡터 (Normals) 321190 2008년봄학기 5/26/2007 박경신 OpenGL Lighting OpenGL Lighting OpenGL에서제공하는조명모델 환경광 / 주변광 (ambient lights) 점광원 (point

More information

Microsoft PowerPoint - 13prac.pptx

Microsoft PowerPoint - 13prac.pptx Viewing 1 th Week, 29 OpenGL Viewing Functions glulookat() Defining a viewing matrix glortho() Creating a matrix for an orthographic parallel viewing i volume glfrustum() Creating a matrix for a perspective-view

More information

Microsoft PowerPoint - lecture16-ch6

Microsoft PowerPoint - lecture16-ch6 Lighting OpenGL Lighting OpenGL의조명에는 3가지요소가필요 광원 (Lights) 재질 (Materials) 면의법선벡터 (Normals) 321190 2007년봄학기 5/15/2007 박경신 OpenGL Lighting OpenGL Lighting OpenGL에서제공하는조명모델 환경광 / 주변광 (ambient lights) 점광원 (point

More information

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

Microsoft PowerPoint - lecture3-ch2.ppt [호환 모드] Coordinate Systems Graphics Programming 321190 2014 년봄학기 3/14/2014 박경신 2D Cartesian Coordinate Systems 3D Cartesian Coordinate Systems Cartesian Coordination Systems -x +y y-axis x-axis +x Two axes: x-axis

More information

04_오픈지엘API.key

04_오픈지엘API.key 4. API. API. API..,.. 1 ,, ISO/IEC JTC1/SC24, Working Group ISO " (Architecture) " (API, Application Program Interface) " (Metafile and Interface) " (Language Binding) " (Validation Testing and Registration)"

More information

Microsoft PowerPoint - lecture11-ch4

Microsoft PowerPoint - lecture11-ch4 Geometric Objects and Transformation 321190 2007 년봄학기 4/17/2007 박경신 OpenGL Transformation OpenGL 은기본적인변환을수행하는함수를제공한다. Translation: 이동변환은 3 차원이동변위벡터 (dx, dy, dz) 를넣는다. Rotation: 회전변환은 axis( 회전축 ) 와 angle(

More information

<322EBCF8C8AF28BFACBDC0B9AEC1A6292E687770>

<322EBCF8C8AF28BFACBDC0B9AEC1A6292E687770> 연습문제해답 5 4 3 2 1 0 함수의반환값 =15 5 4 3 2 1 0 함수의반환값 =95 10 7 4 1-2 함수의반환값 =3 1 2 3 4 5 연습문제해답 1. C 언어에서의배열에대하여다음중맞는것은? (1) 3차원이상의배열은불가능하다. (2) 배열의이름은포인터와같은역할을한다. (3) 배열의인덱스는 1에서부터시작한다. (4) 선언한다음, 실행도중에배열의크기를변경하는것이가능하다.

More information

Microsoft PowerPoint - lecture11-ch4.ppt

Microsoft PowerPoint - lecture11-ch4.ppt Geometric Objects and Transformation 321190 2007 년봄학기 4/17/2007 박경신 OpenGL Transformation OpenGL 은기본적인변환을수행하는함수를제공한다. Translation: 이동변환은 3 차원이동변위벡터 (dx, dy, dz) 를넣는다. Rotation: 회전변환은 axis( 회전축 ) 와 angle(

More information

Microsoft Word - cg07-midterm.doc

Microsoft Word - cg07-midterm.doc 중간고사 담당교수 : 단국대학교멀티미디어공학전공박경신 답은반드시답안지에기술할것. 공간이부족할경우반드시답안지몇쪽의뒤에있다고명기한후기술할것. 그외의경우의답안지뒤쪽이나연습지에기술한내용은답안으로인정안함. 답에는반드시네모를쳐서확실히표시할것. 답안지에학과, 학번, 이름외에본인의암호를기입하면성적공고시학번대신암호를사용할것임. 1. 맞으면 true, 틀리면 false를적으시오.

More information

Microsoft PowerPoint - chap02-C프로그램시작하기.pptx

Microsoft PowerPoint - chap02-C프로그램시작하기.pptx #include int main(void) { int num; printf( Please enter an integer "); scanf("%d", &num); if ( num < 0 ) printf("is negative.\n"); printf("num = %d\n", num); return 0; } 1 학습목표 을 작성하면서 C 프로그램의

More information

Open GL

Open GL Graphics Basic Windows & OpenGL Programming 컴퓨터그래픽스연구실 OpenGL 관련참고사이트 OpenGL 공식사이트 http://www.opengl.org/ Khronos Group http://www.khronos.org/ Nehe Productions http://nehe.gamedev.net/ OpenGL 파일설정 압축을푼후다음경로로파일을복사

More information

Poison null byte Excuse the ads! We need some help to keep our site up. List 1 Conditions 2 Exploit plan 2.1 chunksize(p)!= prev_size (next_chunk(p) 3

Poison null byte Excuse the ads! We need some help to keep our site up. List 1 Conditions 2 Exploit plan 2.1 chunksize(p)!= prev_size (next_chunk(p) 3 Poison null byte Excuse the ads! We need some help to keep our site up. List 1 Conditions 2 Exploit plan 2.1 chunksize(p)!= prev_size (next_chunk(p) 3 Example 3.1 Files 3.2 Source code 3.3 Exploit flow

More information

PowerPoint 프레젠테이션

PowerPoint 프레젠테이션 01 OpenGL 과 Modeling 01 OpenGL API 02 Rendering Pipeline 03 Modeling 01 OpenGL API 1. OpenGL API 설치및환경설정 2. OpenGL API 구조 2 01 1. OpenGL API 설치및환경설정 OpenGL API 의상대적위치 System Memory Graphics Application

More information

임베디드시스템설계강의자료 6 system call 2/2 (2014 년도 1 학기 ) 김영진 아주대학교전자공학과

임베디드시스템설계강의자료 6 system call 2/2 (2014 년도 1 학기 ) 김영진 아주대학교전자공학과 임베디드시스템설계강의자료 6 system call 2/2 (2014 년도 1 학기 ) 김영진 아주대학교전자공학과 System call table and linkage v Ref. http://www.ibm.com/developerworks/linux/library/l-system-calls/ - 2 - Young-Jin Kim SYSCALL_DEFINE 함수

More information

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

서피스셰이더프로그램 셰이더개발을쉽게! Thursday, April 12, 12 서피스셰이더프로그램 셰이더개발을쉽게! 유니티렌더링시스템소개 렌더링패스 셰이더랩 서피스셰이더 데모 2 유니티렌더링시스템 3 Deferred Lighting Rendering Path Dual Lightmapping Post Effect Processing Realtime Shadow LightProbe Directional Lightmapping HDR Gamma

More information

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

(Microsoft PowerPoint - \301\24608\260\255 - \261\244\277\370\260\372 \300\347\301\372) 게임엔진 제 8 강광원과재질 이대현교수 한국산업기술대학교게임공학과 학습목차 조명모델 광원의색상설정 재질 분산성분의이해 분산재질의구현 경반사성분의이해 경반사재질의구현 조명 (Illumination) 모델 조명모델 광원으로부터공간상의점들까지의조도를계산하는방법. 직접조명과전역조명 직접조명 (direct illumination) 모델 물체표면의점들이장면내의모든광원들로부터직접적으로받는빛만을고려.

More information

금오공대 컴퓨터공학전공 강의자료

금오공대 컴퓨터공학전공 강의자료 C 프로그래밍프로젝트 Chap 14. 포인터와함수에대한이해 2013.10.09. 오병우 컴퓨터공학과 14-1 함수의인자로배열전달 기본적인인자의전달방식 값의복사에의한전달 val 10 a 10 11 Department of Computer Engineering 2 14-1 함수의인자로배열전달 배열의함수인자전달방식 배열이름 ( 배열주소, 포인터 ) 에의한전달 #include

More information

Microsoft PowerPoint - chap01-C언어개요.pptx

Microsoft PowerPoint - chap01-C언어개요.pptx #include int main(void) { int num; printf( Please enter an integer: "); scanf("%d", &num); if ( num < 0 ) printf("is negative.\n"); printf("num = %d\n", num); return 0; } 1 학습목표 프로그래밍의 기본 개념을

More information

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

WebGL 레슨 5 - 텍스쳐에 대하여 Created by Firejune at 2011/05/20, Last modified 2016/08/28 WebGL 레슨 5 - 텍스쳐에 대하여 다섯 번째 WebGL 레슨에 오신 것을 환영합니다. 이 학습은 "NeHe OpenGL의 여섯 번째 튜토리얼"을 바탕으로 하고 있습니다. 이번 레슨에서는 지금까지 만들었던 3D 오브젝트에 텍스처(Texture)를 입혀봅니다.

More information

PowerPoint 프레젠테이션

PowerPoint 프레젠테이션 System Software Experiment 1 Lecture 5 - Array Spring 2019 Hwansoo Han (hhan@skku.edu) Advanced Research on Compilers and Systems, ARCS LAB Sungkyunkwan University http://arcs.skku.edu/ 1 배열 (Array) 동일한타입의데이터가여러개저장되어있는저장장소

More information

Microsoft PowerPoint - ch07 - 포인터 pm0415

Microsoft PowerPoint - ch07 - 포인터 pm0415 2015-1 프로그래밍언어 7. 포인터 (Pointer), 동적메모리할당 2015 년 4 월 4 일 교수김영탁 영남대학교공과대학정보통신공학과 (Tel : +82-53-810-2497; Fax : +82-53-810-4742 http://antl.yu.ac.kr/; E-mail : ytkim@yu.ac.kr) Outline 포인터 (pointer) 란? 간접참조연산자

More information

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

Microsoft PowerPoint - lecture17-ch8.ppt [호환 모드] Single-Pass Multitexturing y (1,1) v (1,1) Blending 514780 2017 년가을학기 11/23/2017 단국대학교박경신 void SetMultitexturSquareData() { // 중간생략.. x glgenbuffers(4, &vbo[0]); u (-1,-1) (0,0) glbindbuffer(gl_array_buffer,

More information

iii. Design Tab 을 Click 하여 WindowBuilder 가자동으로생성한 GUI 프로그래밍환경을확인한다.

iii. Design Tab 을 Click 하여 WindowBuilder 가자동으로생성한 GUI 프로그래밍환경을확인한다. Eclipse 개발환경에서 WindowBuilder 를이용한 Java 프로그램개발 이예는 Java 프로그램의기초를이해하고있는사람을대상으로 Embedded Microcomputer 를이용한제어시스템을 PC 에서 Serial 통신으로제어 (Graphical User Interface (GUI) 환경에서 ) 하는프로그램개발예를설명한다. WindowBuilder:

More information

Ⅱ. Embedded GPU 모바일 프로세서의 발전방향은 저전력 고성능 컴퓨팅이다. 이 러한 목표를 달성하기 위해서 모바일 프로세서 기술은 멀티코 어 형태로 발전해 가고 있다. 예를 들어 NVIDIA의 최신 응용프 로세서인 Tegra3의 경우 쿼드코어 ARM Corte

Ⅱ. Embedded GPU 모바일 프로세서의 발전방향은 저전력 고성능 컴퓨팅이다. 이 러한 목표를 달성하기 위해서 모바일 프로세서 기술은 멀티코 어 형태로 발전해 가고 있다. 예를 들어 NVIDIA의 최신 응용프 로세서인 Tegra3의 경우 쿼드코어 ARM Corte 스마트폰을 위한 A/V 신호처리기술 편집위원 : 김홍국 (광주과학기술원) 스마트폰에서의 영상처리를 위한 GPU 활용 박인규, 최호열 인하대학교 요 약 본 기고에서는 최근 스마트폰에서 요구되는 다양한 멀티미 디어 어플리케이션을 embedded GPU(Graphics Processing Unit)를 이용하여 고속 병렬처리하기 위한 GPGPU (General- Purpose

More information

Microsoft PowerPoint - additional01.ppt [호환 모드]

Microsoft PowerPoint - additional01.ppt [호환 모드] 1.C 기반의 C++ part 1 함수 오버로딩 (overloading) 디폴트매개변수 (default parameter) 인-라인함수 (in-line function) 이름공간 (namespace) Jong Hyuk Park 함수 Jong Hyuk Park 함수오버로딩 (overloading) 함수오버로딩 (function overloading) C++ 언어에서는같은이름을가진여러개의함수를정의가능

More information

PowerPoint 프레젠테이션

PowerPoint 프레젠테이션 06 Texture Mapping 01 Texture Mapping 의종류 02 Texture Mapping 이가능한객체생성 03 고급 Texture Mapping 01 Texture Mapping 의종류 1. 수동 Texture Mapping 2. 자동 Texture Mapping 2 01 Texture Mapping 의종류 좌표변환 Pipeline 에서

More information

PowerPoint Presentation

PowerPoint Presentation 객체지향프로그래밍 클래스, 객체, 메소드 ( 실습 ) 손시운 ssw5176@kangwon.ac.kr 예제 1. 필드만있는클래스 텔레비젼 2 예제 1. 필드만있는클래스 3 예제 2. 여러개의객체생성하기 4 5 예제 3. 메소드가추가된클래스 public class Television { int channel; // 채널번호 int volume; // 볼륨 boolean

More information

KNK_C_05_Pointers_Arrays_structures_summary_v02

KNK_C_05_Pointers_Arrays_structures_summary_v02 Pointers and Arrays Structures adopted from KNK C Programming : A Modern Approach 요약 2 Pointers and Arrays 3 배열의주소 #include int main(){ int c[] = {1, 2, 3, 4}; printf("c\t%p\n", c); printf("&c\t%p\n",

More information

A Hierarchical Approach to Interactive Motion Editing for Human-like Figures

A Hierarchical Approach to Interactive Motion Editing for Human-like Figures 단일연결리스트 (Singly Linked List) 신찬수 연결리스트 (linked list)? tail 서울부산수원용인 null item next 구조체복습 struct name_card { char name[20]; int date; } struct name_card a; // 구조체변수 a 선언 a.name 또는 a.date // 구조체 a의멤버접근 struct

More information

C# Programming Guide - Types

C# Programming Guide - Types C# Programming Guide - Types 최도경 lifeisforu@wemade.com 이문서는 MSDN 의 Types 를요약하고보충한것입니다. http://msdn.microsoft.com/enus/library/ms173104(v=vs.100).aspx Types, Variables, and Values C# 은 type 에민감한언어이다. 모든

More information

(Microsoft PowerPoint - \301\24613\260\255 - oFusion \276\300 \261\270\274\272)

(Microsoft PowerPoint - \301\24613\260\255 - oFusion \276\300 \261\270\274\272) 게임엔진 제 13 강 ofusion 씬구성 이대현교수 한국산업기술대학교게임공학과 학습목차 Ofusion 을이용한 export Export 된씬의재현 씬노드애니메이션을이용한수동카메라트래킹 ofusion OGRE3D 엔진용 3D MAX 익스포터 http://www.ofusiontechnologies.com ofusion 의특징 Realtime Viewport 3D

More information

PowerPoint Template

PowerPoint Template 16-1. 보조자료템플릿 (Template) 함수템플릿 클래스템플릿 Jong Hyuk Park 함수템플릿 Jong Hyuk Park 함수템플릿소개 함수템플릿 한번의함수정의로서로다른자료형에대해적용하는함수 예 int abs(int n) return n < 0? -n : n; double abs(double n) 함수 return n < 0? -n : n; //

More information

Microsoft PowerPoint - 04-Model Class.pptx

Microsoft PowerPoint - 04-Model Class.pptx Digital 3D Anthropometry 4. Model Class Sungmin Kim SEOUL NATIONAL UNIVERSITY Model Class 의설계 모델링기법의개요 Introduction 3차원모델을정의하는클래스 점정보 면정보 법선벡터정보 색상정보 3차원모델과관련된기본함수 크기계산 법선벡터자동계산 이동 / 회전 기본물체만들기 데이터입출력

More information

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

Microsoft PowerPoint - 3ÀÏ°_º¯¼ö¿Í »ó¼ö.ppt 변수와상수 1 변수란무엇인가? 변수 : 정보 (data) 를저장하는컴퓨터내의특정위치 ( 임시저장공간 ) 메모리, register 메모리주소 101 번지 102 번지 변수의크기에따라 주로 byte 단위 메모리 2 기본적인변수형및변수의크기 변수의크기 해당컴퓨터에서는항상일정 컴퓨터마다다를수있음 short

More information

Microsoft PowerPoint - Java7.pptx

Microsoft PowerPoint - Java7.pptx HPC & OT Lab. 1 HPC & OT Lab. 2 실습 7 주차 Jin-Ho, Jang M.S. Hanyang Univ. HPC&OT Lab. jinhoyo@nate.com HPC & OT Lab. 3 Component Structure 객체 (object) 생성개념을이해한다. 외부클래스에대한접근방법을이해한다. 접근제어자 (public & private)

More information

JAVA 프로그래밍실습 실습 1) 실습목표 - 메소드개념이해하기 - 매개변수이해하기 - 새메소드만들기 - Math 클래스의기존메소드이용하기 ( ) 문제 - 직사각형모양의땅이있다. 이땅의둘레, 면적과대각

JAVA 프로그래밍실습 실습 1) 실습목표 - 메소드개념이해하기 - 매개변수이해하기 - 새메소드만들기 - Math 클래스의기존메소드이용하기 (   ) 문제 - 직사각형모양의땅이있다. 이땅의둘레, 면적과대각 JAVA 프로그래밍실습 실습 1) 실습목표 - 메소드개념이해하기 - 매개변수이해하기 - 새메소드만들기 - Math 클래스의기존메소드이용하기 ( http://java.sun.com/javase/6/docs/api ) 문제 - 직사각형모양의땅이있다. 이땅의둘레, 면적과대각선의길이를계산하는메소드들을작성하라. 직사각형의가로와세로의길이는주어진다. 대각선의길이는 Math클래스의적절한메소드를이용하여구하라.

More information

쉽게 풀어쓴 C 프로그래밍

쉽게 풀어쓴 C 프로그래밍 제 5 장생성자와접근제어 1. 객체지향기법을이해한다. 2. 클래스를작성할수있다. 3. 클래스에서객체를생성할수있다. 4. 생성자를이용하여객체를초기화할수 있다. 5. 접근자와설정자를사용할수있다. 이번장에서만들어볼프로그램 생성자 생성자 (constructor) 는초기화를담당하는함수 생성자가필요한이유 #include using namespace

More information

슬라이드 1

슬라이드 1 한국산업기술대학교 제 10 강광원 이대현교수 학습안내 학습목표 오우거엔진의광원을이용하여 3D 공갂에서광원을구현해본다. 학습내용 평면메쉬의생성방법광원의종류및구현방법 광원의종류 : 주변광원 주변광원 (Ambient Light) 동일한밝기의빛이장면안의모든물체의표면에서일정하게반사되는것. 공갂안에존재하는빛의평균값이론적인광원 광원의종류 : 지향광원 지향광원 (Directional

More information

歯Lecture2.PDF

歯Lecture2.PDF VISUAL C++/MFC Lecture 2? Update Visual C ++/MFC Graphic Library OpenGL? Frame OpenGL 3D Graphic library coding CLecture1View? OpenGL MFC coding Visual C++ Project Settings Link Tap Opengl32lib, Glu32lib,

More information

SBR-100S User Manual

SBR-100S User Manual ( 1 / 13 ) SBR-100S 모델에 대한 사용자 펌웨어 업그레이드 방법을 안내해 드립니다. SBR-100S 는 신규 펌웨어가 있을시 FOTA(자동업데이트) 기능을 통하여 자동 업그레이드가 되며, 필요시 사용자가 신규 펌웨어를 다운받아 수동으로 업그레이드 할 수 있습니다. 1. 준비하기 1.1 연결 장치 준비 펌웨어 업그레이드를 위해서는 SBR-100S

More information

C++ Programming

C++ Programming C++ Programming 예외처리 Seo, Doo-okok clickseo@gmail.com http://www.clickseo.com 목 차 예외처리 2 예외처리 예외처리 C++ 의예외처리 예외클래스와객체 3 예외처리 예외를처리하지않는프로그램 int main() int a, b; cout > a >> b; cout

More information

OCW_C언어 기초

OCW_C언어 기초 초보프로그래머를위한 C 언어기초 4 장 : 연산자 2012 년 이은주 학습목표 수식의개념과연산자및피연산자에대한학습 C 의알아보기 연산자의우선순위와결합방향에대하여알아보기 2 목차 연산자의기본개념 수식 연산자와피연산자 산술연산자 / 증감연산자 관계연산자 / 논리연산자 비트연산자 / 대입연산자연산자의우선순위와결합방향 조건연산자 / 형변환연산자 연산자의우선순위 연산자의결합방향

More information

chap 5: Trees

chap 5: Trees 5. Threaded Binary Tree 기본개념 n 개의노드를갖는이진트리에는 2n 개의링크가존재 2n 개의링크중에 n + 1 개의링크값은 null Null 링크를다른노드에대한포인터로대체 Threads Thread 의이용 ptr left_child = NULL 일경우, ptr left_child 를 ptr 의 inorder predecessor 를가리키도록변경

More information

지난시간에... 우리는 kernel compile을위하여 cross compile 환경을구축했음. UBUNTU 12.04에서 arm-2009q3를사용하여 간단한 c source를빌드함. 한번은 intel CPU를위한 gcc로, 한번은 ARM CPU를위한 gcc로. AR

지난시간에... 우리는 kernel compile을위하여 cross compile 환경을구축했음. UBUNTU 12.04에서 arm-2009q3를사용하여 간단한 c source를빌드함. 한번은 intel CPU를위한 gcc로, 한번은 ARM CPU를위한 gcc로. AR Configure Kernel Build Environment And kernel & root file system Build 2018-09-27 VLSI Design Lab 1 지난시간에... 우리는 kernel compile을위하여 cross compile 환경을구축했음. UBUNTU 12.04에서 arm-2009q3를사용하여 간단한 c source를빌드함.

More information

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

서강대학교공과대학컴퓨터공학과 CSE4170 기초컴퓨터그래픽스기말고사 (2/8) 다음과같이설정되어있는데, cam.pos[0] = 0.0, cam.pos[1] = 0.0, cam.pos[2] = 500.0; 이때의 cam.naxis[] 벡터의세원소값을기술하라. Figure 서강대학교공과대학컴퓨터공학과 CSE4170 기초컴퓨터그래픽스기말고사 (1/8) [CSE4170: 기초컴퓨터그래픽스 ] 기말고사 ( 담당교수 : 임인성 ) 답은반드시답안지에기술할것. 공간이부족할경우반드시답안지몇쪽의뒤에있다고명기한후기술할것. 그외의경우의답안지뒤쪽이나연습지에기술한내용은답안으로인정안함. OpenGL 시스템의각좌표계에대한약어는다음과같으며, 답을기술할때필요할경우적절히약어를사용하라.

More information

[ 마이크로프로세서 1] 2 주차 3 차시. 포인터와구조체 2 주차 3 차시포인터와구조체 학습목표 1. C 언어에서가장어려운포인터와구조체를설명할수있다. 2. Call By Value 와 Call By Reference 를구분할수있다. 학습내용 1 : 함수 (Functi

[ 마이크로프로세서 1] 2 주차 3 차시. 포인터와구조체 2 주차 3 차시포인터와구조체 학습목표 1. C 언어에서가장어려운포인터와구조체를설명할수있다. 2. Call By Value 와 Call By Reference 를구분할수있다. 학습내용 1 : 함수 (Functi 2 주차 3 차시포인터와구조체 학습목표 1. C 언어에서가장어려운포인터와구조체를설명할수있다. 2. Call By Value 와 Call By Reference 를구분할수있다. 학습내용 1 : 함수 (Function) 1. 함수의개념 입력에대해적절한출력을발생시켜주는것 내가 ( 프로그래머 ) 작성한명령문을연산, 처리, 실행해주는부분 ( 모듈 ) 자체적으로실행되지않으며,

More information

<443A5C4C C4B48555C B3E25C32C7D0B1E25CBCB3B0E8C7C1B7CEC1A7C6AE425CBED0C3E0C7C1B7CEB1D7B7A55C D616E2E637070>

<443A5C4C C4B48555C B3E25C32C7D0B1E25CBCB3B0E8C7C1B7CEC1A7C6AE425CBED0C3E0C7C1B7CEB1D7B7A55C D616E2E637070> #include "stdafx.h" #include "Huffman.h" 1 /* 비트의부분을뽑아내는함수 */ unsigned HF::bits(unsigned x, int k, int j) return (x >> k) & ~(~0

More information

C 프로그래밍 언어 입문 C 프로그래밍 언어 입문 김명호저 숭실대학교 출판국 머리말..... C, C++, Java, Fortran, Python, Ruby,.. C. C 1972. 40 C.. C. 1999 C99. C99. C. C. C., kmh ssu.ac.kr.. ,. 2013 12 Contents 1장 프로그래밍 시작 1.1 C 10 1.2 12

More information

untitled

untitled NV40 (Chris Seitz) NV1 1 Wanda NV1x 2 2 Wolfman NV2x 6 3 Dawn NV3x 1 3 Nalu NV4x 2 2 2 95-98: Z- CPU GPU / Geometry Stage Rasterization Unit Raster Operations Unit 2D Triangles Bus (PCI) 2D Triangles (Multitexturing)

More information

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

서강대학교 공과대학 컴퓨터공학과 CSE4170 기초 컴퓨터 그래픽스 중간고사 (1/7) [CSE4170: 기초 컴퓨터 그래픽스] 중간고사 (담당교수: 임 인 성) 답은 연습지가 아니라 답안지에 기술할 것. 답 안지 공간이 부족할 경우, 답안지 뒷면에 기술 하고, 해당 (/7) [CSE47: 기초 컴퓨터 그래픽스] 중간고사 (담당교수: 임 인 성) 답은 연습지가 아니라 답안지에 기술할 것. 답 안지 공간이 부족할 경우, 답안지 뒷면에 기술 하고, 해당 답안지 칸에 그 사실을 명기할 것.. 2차원 아핀변환인 이동변환 T (t, t ), 크기변환 S(s, s ), 그리고 회전변환 R(θ)에 대한 3행 3열 행렬들을 고려하자.

More information

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

Microsoft PowerPoint - chap11-포인터의활용.pptx #include int main(void) int num; printf( Please enter an integer: "); scanf("%d", &num); if ( num < 0 ) printf("is negative.\n"); printf("num = %d\n", num); return 0; 1 학습목표 포인터를 사용하는 다양한 방법에

More information

BMP 파일 처리

BMP 파일 처리 BMP 파일처리 김성영교수 금오공과대학교 컴퓨터공학과 학습내용 영상반전프로그램제작 2 Inverting images out = 255 - in 3 /* 이프로그램은 8bit gray-scale 영상을입력으로사용하여반전한후동일포맷의영상으로저장한다. */ #include #include #define WIDTHBYTES(bytes)

More information

슬라이드 1

슬라이드 1 -Part3- 제 4 장동적메모리할당과가변인 자 학습목차 4.1 동적메모리할당 4.1 동적메모리할당 4.1 동적메모리할당 배울내용 1 프로세스의메모리공간 2 동적메모리할당의필요성 4.1 동적메모리할당 (1/6) 프로세스의메모리구조 코드영역 : 프로그램실행코드, 함수들이저장되는영역 스택영역 : 매개변수, 지역변수, 중괄호 ( 블록 ) 내부에정의된변수들이저장되는영역

More information

adfasdfasfdasfasfadf

adfasdfasfdasfasfadf C 4.5 Source code Pt.3 ISL / 강한솔 2019-04-10 Index Tree structure Build.h Tree.h St-thresh.h 2 Tree structure *Concpets : Node, Branch, Leaf, Subtree, Attribute, Attribute Value, Class Play, Don't Play.

More information

Microsoft PowerPoint - chap06-2pointer.ppt

Microsoft PowerPoint - chap06-2pointer.ppt 2010-1 학기프로그래밍입문 (1) chapter 06-2 참고자료 포인터 박종혁 Tel: 970-6702 Email: jhpark1@snut.ac.kr 한빛미디어 출처 : 뇌를자극하는 C프로그래밍, 한빛미디어 -1- 포인터의정의와사용 변수를선언하는것은메모리에기억공간을할당하는것이며할당된이후에는변수명으로그기억공간을사용한다. 할당된기억공간을사용하는방법에는변수명외에메모리의실제주소값을사용하는것이다.

More information

2005CG01.PDF

2005CG01.PDF Computer Graphics # 1 Contents CG Design CG Programming 2005-03-10 Computer Graphics 2 CG science, engineering, medicine, business, industry, government, art, entertainment, advertising, education and

More information

슬라이드 1

슬라이드 1 세모그래픽스 III. 게임프로그래밍에필요한 OpenGL Page 1 목차 1. 간단한 OBJ-C 2. IOS의 OGL VS Win32의 OGL 3. IOS개발환경설정 4. 뷰포트, 프로젝션, 모델뷰 ( 회전이먼저냐이동이먼저냐?) Page 2 세모그래픽스 간단한 OBJ-C 2011.07.16 김형석 Page 3 1. Obj-C (test2_cpp) #import

More information

PowerPoint Presentation

PowerPoint Presentation Blender 3D 를활용한 CAD/Surface Mesh Repair 삼성중공업해양부유체연구파트연성모 2016.09.29-30 Overview Background Blender3D Surface Repair에서의활용방법 Open Source Mesh Generator (SHM, cfmesh) 에서의활용방법 사용상의장애물 기타활용처 요약및결론 p2 Background

More information

1. 안드로이드개발환경설정 안드로이드개발을위해선툴체인을비롯한다양한소프트웨어패키지가필요합니다 툴체인 (Cross-Compiler) 설치 안드로이드 2.2 프로요부터는소스에기본툴체인이 prebuilt 라는이름으로포함되어있지만, 리눅스 나부트로더 (U-boot)

1. 안드로이드개발환경설정 안드로이드개발을위해선툴체인을비롯한다양한소프트웨어패키지가필요합니다 툴체인 (Cross-Compiler) 설치 안드로이드 2.2 프로요부터는소스에기본툴체인이 prebuilt 라는이름으로포함되어있지만, 리눅스 나부트로더 (U-boot) 1. 안드로이드개발환경설정 안드로이드개발을위해선툴체인을비롯한다양한소프트웨어패키지가필요합니다. 1.1. 툴체인 (Cross-Compiler) 설치 안드로이드 2.2 프로요부터는소스에기본툴체인이 prebuilt 라는이름으로포함되어있지만, 리눅스 나부트로더 (U-boot) 만별도로필요한경우도있어툴체인설치및설정에대해알아봅니다. 1.1.1. 툴체인설치 다음링크에서다운받을수있습니다.

More information

11장 포인터

11장 포인터 누구나즐기는 C 언어콘서트 제 9 장포인터 이번장에서학습할내용 포인터이란? 변수의주소 포인터의선언 간접참조연산자 포인터연산 포인터와배열 포인터와함수 이번장에서는포인터의기초적인지식을학습한다. 포인터란? 포인터 (pointer): 주소를가지고있는변수 메모리의구조 변수는메모리에저장된다. 메모리는바이트단위로액세스된다. 첫번째바이트의주소는 0, 두번째바이트는 1, 변수와메모리

More information

Microsoft Word - 3부A windows 환경 IVF + visual studio.doc

Microsoft Word - 3부A windows 환경 IVF + visual studio.doc Visual Studio 2005 + Intel Visual Fortran 9.1 install Intel Visual Fortran 9.1 intel Visual Fortran Compiler 9.1 만설치해서 DOS 모드에서실행할수있지만, Visual Studio 2005 의 IDE 를사용하기위해서는 Visual Studio 2005 를먼저설치후 Integration

More information

목차 포인터의개요 배열과포인터 포인터의구조 실무응용예제 C 2

목차 포인터의개요 배열과포인터 포인터의구조 실무응용예제 C 2 제 8 장. 포인터 목차 포인터의개요 배열과포인터 포인터의구조 실무응용예제 C 2 포인터의개요 포인터란? 주소를변수로다루기위한주소변수 메모리의기억공간을변수로써사용하는것 포인터변수란데이터변수가저장되는주소의값을 변수로취급하기위한변수 C 3 포인터의개요 포인터변수및초기화 * 변수데이터의데이터형과같은데이터형을포인터 변수의데이터형으로선언 일반변수와포인터변수를구별하기위해

More information

PowerPoint 프레젠테이션

PowerPoint 프레젠테이션 Chapter 08 함수 01 함수의개요 02 함수사용하기 03 함수와배열 04 재귀함수 함수의필요성을인식한다. 함수를정의, 선언, 호출하는방법을알아본다. 배열을함수의인자로전달하는방법과사용시장점을알아본다. 재귀호출로해결할수있는문제의특징과해결방법을알아본다. 1.1 함수의정의와기능 함수 (function) 특별한기능을수행하는것 여러가지함수의예 Page 4 1.2

More information

Microsoft Word - Crackme 15 from Simples 문제 풀이_by JohnGang.docx

Microsoft Word - Crackme 15 from Simples 문제 풀이_by JohnGang.docx CrackMe 15.exe (in Simples) 문제풀이 동명대학교정보보호동아리 THINK www.mainthink.net 강동현 Blog: johnghb.tistory.com e-mail: cari2052@gmail.com 1 목차 : 1. 문제설명및기본분석 --------------------------- P. 03 2 상세분석 ---------------------------

More information

PowerPoint 프레젠테이션

PowerPoint 프레젠테이션 @ Lesson 2... ( ). ( ). @ vs. logic data method variable behavior attribute method field Flow (Type), ( ) member @ () : C program Method A ( ) Method B ( ) Method C () program : Java, C++, C# data @ Program

More information

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

Microsoft PowerPoint - lecture16-ch8.ppt [호환 모드] OpenGL Texturing Texture Mapping 514780 017 년가을학기 11/16/017 단국대학교박경신 OpenGL 에서텍스쳐맵핑 (texture mapping) 을위한 3 단계 텍스쳐활성화 glenable(gl_texture_d) 텍스쳐맵핑방법 ( 랩핑, 필터등 ) 정의 gltexparameteri(gl_texture_d, GL_TEXTURE_WRAP_S,

More information

슬라이드 1

슬라이드 1 핚국산업기술대학교 제 14 강 GUI (III) 이대현교수 학습안내 학습목표 CEGUI 라이브러리를이용하여, 게임메뉴 UI 를구현해본다. 학습내용 CEGUI 레이아웃의로딩및렌더링. OIS 와 CEGUI 의연결. CEGUI 위젯과이벤트의연동. UI 구현 : 하드코딩방식 C++ 코드를이용하여, 코드내에서직접위젯들을생성및설정 CEGUI::PushButton* resumebutton

More information

1부

1부 PART 1 2 PART 01 _ SECTION 01 API NOTE SECTION 02 3 SECTION 02 GPL Apache2 NOTE 4 PART 01 _ SECTION 03 (Proyo) 2 2 2 1 2 2 : 2 2 Dalvik JIT(Just In Time) CPU 2~5 2~3 : (Adobe Flash) (Air) : SD : : : SECTION

More information

PowerPoint 프레젠테이션

PowerPoint 프레젠테이션 실습 1 배효철 th1g@nate.com 1 목차 조건문 반복문 System.out 구구단 모양만들기 Up & Down 2 조건문 조건문의종류 If, switch If 문 조건식결과따라중괄호 { 블록을실행할지여부결정할때사용 조건식 true 또는 false값을산출할수있는연산식 boolean 변수 조건식이 true이면블록실행하고 false 이면블록실행하지않음 3

More information

Speaker MVP (Visual C++) 팁스웨어대표 tipssoft.com 개발커뮤니티운영자 한이음 IT 멘토 tipsware blog.naver.com/tipsware

Speaker MVP (Visual C++) 팁스웨어대표 tipssoft.com 개발커뮤니티운영자 한이음 IT 멘토 tipsware blog.naver.com/tipsware 김성엽 / 팁스웨어 Speaker MVP (Visual C++) 팁스웨어대표 tipssoft.com 개발커뮤니티운영자 한이음 IT 멘토 tipsware blog.naver.com/tipsware manager@tipsware.com Agenda NDK & Cross-Platform Visual Studio Emulator Android App Development

More information

쉽게 풀어쓴 C 프로그래밍

쉽게 풀어쓴 C 프로그래밍 CHAPTER 11. 자바스크립트와캔버스로게임 만들기 캔버스 캔버스는 요소로생성 캔버스는 HTML 페이지상에서사각형태의영역 실제그림은자바스크립트를통하여코드로그려야한다. 컨텍스트객체 컨텍스트 (context) 객체 : 자바스크립트에서물감과붓의역할을한다. var canvas = document.getelementbyid("mycanvas"); var

More information

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

Structure and Interpretation of Computer Programs: Assignment 3 Seung-Hoon Na October 4, George (아래 3개의 문제에 대한 구현이 모두 포함된 george.rkt파일을 제출하시오. Structure and Interpretation of Computer Programs: Assignment 3 Seung-Hoon Na October 4, 2018 1 George (아래 3개의 문제에 대한 구현이 모두 포함된 george.rkt파일을 제출하시오. 실행후 Problem 1.3에 대한 Display결과가 나와야 함) George 그림은 다음과

More information

Microsoft PowerPoint - java1-lab5-ImageProcessorTestOOP.pptx

Microsoft PowerPoint - java1-lab5-ImageProcessorTestOOP.pptx 2018 학년도 1 학기 JAVA 프로그래밍 II 514760-1 2018 년봄학기 5/10/2018 박경신 Lab#1 (ImageTest) Lab#1 은영상파일 (Image) 을읽어서정보를출력 Java Tutorials Lesson: Working with Images https://docs.oracle.com/javase/tutorial/2d/images/index.html

More information

Microsoft PowerPoint - IP11.pptx

Microsoft PowerPoint - IP11.pptx 열한번째강의카메라 1/43 1/16 Review 2/43 2/16 평균값 중간값 Review 3/43 3/16 캐니에지추출 void cvcanny(const CvArr* image, CvArr* edges, double threshold1, double threshold2, int aperture_size = 3); aperture_size = 3 aperture_size

More information

윤성우의 열혈 TCP/IP 소켓 프로그래밍

윤성우의 열혈 TCP/IP 소켓 프로그래밍 C 프로그래밍프로젝트 Chap 22. 구조체와사용자정의자료형 1 2013.10.10. 오병우 컴퓨터공학과 구조체의정의 (Structure) 구조체 하나이상의기본자료형을기반으로사용자정의자료형 (User Defined Data Type) 을만들수있는문법요소 배열 vs. 구조체 배열 : 한가지자료형의집합 구조체 : 여러가지자료형의집합 사용자정의자료형 struct

More information

UI TASK & KEY EVENT

UI TASK & KEY EVENT T9 & AUTOMATA 2007. 3. 23 PLATFORM TEAM 정용학 차례 T9 개요 새로운언어 (LDB) 추가 T9 주요구조체 / 주요함수 Automata 개요 Automata 주요함수 추후세미나계획 질의응답및토의 T9 ( 2 / 30 ) T9 개요 일반적으로 cat 이라는단어를쓸려면... 기존모드 (multitap) 2,2,2, 2,8 ( 총 6번의입력

More information

JUNIT 실습및발표

JUNIT 실습및발표 JUNIT 실습및발표 JUNIT 접속 www.junit.org DownLoad JUnit JavaDoc API Document 를참조 JUNIT 4.8.1 다운로드 설치파일 (jar 파일 ) 을다운로드 CLASSPATH 를설정 환경변수에서설정 실행할클래스에서 import JUnit 설치하기 테스트실행주석 @Test Test 를실행할 method 앞에붙임 expected

More information

쉽게 풀어쓴 C 프로그래밍

쉽게 풀어쓴 C 프로그래밍 제 11 장상속 1. 상속의개념을이해한다. 2. 상속을이용하여자식클래스를작성할수있다. 3. 상속과접근지정자와의관계를이해한다. 4. 상속시생성자와소멸자가호출되는순서를이해한다. 이번장에서만들어볼프로그램 class Circle { int x, y; int radius;... class Rect { int x, y; int width, height;... 중복 상속의개요

More information

Microsoft PowerPoint - chap10-함수의활용.pptx

Microsoft PowerPoint - chap10-함수의활용.pptx #include int main(void) { int num; printf( Please enter an integer: "); scanf("%d", &num); if ( num < 0 ) printf("is negative.\n"); printf("num = %d\n", num); return 0; } 1 학습목표 중 값에 의한 전달 방법과

More information

<4D F736F F F696E74202D20B8B6C0CCC5A9B7CEC7C1B7CEBCBCBCAD202839C1D6C2F7207E203135C1D6C2F >

<4D F736F F F696E74202D20B8B6C0CCC5A9B7CEC7C1B7CEBCBCBCAD202839C1D6C2F7207E203135C1D6C2F > 10주차 문자 LCD 의인터페이스회로및구동함수 Next-Generation Networks Lab. 5. 16x2 CLCD 모듈 (HY-1602H-803) 그림 11-18 19 핀설명표 11-11 번호 분류 핀이름 레벨 (V) 기능 1 V SS or GND 0 GND 전원 2 V Power DD or V CC +5 CLCD 구동전원 3 V 0 - CLCD 명암조절

More information

Dialog Box 실행파일을 Web에 포함시키는 방법

Dialog Box 실행파일을 Web에 포함시키는 방법 DialogBox Web 1 Dialog Box Web 1 MFC ActiveX ControlWizard workspace 2 insert, ID 3 class 4 CDialogCtrl Class 5 classwizard OnCreate Create 6 ActiveX OCX 7 html 1 MFC ActiveX ControlWizard workspace New

More information

Microsoft PowerPoint - 07-Data Manipulation.pptx

Microsoft PowerPoint - 07-Data Manipulation.pptx Digital 3D Anthropometry 7. Data Analysis Sungmin Kim SEOUL NATIONAL UNIVERSITY Body 기본정보표시 Introduction 스케일조절하기 단면형상추출 단면정보관리 3D 단면형상표시 2 기본정보표시및스케일조절 UI 및핸들러구성 void fastcall TMainForm::BeginNewProject1Click(TObject

More information

gnu-lee-oop-kor-lec06-3-chap7

gnu-lee-oop-kor-lec06-3-chap7 어서와 Java 는처음이지! 제 7 장상속 Super 키워드 상속과생성자 상속과다형성 서브클래스의객체가생성될때, 서브클래스의생성자만호출될까? 아니면수퍼클래스의생성자도호출되는가? class Base{ public Base(String msg) { System.out.println("Base() 생성자 "); ; class Derived extends Base

More information

PowerPoint Presentation

PowerPoint Presentation Package Class 3 Heeseung Jo 목차 section 1 패키지개요와패키지의사용 section 2 java.lang 패키지의개요 section 3 Object 클래스 section 4 포장 (Wrapper) 클래스 section 5 문자열의개요 section 6 String 클래스 section 7 StringBuffer 클래스 section

More information

example code are examined in this stage The low pressure pressurizer reactor trip module of the Plant Protection System was programmed as subject for

example code are examined in this stage The low pressure pressurizer reactor trip module of the Plant Protection System was programmed as subject for 2003 Development of the Software Generation Method using Model Driven Software Engineering Tool,,,,, Hoon-Seon Chang, Jae-Cheon Jung, Jae-Hack Kim Hee-Hwan Han, Do-Yeon Kim, Young-Woo Chang Wang Sik, Moon

More information

1

1 1 1....6 1.1...6 2. Java Architecture...7 2.1 2SDK(Software Development Kit)...8 2.2 JRE(Java Runtime Environment)...9 2.3 (Java Virtual Machine, JVM)...10 2.4 JVM...11 2.5 (runtime)jvm...12 2.5.1 2.5.2

More information

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

서강대학교 공과대학 컴퓨터공학과 CSE4170 기초 컴퓨터 그래픽스 중간고사 (1/8) [CSE4170: 기초 컴퓨터 그래픽스] 중간고사 (담당교수: 임 인 성) 답은 연습지가 아니라 답안지에 기술할 것. 있는 변환 행렬은 일반적으로 어떤 좌표계 에서 어떤 좌표계로의 (/8) [CSE47: 기초 컴퓨터 그래픽스] 중간고사 (담당교수: 임 인 성) 답은 연습지가 아니라 답안지에 기술할 것 있는 변환 행렬은 일반적으로 어떤 좌표계 에서 어떤 좌표계로의 변환을 위하여 사용 하는가? 답안지 공간이 부족할 경우, 답안지 뒷면에 기 술하고, 해당 답안지 칸에 그 사실을 명기할 것 (i) 투영 참조점이 무한대점 (point at infinit)

More information

Microsoft PowerPoint - ch09 - 연결형리스트, Stack, Queue와 응용 pm0100

Microsoft PowerPoint - ch09 - 연결형리스트, Stack, Queue와 응용 pm0100 2015-1 프로그래밍언어 9. 연결형리스트, Stack, Queue 2015 년 5 월 4 일 교수김영탁 영남대학교공과대학정보통신공학과 (Tel : +82-53-810-2497; Fax : +82-53-810-4742 http://antl.yu.ac.kr/; E-mail : ytkim@yu.ac.kr) 연결리스트 (Linked List) 연결리스트연산 Stack

More information

MVVM 패턴의 이해

MVVM 패턴의 이해 Seo Hero 요약 joshua227.tistory. 2014 년 5 월 13 일 이문서는 WPF 어플리케이션개발에필요한 MVVM 패턴에대한내용을담고있다. 1. Model-View-ViewModel 1.1 기본개념 MVVM 모델은 MVC(Model-View-Contorl) 패턴에서출발했다. MVC 패턴은전체 project 를 model, view 로나누어

More information

A Dynamic Grid Services Deployment Mechanism for On-Demand Resource Provisioning

A Dynamic Grid Services Deployment Mechanism for On-Demand Resource Provisioning C Programming Practice (II) Contents 배열 문자와문자열 구조체 포인터와메모리관리 구조체 2/17 배열 (Array) (1/2) 배열 동일한자료형을가지고있으며같은이름으로참조되는변수들의집합 배열의크기는반드시상수이어야한다. type var_name[size]; 예 ) int myarray[5] 배열의원소는원소의번호를 0 부터시작하는색인을사용

More information

ISP and CodeVisionAVR C Compiler.hwp

ISP and CodeVisionAVR C Compiler.hwp USBISP V3.0 & P-AVRISP V1.0 with CodeVisionAVR C Compiler http://www.avrmall.com/ November 12, 2007 Copyright (c) 2003-2008 All Rights Reserved. USBISP V3.0 & P-AVRISP V1.0 with CodeVisionAVR C Compiler

More information

쉽게 풀어쓴 C 프로그래밍

쉽게 풀어쓴 C 프로그래밍 제 13 장파일처리 1. 스트림의개념을이해한다. 2. 객체지향적인방법을사용하여파일입출력을할수있다. 3. 텍스트파일과이진파일의차이점을이해한다. 4. 순차파일과임의접근파일의차이점을이해한다. 이번장에서만들어볼프로그램 스트림 (stream) 스트림 (stream) 은 순서가있는데이터의연속적인흐름 이다. 스트림은입출력을물의흐름처럼간주하는것이다. 입출력관련클래스들 파일쓰기

More information

API STORE 키발급및 API 사용가이드 Document Information 문서명 : API STORE 언어별 Client 사용가이드작성자 : 작성일 : 업무영역 : 버전 : 1 st Draft. 서브시스템 : 문서번호 : 단계 : Docum

API STORE 키발급및 API 사용가이드 Document Information 문서명 : API STORE 언어별 Client 사용가이드작성자 : 작성일 : 업무영역 : 버전 : 1 st Draft. 서브시스템 : 문서번호 : 단계 : Docum API STORE 키발급및 API 사용가이드 Document Information 문서명 : API STORE 언어별 Client 사용가이드작성자 : 작성일 : 2012.11.23 업무영역 : 버전 : 1 st Draft. 서브시스템 : 문서번호 : 단계 : Document Distribution Copy Number Name(Role, Title) Date

More information

Orcad Capture 9.x

Orcad Capture 9.x OrCAD Capture Workbook (Ver 10.xx) 0 Capture 1 2 3 Capture for window 4.opj ( OrCAD Project file) Design file Programe link file..dsn (OrCAD Design file) Design file..olb (OrCAD Library file) file..upd

More information

API 매뉴얼

API 매뉴얼 PCI-DIO12 API Programming (Rev 1.0) Windows, Windows2000, Windows NT and Windows XP are trademarks of Microsoft. We acknowledge that the trademarks or service names of all other organizations mentioned

More information

슬라이드 1

슬라이드 1 한국산업기술대학교 제 5 강스케일링및회전 이대현교수 학습안내 학습목표 3D 오브젝트의확대, 축소및회전방법을이해한다. 학습내용 3D 오브젝트의확대및축소 (Scaling) 3D 오브젝트의회전 (Rotation) 변홖공갂 (Transform Space) SceneNode 의크기변홖 (Scale) void setscale ( Real x, Real y, Real z)

More information

쉽게 풀어쓴 C 프로그래밍

쉽게 풀어쓴 C 프로그래밍 제 3 장함수와문자열 1. 함수의기본적인개념을이해한다. 2. 인수와매개변수의개념을이해한다. 3. 함수의인수전달방법 2가지를이해한다 4. 중복함수를이해한다. 5. 디폴트매개변수를이해한다. 6. 문자열의구성을이해한다. 7. string 클래스의사용법을익힌다. 이번장에서만들어볼프로그램 함수란? 함수선언 함수호출 예제 #include using

More information

PowerPoint Presentation

PowerPoint Presentation 언리얼엔진 4 모바일개발팁 신광섭 Developer Relations Lead / Programmer 에픽게임즈코리아 목차 Unreal Plugin Language 언리얼엔진 4 프로젝트 Android Studio 사용하기 (Java 빌드 / 디버깅 ) 모바일알려진이슈와팁 UE4 모바일지원에부족한부분은?( 피드백 ) Unreal Plugin Language

More information