01 418382 ...

Post on 23-Feb-2016

74 Views

Category:

Documents

0 Downloads

Preview:

Click to see full reader

DESCRIPTION

01 418382 สภาพแวดล้อมการทำงานคอมพิวเตอร์กราฟิกส์ การบรรยายครั้งที่ 1. ประมุข ขันเงิน pramook@gmail.com. วิชานี้สอน. ให้คุณสามารถเขียนโปรแกรมทางคอมพิวเตอร์ กราฟิกส์ สามมิติของตัวเองได้ ใช้ภาษา C++ ควบคุมการ์ดจอด้วย OpenGL และ GLSL - PowerPoint PPT Presentation

TRANSCRIPT

01418382 สภาพแวดลอมการทำางานคอมพวเตอรกราฟกส

การบรรยายครงท 1

ประมข ขนเงนpramook@gmail.com

วชานสอน...

• ใหคณสามารถเขยนโปรแกรมทางคอมพวเตอรกราฟกสสามมตของตวเองได– ใชภาษา C++– ควบคมการดจอดวย OpenGL และ GLSL

• ใหคณมความรทางเทคนคพนฐานเกยวกบคอมพวเตอรกราฟกส

• เราไมไดสอนเกยวกบการสรางงานศลปะหรอสเปเชยลเอฟเฟกต

ผสอน• ประมข ขนเงน– อเมล: pramook@gmail.com, fscipmk@ku.ac.th– โทรศพท: 08-5453-5857– ออฟฟศ: หองไมมเบอรเยองสำานกงานภาค– เวลาเขาพบ: พธและศกร เวลา 13.00 น. ถง 16.00 น.

หรอนดหมายลวงหนา

การใหคะแนน• การบาน 40%– เขยนโปรแกรม มประมาณ 4 ครง

• สอบกลางภาค 30%• สอบปลายภาค 30%• เกณฑการใหคะแนนอานเปลยนแปลงไดในอนาคต• ตดคะแนนองกลม• ตดคะแนนรวมหม 1 และ 200 ( หม 200 มคนเรยน

นอย)

ความรพนฐาน• รภาษา C++• เขยนโปรแกรมไดด– วชานมเขยนโปรแกรมเยอะ

• ความรพชคณตเชงเสน– เวกเตอรในปรภมสามมต– พหนาม– มทวนให

หนงสอ• David Shreiner et al. OpenGL Programming Guide:

The Official Guide to Learning OpenGL.– ดาวนโหลดไดท http://fly.cc.fer.hr/~unreal/theredbook/

• เวบไซตสอน OpenGL และ GLSL ตางๆ– http://www.lighthouse3d.com/opengl/index.shtml– http://nehe.gamedev.net/

เวบเพจ• http://access.cs.sci.ku.ac.th/~pramook/382• เชคบอยๆ• การบานจะใหไวในเวบเพจนเทานน• ไมพมพมาให

นโยบาย• การบานทกการบาน คณตองทำเอง– เขยนโปรแกรมตองพมพเอง– การบานขอเขยนตองเขยนเอง ดวยลายมอของตวเอง

• หมลอก– ถาลอกจะไมไดคะแนนสำาหรบการบานนน ทงคนลอกและคนใหลอก

– หามลอกโปรแกรมจากในอนเตอรเนตหรอหนงสอดวย• ถามเพอนได อานจากอนเตอรเนตหรอหนงสอได– บอกดวยวาทำางานกบใคร– บอกแหลงอางองดวย

คอมพวเตอรกรฟกส

คอมพวเตอรกราฟกส• การใชคอมพวเตอรเพอสรางและจดการสอวทศน• ประโยชน– ความบนเทง: ภาพยนตร, เกมส– การศกษา: ซมเลชน, สอประสม– อตสาหกรรม: CAD/CAM

ภาพยนตร

ภาพยนตร

ภาพยนตร

Monster Inc. Final Fantasy: The Spirit Within

การแสดงภาพทางวทยาศาสตร

การแสดงภาพทางวทยาศาสตร (ตอ)

Airflow around a Harrier Jet (NASA Ames)

การแสดงภาพทางการแพทย

MIT: Image-Guided Surgery Project

The Visible Hum

an Project

Computer Aided Design (CAD)

เกมส

Crytek: Crysis

เกมส

Kloonigames: Crayon Physics

