418382...
Post on 18-Jan-2016
47 Views
Preview:
DESCRIPTION
TRANSCRIPT
418382 สภาพแวดล้อมการทำ�างานคอมพ�วเตอร�กราฟิ�กส�
การบรรยายคร��งทำ�� 4 ประม!ข ข�นเง�น
pramook@gmail.com
RASTERIZATION
Projection Transformation
• เปล้��ยน eye space เป#น clip space• พ�ก�ดใน clip space จะใช้เป#นต�วบอกว'าเราจะเห็)น
vertex ใดห็ร*อไม'เห็)น vertex ใด• กระบวนการต�ดส�นใจ: vertex ทำ��เห็)นจะตองม�– -1 ≤ x ≤ 1– -1 ≤ y ≤ 1– -1 ≤ z ≤ 1
• Projection transform ย�งม�ผล้ต'อล้�กษณะภาพทำ��เราเห็)นอ�กดวย
Projection Transform ใน OpenGL
• OpenGL จะจ�า matrix ของ projection transform เอาไว• เวล้าตองการเปล้��ยนแปล้ง projection matrix ให็เปล้��ยน
mode ของ matrix เป#น GL_PROJECTION ดวยค�าส��งglMatrixMode(GL_PROJECTION);
• ห็ล้�งจากน��นใช้ค�าส��งในการเปล้��ยนแปล้ง matrix อ*�นแบบ เด�ม เช้'น glLoadIdentity(), glMultMatrix(…), ฯล้ฯ
• ส'วนมากเราจะส��ง glLoadIdentity() ทำ�นทำ�ห็ล้�งจากส��งglMatrixMode(GL_PROJECTION) เสร)จแล้ว เพ*�อเคล้�ยร�
ค'า projection matrix ก'อนใส'ค'าให็ม'
Projection Transformation ทำ��ส�าค�ญ 2 แบบ
• Orthographic Projection• Perspective Projection
Orthographic Projection
• ปร�มาตรของบร�เวณทำ��เห็)นเป#นปร�ซึ2ม• ไม'ม� foreshortening กล้'าวค*อ ไม'ว'าว�ตถุ!จะอย4'ใกล้
ไกล้ก)เห็)นขนาดเทำ'าก�นห็มด• ห็ล้�งจากฉาก เสนขนานย�งเป#นเสนขนานอย4'• ใช้ในโปรแกรมช้'วยเข�ยนแบบ/CAD เน*�องจากขนาด
ของว�ตถุ!เป#นเร*�องส�าค�ญ
Orthographic Projection (ต'อ)
http://www2.arts.ubc.ca/TheatreDesign/crslib/drft_1/orthint.htm
Orthographic Projection (ต'อ)
http://www2.arts.ubc.ca/TheatreDesign/crslib/drft_1/cad/wdstv.htm
การน�ยาม Orthographic Projection
• น�ยามไดโดยการน�ยามปร�ซึ2มของปร�มาตรทำ��เราตองการมองเห็)น
• ปร�ซึ2มน��สามารถุน�ยามไดดวยต�วเล้ข 3 ค4'– left แล้ะ right --- ขอบเขตในแนวแกน x– top แล้ะ bottom --- ขอบเขตในแนวแกน y– near แล้ะ far --- ขอบเขตในแนวแกน -z ( เพราะเรามองในแนว -z)
• ค'าทำ��งห็กเป#นพ�ก�ดใน eye space• ปร�ซึ2มทำ��น�ยามค*อ
{(x,y,z) : left ≤ x ≤ right, top ≤ y ≤ bottom, near ≤ -z ≤ far}
ปร�ซึ2มปร�มาตรทำ��มองเห็)น
การน�ยาม Orthographic Projection (ต'อ)
• Matrix ของ orthographic projection ตองทำ�าอะไรบา– ส'ง x = left ไป x = -1– ส'ง x = right ไป x = 1– ส'ง y = bottom ไป y = -1– ส'ง y = top ไป y = 1– ส'ง z = -far ไป z = 1– ส'ง z = -near ไป z = -1
Matrix ของ Orthographic Projection
1000
200
02
0
002
nf
nf
nf
bt
bt
bt
lr
lr
lr
ค�าส��ง OpenGL เก��ยวก�บOrthographic Projection
• glOrtho(left, right, bottom, top, near, far)– ค4ณ matrix ป7จจ!บ�นดวย matrix ของ orthographic
projection ในห็นาก'อน– ก'อนใช้ควรเร�ยก
glMatrixMode(GL_PROJECTION)glLoadIdentity()
ก'อนเพ*�อเปล้��ยน mode แล้ะเคล้�ยร�ค'า projection matrix เด�ม
• glOrtho2D(left, right, bottom, top)– เห็ม*อนก�บ glOrtho แต'ให็ค'า near เป#น 0 แล้ะ ค'า far เป#น 1
Perspective Projection
• ปร�มาตรของบร�เวณทำ��เห็)นเป#น frustum (ป8ระม�ดยอดต�ด)
• ม� foreshortening กล้'าวค*อ อะไรทำ��อย4'ใกล้จะเห็)นให็ญ'กว'า
• ห็ล้�งจากฉายแล้ว เสนขนานอาจจะไม'ขนานก�นเห็ม*อนเด�ม
• ให็ความเป#นสามม�ต� เพราะเห็ม*อนก�บทำ��ตาคน ทำ�างาน ทำ�าให็เห็ม*อนเขาไปอย4'ในฉากจร�งๆ
• ใช้ก�บโปรแกรมทำางความบ�นเทำ�ง
Perspective Projection (ต'อ)
Perspective Projection (cont.)
orthographic perspective
การน�ยาม Perspective Projection
• น�ยามดวยเล้ข 6 ต�วเห็ม*อนก�บ orthographic projection
การน�ยาม Perspective Projection (ต'อ)
• ปร�มาตรทำ��มองเห็)นค*อป8ระม�ดยอดต�ดทำ��ม�ยอดเป#นส��เห็ล้��ยม{(x,y,z) : left ≤ x ≤ right, bottom ≤ y ≤ top,
z = -near} ซึ2�งยอดของม�นถุ4กฉายต'อไปจนถุ2ง z = -far
การน�ยาม Perspective Projection (ต'อ)
• ให็จ!ด (x,y,z) มาใน eye space แล้วม�นจะถุ4กแปล้ง เป#นอะไรใน clip space?
nzeye
fzeye
1clipx
lxeye
zzeye
(0,0,0)
rxeye
1clipx
(x,y,z)
การน�ยาม Perspective Projection (ต'อ)
• ห็า x ใน clip space
nzeye
fzeye
1clipx
lxeye
zzeye
(0,0,0)
rxeye
1clipx
(x,y,z)
???clipx
การน�ยาม Perspective Projection (ต'อ)
• เร��มจากการห็า x ใน eye space ของจ!ดปล้ายสองจ!ด
nzeye
fzeye
1clipx
lxeye
zzeye
(0,0,0)
rxeye
1clipx
(x,y,z)
???clipx
???, righteyex???, lefteyex
การน�ยาม Perspective Projection (ต'อ)
• อาศั�ยความร4 เร*�องสามเห็ล้��ยมคล้าย ไดว'าด�งน��น
???, righteyex
rxeye
nzeye
zzeye
(0,0,0)
n
z
r
x righteye
,
n
zrx righteye ,
การน�ยาม Perspective Projection (ต'อ)
• ทำ�านองเด�ยวก�น ด�งน��น
nzeye
lxeye
zzeye
(0,0,0)
???, lefteyex
n
z
l
x lefteye
,
n
zlx lefteye ,
การน�ยาม Perspective Projection (ต'อ)
• เราร4 ว'า ส�าห็ร�บค'าคงทำ�� a แล้ะ b บางต�ว
1clipx
zzeye
(0,0,0)
1clipx
(x,y,z)
???clipx
n
zrx righteye ,
n
zlx lefteye ,
baxxclip
การน�ยาม Perspective Projection (ต'อ)
• เน*�องจากถุา x = -zl/n แล้ว xclip = -1
แล้ะถุา x = -zr/n แล้ว xclip = 1• ไดว'า
• เม*�อแกสมการออกมาจะไดว'า
bn
zra
bn
zla
1
1
lr
lrb
zlr
na
)(
2
การน�ยาม Perspective Projection (ต'อ)
• กล้'าวค*อ
• ในทำ�านองเด�ยวก�นเราก)จะไดว'าlr
lrxzlr
nxclip
)(
2
bt
btyzbt
nyclip
)(
2
การน�ยาม Perspective Projection (ต'อ)
• แล้ว zclip ควรจะม�ค'าเทำ'าไห็ร'?• ค'า zclip “ ” จะถุ4กใช้เป#น ความล้2ก ของ fragment
• zclip จะตองม�ค!ณสมบ�ต�สองประการ– ถุา z นอย zclip ก)ตองนอยตามไปดวย– perspective matrix จะตองส'งเสนตรงไปย�งเสนตรง
• ต�วอย'าง zclip ทำ��ใช้ไม'ได– zclip=z–
222 zyxzclip
การน�ยาม Perspective Projection (ต'อ)
• zclip ทำ�� OpenGL ใช้ม�ร4ป
• เน*�องจาก zclip= -1 ถุา z = -n
แล้ะ zclip= 1 ถุา z = -f
จะไดว'า
z
BAzclip
f
BA
n
BA
1
1
การน�ยาม Perspective Projection (ต'อ)
• เม*�อแกสมการออกมาแล้วจะไดว'า
• กล้'าวค*อnf
nfA
nf
fnB
2
znf
fn
nf
nfzclip )(
2
การน�ยาม Perspective Projection (ต'อ)
• กล้'าวค*อ perspective projection matrix จะตองส'ง
1
z
y
x
znf
fnz
nf
nf
zbt
bty
bt
n
zlr
lrxlr
n
znf
fn
nf
nfbt
btyzbt
nlr
lrxzlr
n
2
2
2
1)(
2)(
2)(
2
ไปย�ง
Matrix ของ Perspective Projection
0100
200
02
0
002
nf
fn
nf
nfbt
bt
bt
nlr
lr
lr
n
ค�าส��ง OpenGL เก��ยวก�บPerspective Projection
• glFrustum(left, right, bottom, top, near, far)– ค4ณ matrix ป7จจ!บ�นดวย matrix ของ perspective
projection ในห็นาก'อน– ก'อนใช้ควรเร�ยก
glMatrixMode(GL_PROJECTION)glLoadIdentity()
ก'อนเพ*�อเปล้��ยน mode แล้ะเคล้�ยร�ค'า projection matrix เด�ม
ค�าส��ง OpenGL เก��ยวก�บPerspective Projection (ต'อ)
• gluPerspective(fovy, aspect, near, far)– ค4ณ matrix ป7จจ!บ�นดวย perspective projection
matrix เช้'นเด�ยวก�บ glFrustrum– ม�ผล้เห็ม*อนก�บส��ง glFrustum โดยได• top = near * tan(fovy / 2)• bottom = -top• right = aspect * top• left = -right
ค�าส��ง OpenGL เก��ยวก�บPerspective Projection (ต'อ)
– fovy ย'อมาจาก field of view Y ห็มายถุ2งความกวาง ของม!มมองตามแนวแกน y (ม�ห็น'วยเป#นองศัา)
– aspect ค*อ aspect ratio ของห็นาต�ดของป8ระม�ด– ป8ระม�ดทำ�� gluPerspective สรางม�ห็นาตาเป#นด�งขาง
ล้'าง
ค�าส��ง OpenGL เก��ยวก�บPerspective Projection (ต'อ)
• ส�งเกตว'าค�าส��ง glFrustum สามารถุสรางป8ระม�ดทำ�� ไม'สมมาตรรอบแกน z ได
• แต'ป8ระม�ดทำ��สรางดวย gluPerspective จะเป#นป8ระ ม�ดทำ��สมมาตรรอบแกน z เสมอ
RASTERIZATION
HIDDEN SURFACE REMOVAL
DEPTH BUFFER ใน OPENGL
เม*�อ Render โดยไม'ม� Depth Buffer
จร�งๆ แล้ว code เป#นอย'างน��glColor3d(0.5, 1, 0.5);glBegin(GL_TRIANGLES);glVertex3d(0, 0.5, 0);glVertex3d(-0.5, -0.5, 0);glVertex3d(0.5, -0.5, 0);glEnd();
glColor3d(1, 0.5, 0.5);glBegin(GL_TRIANGLES);glVertex3d(0, -0.75, 1);glVertex3d(0.40, 0, 1);glVertex3d(-0.40, 0.30, -1);glEnd();
จร�งๆ แล้วภาพควรจะเป#นแบบน��
การใช้ Depth Buffer ใน GLUT
• เวล้าส��ง glutInitDisplayMode ให็เพ��ม GLUT_DEPTH ดวยglutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE | GLUT_DEPTH)
• เร�ยก glEnable(GL_DEPTH_TEST)
• เวล้าเร�ยก glClear ให็เพ��ม GL_DEPTH_BUFFER_BITglClear(GL_COLOR_BUFFER_BIT | GLUT_DEPTH_BUFFER_BIT)
โคดต�วอย'างint main(int argc, char **argv){glutInit(&argc, argv);glutInitDisplayMode(GLUT_RGBA | GLUT_DOUBLE);glutInitWindowSize(600, 600);glutCreateWindow("No Depth Buffering");glutDisplayFunc(display);glEnable(GL_DEPTH_TEST);glutMainLoop();return 0;
}
ILLUMINATION
top related