ปญหาสำาคญ• การจดการแบบจำาลอง (modeling)– วธเกบขอมลวตถจรงในคอมพวเตอร

• การใหแสงและเงา (rendering)– นำาแบบจำาลองมาสรางเปนรปทสวยงาม

• การจดการความเคลอนไหว (animation)– วธสรางและเกบขอมลความเคลอนไหว– การจำาลองปรากฏการณธรรมชาต

การจดการแบบจำาลอง• แบบจำาลองสำาหรบ:– รปราง รปทรง– พนผว– สมบตการสะทอนและดดซบแสงของวตถ

• ปญหา– เกบขอมลอะไร?– จะดงขอมลจากวตถจรงๆ ไดอยางไร?

แบบจำาลองรปราง• สามเหลยมและหลายเหลยม

http://amber.rc.arizona.edu/dx/vtkDecimateDX.html

แบบจำาลองรปราง (ตอ)

• เสนโคงพหนาม

http://en.wikipedia.org/wiki/Nurbs

แบบจำาลองรปราง (ตอ)

• Subdivision Surface

http://en.wikipedia.org/wiki/Subdivision_surface

แบบจำาลองรปราง (ตอ)

• Pixar’s Geri’s Game

http://www.pixar.com/shorts/gg/index.html

แบบจำาลองพนผว• Texture Mapping

http://www.siggraph.org/education/materials/HyperGraph/mapping/r_wolfe/

แบบจำาลองพนผว (ตอ)

• Bump Mapping

+ =

การสรางแบบจำาลอง• สแกนเขามา• สรางเอาจากซอฟตแวร

การใหแสงและเงา• สรางรปภาพจากแบบจำาลองทางคณตศาสตร

http://en.wikipedia.org/wiki/Global_illumination

Physically Based Rendering

• ใหแสงเงาใหสมจรงตามหลกฟสกส

http://en.wikipedia.org/wiki/Rendering

Non-Photorealistic Rendering

• ใหสไมตรงกบความเปนจรงเพอความสวยงาม

The Legend of Zelda: The Wind Wakerhttp://en.wikipedia.org/wiki/Toon_shading

การจดการความเคลอนไหว• ขอมลความเคลอนไหวหนาตาเปนอยางไร?– โครงกระดก– การหมนของขอ

Ilya Baran and Jovan Popovic. Automatic Rigging and Animation of 3D Characters. SIGGRAPH 2007.

การจดการความเคลอนไหว• เกบขอมลอยางไร: Motion capture

การจำาลองปรากฏการณธรรมชาต• จำาลองอะไร?– ไฟ, นำา, ผา, ของแตก, ของนม, ควน, ฯลฯ

• แกสมการเชงอนพนธ• ไมตองถกตอง 100% แคสวยกพอ

ระบบคอมพวเตอรกรฟกสในเครองคอมพวเตอรสวนบคคล

ในเครองคอมของคณ...

รปทแลวมอะไรบาง?

• CPU, Memory, Bus– เรารดอยแลววามนทำาอะไร

• GPU– ทำางานเกยวกบกราฟกส– ขอมลเขา

• โมเดลรปทรง ( ตำาแหนงของจด ความเชอมโยงกนของจด และสของจด)• จตรกรรมฝาผนง

– ขอมลออก• รปบนหนาจอ

GPU

ภาพ• ตารางสเหลยมผนผา แตละชองมสหนงส• แตละชองเรยกวา พกเซล (pixel)

http://en.wikipedia.org/wiki/Pixels

ส• ส = เวกเตอร (R, G, B) เลขแตละตวมคาตงแต 0

ถง 1– R บอกระดบความเขมของแสงสแดง– G บอกระดบความเขมของแสงสเขยว– B บอกระดบความเขมของแสงสนำาเงน

Trichromatic Theory of Vision

• สทมนษยมองเหนแบงออกเปนสามสวน– แดง เขยว นำาเงน– ประสาทสมผสของมนษยของแตละสเปนอสระจากกน– สอนๆ เกดจาก การนำาสทงสามนมาประกอบกน

• หลกฐาน– เซลลโคนในเรตนามสามชนด– แตละชนดไวตอ สแดง สเขยว สนำาเงน ตามลำาดบ

สหลกๆ(1,0,0) (0,1,0)

(0,0,1)

(1,1,0)

(1,0,1) (0,1,1)

(1,1,1)

(0,0,0)

Graphics Pipeline

Graphics Pipeline (ตอ)

Graphics Pipeline (ตอ)

Graphics Pipeline (ตอ)

Graphics Pipeline (ตอ)

Graphics Pipeline (ตอ)

Graphics Pipeline (ตอ)

Graphics Pipeline (ตอ)

Graphics Pipeline (ตอ)

Graphics Pipeline (ตอ)

OPENGL และ GLUT

OpenGL

• Application Programming Interface (API) สำาหรบควบคม GPU

• ผใช OpenGL ระบรปทรงและรปรางพนฐาน ( จด เสน และรปหลายเหลยม) ผานทาง OpenGL

• OpenGL จะทำาหนาทสรางภาพไวบน framebuffer ให

• ใชสรางโปรแกรมทมการตอบสนองตอผใชแบบ ทนททนควน (interactive) และโปรแกรมทมภาพ

เคลอนไหว• ทำาหนาทเดยวกบ Direct3D และเปนคแขงทางการ

คากนอย

กายวภาคของโปรแกรมทางคอมพวเตอรกราฟฟกส

Direct3D 10OpenGL 2.1

GeForce 8800

VRML

web application

Radeon 9600

Unreal engine

Gears of War

GPU

graphics API

scene graph

application

คำาศพท• Bitplane– เนอทในหนวยความจำาทเกบขอมล 1 บทของทกพกเซลทอยบน

จอภาพ• Framebuffer– Bitplane หลายๆ bitplane ทเกบขอมลทงหมดทใชควบคมหนาจอ

• Buffer– Bitplane กลมหนงทใชเกบขอมลบางอยาง

• Application Programming Interface (API)– ฟงกชนและ object อนๆ ในภาษาระดบสงทใหโปรแกรมประยกตใช

สำาหรบตดตอกบระบบฮารดแวรหรอซอฟตแวรตางๆ

สงท OpenGL ไมทำา• จดการการตดตอกบผใช• จดการวนโดวส• วาดและจดการรปทรงทซบซอน เชน รถถง ตนไม

ฯลฯ– ถงแมวาคณจะสามารถใชรปทรงงายๆ ของ OpenGL

สรางมนไดกตาม– สวนใหญคณตองเขยน library ขนมาจดการกบพวกน

เอง• จดการ framebuffer– เปนความรบผดชอบของคณทตองเตรยม

framebuffer ให OpenGL

GLUT

• OpenGL Utility Toolkit• ใชสำาหรบจดการการตดตอกบผใชและจดการ

วนโดวส– ทำาสงท OpenGL ไมทำา

• เอาไปใชเขยนโปรแกรมประยกตจรงๆ คงยาก– ไมม GUI Widget ใหใชเลย– ตองรบขอมลจากผใชตามท GLUT กำาหนด

• แตทำาใหการเรยนร OpenGL งายขนมาก

ตวอยางvoid draw() { glClearColor(0.0, 0.0, 0.0, 0.0) glClear(GL_COLOR_BUFFER_BIT); glColor3f(1.0, 1.0, 1.0); glBegin(GL_POLYGON); glVertex3f(-0.5, -0.5, 0.0); glVertex3f( 0.5, -0.5, 0.0); glVertex3f( 0.5, 0.5, 0.0); glVertex3f(-0.5, 0.5, 0.0); glEnd(); glFlush();}

int main(int argc, char** argv) { glutInit(&argc, argv); glutInitDisplayMode(GLUT_SINGLE | GLUT_RGBA); glutCreateWindow("whitesquare"); glutDisplayFunc(draw); glutMainLoop();}

OpenGL

GLUT

เฉพาะสวนของ OpenGLglClearColor(0.0, 0.0, 0.0, 0.0)glClear(GL_COLOR_BUFFER_BIT);glColor3f(1.0, 1.0, 1.0);glBegin(GL_POLYGON); glVertex3f(-0.5, -0.5, 0.0); glVertex3f( 0.5, -0.5, 0.0); glVertex3f( 0.5, 0.5, 0.0); glVertex3f(-0.5, 0.5, 0.0);glEnd();glFlush();

ทละคำาสง• glClearColor(0.0, 0.0, 0.0, 0.0)– เปลยนสทจะใชลางหนาจอเปนสดำา

• glClear(GL_COLOR_BUFFER_BIT)– ลาง bitplane ทเกบสดวยสทกำาหนดใน glClearColor

• glColor3f(1.0, 1.0, 1.0)– เปลยนสเปนสขาว– จดทวาดตอจากนไปจะเปนสขาว

ทละคำาสง (ตอ)

• glBegin(GL_POLYGON)– บอกวาตอไปเราจะวาดรปหลายเหลยม

• glVertex3f(x, y, z)– กำาหนดจด

• glEnd()– บอกวาสงทเรมไปตงแต glBegin ทแลวไดเสรจสนแลว– ในทนคอบอกวากำาหนดรปหลายเหลยมเสรจแลว

• glFlush()– ทำาใหคำาสง OpenGL ทเคยสงมาถกนำาไปปฏบตงาน แทนทจะถก

เกบไวในหนวยความจำาเพอรอคำาสงอน

คำาสง OpenGL

• ขนตนดวย gl• ตามดวยชอคำาสง เชน Vertex หรอ Color• บางคำาสงอาจมจำานวนและชนด ของ argument– 3f บอกวาตองการ argument เปน float 3 ตว

• glVertex3f(1.0f, 3.0f, 4.0f);– 2i บอกวาตองการ argument เปน int 2 ตว

• glVertex2i(-1, 5);– 3fv บอกวาตองการ argument เปน pointer ไปยง float 3 ตว

• float colorArray[] = {1.0f, 0.0f, 0.0f}• glColor3fv(colorArray);

ชนดของ argument ในชอคำาสงSuffix Data Type Typical Corresponding

C-Language TypeOpenGL Type

Definition

b 8-bit integer signed char GLbytes 16-bit integer short GLshorti 32-bit integer long GLint, GLsizeif 32-bit floating-point float GLfloat, GLclampf

d 64-bit floating-point double GLdouble, GLclampd

ub 8-bit unsigned integer

unsigned char GLubyte, GLboolean

us 16-bit unsigned integer

unsigned short GLushort

ui 32-bit unsigned integer

unsigned long GLuint, GLenum, GLbitfield

OpenGL เปน State Machine

• OpenGL จะจำาคาตางๆ ทผใชกำาหนดไดเอาไว• เมอผใชกำาหนดคา คานนจะถกใชตอไปเรอยๆ จนกวาจะ

เปลยน• คาทจำาไว เชน– สทใชลางหนาจอ– สของจด– ทศทางและตำาแหนงของกลองถายรป

• ยกตวอยางเชน เวลาเราเรยก glColor3f(1,1,1) แลวสของ จดทกำาหนดดวย glVertex จะเปนสขาวไปจนกวาจะเรยก

glColor ใหมอกครง

โคดตวอยางเฉพาะสวนของ GLUT

int main(int argc, char** argv) { glutInit(&argc, argv); glutInitDisplayMode(GLUT_SINGLE | GLUT_RGBA); glutCreateWindow("whitesquare"); glutDisplayFunc(draw); glutMainLoop();}

glutInit

• glutInit(int *argc, char **argv)– ทำาการตงคาเรมตนหลายๆ คาของ GLUT– สงทตองสงใหคอ pointer ไปยงจำานวน argument

ของโปรแกรม และ argument อนๆ– ตองเรยกเปนคำาสงแรกกอนคำาสงอนของ GLUT

ทงหมด– ความจรงไมมอะไรมาก ปกตเราเขยน

int main(int argc, char ** argv)– กแคใหเรยก glutInit(&argc, argv) เปนคำาสงแรกใน

main กพอ

glutInitDisplay

• glutInitDisplay(unsigned int mode)– เลอกวาสของ pixel ในโปรแกรมของเราจะเปนแบบใด

• มใหเลอกสองแบบคอ RGB กบ Indexed Color• เราจะไมใช Indexed Color เลย

– เลอกวาจะใช single buffer หรอ double buffer• ใช double buffer จะทำาให animation ดลนไหลกวา

– เลอกวาจะใหม buffer อนๆ นอกจาก buffer สอะไรบาง• ปกตจะใชแค depth buffer สำาหรบเกบความลกของจดแตละจด

– คา mode เกดจากการเอาคาคงทของตวเลอกตางๆ มา or กน• ปกตเราจะใช GLUT_RGBA | GLUT_DOUBLE | GLUT_DEPTH• กรณของ code ตวอยางใช GLUT_SINGLE | GLUT_RGBA

คำาสงสำาหรบจดการวนโดวส• glutCreateWindow(char *string)– สรางวนโดวทม title เปน string ทให

• glutInitWindowPosition(int x, int y)– กำาหนดตำาแหนงขอบบนของวนโดว

• glutInitWindowSize(int width, int height)– กำาหนดขนาดของวนโดว

glutDisplayFunc

• glutDisplayFunc(void (*func)(void))– กำาหนดฟงกชนท GLUT จะเรยกทกครงเมอมนตอง

วาดหนาจอใหม– ฟงกชนทจะสงให glutDisplayFunc ตองม prototype

void <ชอฟงกชน>(void)– ยกตวอยางเชนฟงกชน void draw() ในโคดตวอยาง– ฟงกชนนสวนมากจะเตมไปดวยคำาสง OpenGL

glutMainLoop

• glutMainLoop()– ฟงกชนสดทายทเราเรยกในโปรแกรม– สงให GLUT ไปทำางานของมน– งานของ GLUT• รบ input จากผใช• เรยกฟงกชนทใหใน glutDisplayFunc• เรมตนใหมอกครง

– ระวง: ตองสราง windows และกำาหนด displayFunc ใหเรยบรอยกอนเรยก glutMainLoop

กรยอขยยขนดวนโดว

เมอยอขยายวนโดว

ตองการอยางนมากกวา

glutReshapeFunc

• glutReshapeFunc(void (*func) (int width, int height))– ใหฟงกชนทรบ int สองตว– ฟงกชนทใหไปจะถกเรยกทกครงทวนโดวเปลยนขนาด– Argument ทเปน int สองตว• ตวแรกคอความกวางของหนาตางหลงถกเปลยนความ

กวาง หนวยเปนพกเซล• ตวทสองคอความสงของหนาตางหลงถกเปลยนความกวาง

หนวยเปนพกเซล– เราสามารถใชฟงกชนทให glutReshapeFunc ไปเปนตว

ปรบอตราสวนของรปทแสดงออกมาได

ตวอยางการใช glutReshapeFuncvoid reshape(int w, int h){

.........}

void draw(){

.........}

int main(int argc, char **argv){

glutInit(&argc, argv);

glutInitDisplayMode(GLUT_RGBA | GLUT_SINGLE);glutCreateWindow("window");glutReshapeFunc(reshape);glutDisplayFunc(draw);glutMainLoop();

}

Aspect Ratio

• อตราสวนระหวางความกวางของรปตอความสงของรป

• Aspect ratio ของรปสเหลยมสขาว = 1• เวลายอขยายหนาจอ aspect ratio เปลยนแมเราจะ

วาดรปทจดเดมกตาม• นเปนเพราะจดตางๆ ยายท

heightwidthratioaspect

Aspect Ratio (ตอ)(1,1)

(1,-1)(-1,-1)

(-1,1)

Aspect Ratio (ตอ)(1,1)(-1,1)

(-1,-1) (1,-1)

Aspect Ratio (ตอ)(1,1)(-1,1)

(1,-1)(-1,-1)

สงทเราตองการ• เวลายอหรอขยายวนโดว aspect ratio ของรปควร

จะมคาคงท แมวา aspect ratio ของวนโดวจะเปลยน

• แตเราไมตองการวาดรปใหม– ไมตองการเปลยนฟงกชน draw

• เราสามารถทำาไดโดยเปลยนระบบพกด(coordinate system) ของพนททเราจะวาดรปเสยใหม

กรณความกวางมากกวาความสง(1,1)

(1,-1)

(-1,1)

(-1,-1)

กรณความสงมากกวาความกวาง(1,1)

(1,-1)

(-1,1)

(-1,-1)

gluOrtho2D

• gluOrtho2D(GLdouble left, GLdouble right, GLdouble bottom, GLdouble top)

– ใชเปลยน projection matrix ใหเปนการฉายแบบ orthogonal projection• เราจะไปพดถงคำาศพทเหลานในอกประมาณสองอาทตยหนา

– ตอนนเขาใจวาเปนการเซตพกดของจดมมของบรเวณทเราจะวาดรป• มมลางซายเปน (left, bottom)• มมลางขวาเปน (right, bottom)• มมบนซายเปน (left, top)• มมบนขวาเปน (right, top)

gluOrtho2D (ตอ)

gluOrtho2D(-1,1,-1,1) gluOrtho2D(-2,2,-2,2)

gluOrtho2D(-1,1,-2,2)gluOrtho2D(-2,2,-1,1)

กรณความกวางมากกวาความสง (ตอ)

(1,1)

(1,-1)

(-1,1)

(-1,-1)

(right,top)

(right,bottom)

(left,top)

(left,bottom)

กรณความกวางมากกวาความสง (ตอ)

• bottom = -1• top = 1• left = ???, right = ???• แตเรารวา left = -right• สงเกตวา

เมอ w และ h คอความกวางและความสงของ วนโดว ตามลำาดบ

bottomtopleftright

hw

กรณความกวางมากกวาความสง (ตอ)

• นนคอ

• ดงนน– left = w/h– right = -w/h

leftleftleftlefthw

22

)1(1)(

กรณความสงมากกวาความกวาง (ตอ)

(1,1)

(1,-1)

(-1,1)

(-1,-1)

(right,top)

(right,bottom)

(left,top)

(left,bottom)

กรณความสงมากกวาความกวาง(ตอ)

• left = -1• right = 1• top = ???, bottom = ???• เรารวา bottom = -top

• ดงนน top = h/w และ bottom = -h/w

toptoptoptopbottomtopleftright

hw 1

22

)()1(1

Callback สำาหรบเวลาวนโดวเปลยนขนาด

void reshape(int w, int h){

glViewport(0,0,w,h);

if (w == 0) w = 1;if (h == 0) h = 1;

double aspect = w * 1.0 / h;

glMatrixMode(GL_PROJECTION);glLoadIdentity();if (w > h)gluOrtho2D(-aspect, aspect, -1, 1);elsegluOrtho2D(-1, 1, -1/aspect, 1/aspect);

}

Callback สำาหรบเวลาวนโดวเปลยน ขนาด (ตอ)

void reshape(int w, int h){

glViewport(0,0,w,h);

if (w == 0) w = 1;if (h == 0) h = 1;

double aspect = w * 1.0 / h;

glMatrixMode(GL_PROJECTION);glLoadIdentity();if (w > h)gluOrtho2D(-aspect, aspect, -1, 1);elsegluOrtho2D(-1, 1, -1/aspect, 1/aspect);

}

กน division by zero

Callback สำาหรบเวลาวนโดวเปลยน ขนาด (ตอ)

void reshape(int w, int h){

glViewport(0,0,w,h);

if (w == 0) w = 1;if (h == 0) h = 1;

double aspect = w * 1.0 / h;

glMatrixMode(GL_PROJECTION);glLoadIdentity();if (w > h)gluOrtho2D(-aspect, aspect, -1, 1);elsegluOrtho2D(-1, 1, -1/aspect, 1/aspect);

}

คำานวณ aspect ratio ของวนโดว

Callback สำาหรบเวลาวนโดวเปลยน ขนาด (ตอ)

void reshape(int w, int h){

glViewport(0,0,w,h);

if (w == 0) w = 1;if (h == 0) h = 1;

double aspect = w * 1.0 / h;

glMatrixMode(GL_PROJECTION);glLoadIdentity();if (w > h)gluOrtho2D(-aspect, aspect, -1, 1);elsegluOrtho2D(-1, 1, -1/aspect, 1/aspect);

}

กวาง > สง

Callback สำาหรบเวลาวนโดวเปลยน ขนาด (ตอ)

void reshape(int w, int h){

glViewport(0,0,w,h);

if (w == 0) w = 1;if (h == 0) h = 1;

double aspect = w * 1.0 / h;

glMatrixMode(GL_PROJECTION);glLoadIdentity();if (w > h)gluOrtho2D(-aspect, aspect, -1, 1);elsegluOrtho2D(-1, 1, -1/aspect, 1/aspect);

}

สง > กวาง

glViewport

• void glViewport(GLint x, GLint y, GLsizei width, GLsizei height )

– กำาหนดพนทในวนโดวทจะใชแสดงผลภาพท OpenGL สราง– x, y, width, height มหนวยเปนพกเซล– พกด (x,y) กำาหนดตำาแหนงมมบนซายของพนท– width กำาหนดความกวางของพนท– height กำาหนดความสงของพนท

• ในตวอยางเราใช glViewport(0,0,w,h) หมายความวาเราใชพนททงหมดของวนโดว

Callback สำาหรบเวลาวนโดวเปลยน ขนาด (ตอ)

• เราเรยกglMatrixMode(GL_PROJECTION);glLoadIdentity();กอนจะเรยกglOrtho2D(…);เพอกำาหนดระบบพกด

• ทงสองฟงกชนนเกยวของกบการกำาหนด viewing transform ซงเราจะพดถงในสองสปดาหหนา

• ตอนนใหจำาไปกอนวาตองเรยนสองฟงกชนนกอนใชglOrtho2D เสมอ

วตถเรขคณตใน OPENGL

วตถเรขาคณตใน OpenGL

• OpenGL สามารถวาดวตถเรขาคณตงายๆ ได 3 อยาง– จด– สวนของเสนตรง– รปหลายเหลยม

• ไมสามารถวาดเสนโคงหรอพนผวโคงได• แตเราสามารถวาดเสนโคงดวยการวาดเสนตรง

สนๆ หลายเสน

Vertex

• การกำาหนดวตถทางเรขาคณตใน OpenGL ทำาได โดยการกำาหนด vertex “ ” หรอ จดมม ของวตถ

นน– จดใน OpenGL ม 1 vertex– สวนของเสนตรงใน OpenGL ม 2 vertices (เพราะสวน

ของเสนตรงเกดจากการลากเสนเชอมจดสองจด)– รปหลายเหลยมมจำานวน vertex เทากบจำานวนเหลยม• สามเหลยมม 3 vertices• สเหลยมม 4 vertices• n เหลยมม n vertices

glVertex

• glVertex[234][sifd][v](TYPE coords)– ใชกำาหนดตำาแหนง vertex– สามารถม argument 2, 3, หรอ 4 ตวกได

• สตวตรงกบพกดแนว x, y, z, w– เราจะพดถงพกดแนว w ในสปดาหหนาเมอเรยนเรอง homogeneous

coordinate• ถาม 3 ตว จะเขาใจวา w = 1• ถาม 2 ตว จะเขาใจวา z = 0 และ w = 1• ปกตจะใช argument แค 3 ตว

– ตวอยาง:• glVertex2i(10, 5)• glVertex3d(8, 7, 3.14153265)

glVertex (ตอ)

– เตม v ถาตองการให argument เปน pointer ไปยงarray ของพกด• GLint p0[] = {1,2,3};

glVertex3iv(p0);• GLfloat *p1 = {2.0f, 3.0f, 4.0f, 5.0f};

glVertex4fv(p1)

การกำาหนดวตถเรขาคณต• เรมดวย glBegin(ชนดของวตถ) • หลงจากนนใช glVertex กำาหนด vertex ของวตถนน• แลวจบดวย glEnd()• ทเคยเหนมาจากการบรรยายครงทสอง:

glBegin(GL_POLYGON);glVertex3f(-0.5f, -0.5f, 0.0f);glVertex3f(0.5f, -0.5f, 0.0f);glVertex3f(0.5f, 0.5f, 0.0f);glVertex3f(-0.5f, 0.5f, 0.0f);

glEnd();

ชนดของวตถ คาทเอาไปใสใน

glBegin(…)ชนดของวตถ

GL_POINTS จดGL_LINES สวนของเสนตรงGL_LINE_STRIP สวนของเสนตรงตอกนหลาย

เสน ปลายเปดGL_LINE_LOOP สวนของเสนตรงตอกนหลาย

เสน ปลายปดGL_TRIANGLES สามเหลยมGL_TRIANGLE_STRIP สามเหลยมตอกนเปนสายGL_TRIANGLE_FAN สามเหลยมตอกนเปนรปพดGL_QUADS สเหลยมGL_QUAD_STRIP สเหลยมตอกนเปนสายGL_POLYGON รปหลายเหลยม

ชนดของวตถ (ตอ)

glColor

• glColor[34][fd][v](TYPE colors)– ใชกำาหนดสใหกบ vertex– กำาหนดใหแลว vertex จะมสนนไปจนกวาจะเรยน glColor เพอ

เปลยนมน– สามารถม argument 3, หรอ 4 ตวกได

• Argument คอ r (สแดง), g (สเขยว), b (สนำาเงน), a (ความโปรงแสง)• แตละตวมคาตงแต 0.0 (ไมมความเขมเลย) ถง 1.0 (เขมเตมท)• ถาม argument สามตว a จะมคาเทากบ 1.0 (ทบแสง)

– ตวอยาง• glColor3f(1.0f, 1.0f, 0.0f) = สเหลอง• glColor4d(0.5f, 0.5f, 0.5f, 0.5f) = สเทา โปรงใส 50%

glColor (ตอ)

– เตม v ถาตองการให argument เปน pointer ไปยงarray ของส• GLdouble color0[] = {0,1,1};

gColor3dv(p0);• GLfloat *color1 = {0.1f, 0.9f, 0.5f, 0.75f};

glVert4fv(p1)– ความโปรงแสงจะไมมผลจนกวาเราจะบอก OpenGL ให

จดการความโปรงแสงให (เรองนเราจะไปพดกอนสอบกลางภาคเลกนอย)

ตวอยางglBegin(GL_TRIANGLES);

// RedglColor3f(1.0f, 0.5f, 0.5f);glVertex3f( 0.0f, 0.5f, 0.0f);glVertex3f(-0.25f, 0.0f, 0.0f);glVertex3f( 0.25f, 0.0f, 0.0f);

// GreenglColor3f(0.5f, 1.0f, 0.5f);glVertex3f( -0.25f, 0.0f, 0.0f);glVertex3f( -0.5f, -0.5f, 0.0f);glVertex3f( 0.0f, -0.5f, 0.0f);

// BlueglColor3f(0.5f, 0.5f, 1.0f);glVertex3f( 0.25f, 0.0f, 0.0f);glVertex3f( 0.0f, -0.5f, 0.0f);glVertex3f( 0.5f, -0.5f, 0.0f);

glEnd();

ตวอยาง

glBegin(GL_QUADS);

glColor3f( 1.0f, 1.0f, 0.0f);glVertex3f(-0.5f, -0.5f, 0.0f);

glColor3f( 1.0f, 0.0f, 1.0f);glVertex3f( 0.5f, -0.5f, 0.0f);

glColor3f( 1.0f, 1.0f, 1.0f);glVertex3f( 0.5f, 0.5f, 0.0f);

glColor3f( 0.0f, 1.0f, 1.0f);glVertex3f(-0.5f, 0.5f, 0.0f);

glEnd();

ตวอยาง

glBegin(GL_LINE_LOOP);for(int i=0;i<256;i++){

double theta = 2*i*M_PI/256;double y = 0.75*sin(theta);double x = 0.75*cos(theta);glVertex2d(x,y);

}glEnd();

เกยวกบรปหลายเหลยม• OpenGL รบประกนวาจะวาดรปหลายเหลยมทจด

ทงหมดอยในระนาบเดยวกนไดถกตอง– ถาไมเปนเชนนนจะไมรบประกนวาจะถกตองหรอไม

• ขอสงเกต: จดทกจดทอยบนรปสามเหลยมอยบนระนาบเดยวกน– แตนไมเปนจรงสำาหรบสเหลยมหรอรปหลายเหลยมอน

เกยวกบรปหลายเหลยม (ตอ)

• รปหลายเหลยมทวาดไดดวยglBegin(GL_POLYGON) จะมสมบตดงน– เสนขอบของมนจะตองไมตดกน– รปหลายเหลยมนนจะตองเปนรปหลายเหลยมนน– “ ”รปหลายเหลยมนนจะตองไมม ร

รปหลายเหลยมนน (convex polygon)

• สำาหรบจดสองจดใดๆ ทอยในรปหลายเหลยม เมอ ลากสวนของเสนตรงเชอมจดสองจดนน สวนของ

เสนตรงนนตองอยในรปหลายเหลยมนนดวย• ขอสงเกต: สามเหลยมเปนรปหลายเหลยมนน

เสมอ

รปหลายเหลยมนน ไมใชรปหลายเหลยมนน

รปหลายเหลยมใดๆ• แลวเราจะวาดรปหลายเหลยมทไมใชรปหลาย

เหลยมนน หรอรปหลายเหลยมทมรอยางไร?• แยกรปหลายเหลยมเหลานนออกเปนรปหลาย

เหลยมนนหลายๆ รป

top related