418382...
description
Transcript of 418382...
418382 สภาพแวดล้อมการทำ�างานคอมพ�วเตอร�กราฟิ�กส�การบรรยายคร��งทำ�� 4
ประม"ข ข�นเง�น[email protected]
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
• ปร�มาตรของบร�เวณทำ��เห็*นเป$นปร�ซึ3ม• ไม(ม� foreshortening กล้(าวค+อ ไม(ว(าว�ตถุ"จะอย5(ใกล้
ไกล้ก*เห็*นขนาดเทำ(าก�นห็มด• ห็ล้�งจากฉาก เสนขนานย�งเป$นเสนขนานอย5(• ใช้ในโปรแกรมช้(วยเข�ยนแบบ/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
• น�ยามไดโดยการน�ยามปร�ซึ3มของปร�มาตรทำ��เราตองการมองเห็*น
• ปร�ซึ3มน��สามารถุน�ยามไดดวยต�วเล้ข 3 ค5(– left แล้ะ right --- ขอบเขตในแนวแกน x– top แล้ะ bottom --- ขอบเขตในแนวแกน y– near แล้ะ far --- ขอบเขตในแนวแกน -z (เพราะเรามองในแนว -z)
• ค(าทำ��งห็กเป$นพ�ก�ดใน eye space• ปร�ซึ3มทำ��น�ยามค+อ
{(x,y,z) : left ≤ x ≤ right, top ≤ y ≤ bottom, near ≤ -z ≤ far}
ปร�ซึ3มปร�มาตรทำ��มองเห็*น
การน�ยาม 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)– ค5ณ matrix ป8จจ"บ�นดวย matrix ของ orthographic
projection ในห็นาก(อน– ก(อนใช้ควรเร�ยก
glMatrixMode(GL_PROJECTION)glLoadIdentity()
ก(อนเพ+�อเปล้��ยน mode แล้ะเคล้�ยร�ค(า projection matrix เด�ม
• glOrtho2D(left, right, bottom, top)– เห็ม+อนก�บ glOrtho แต(ให็ค(า near เป$น 0 แล้ะ ค(า far เป$น 1
Perspective Projection
• ปร�มาตรของบร�เวณทำ��เห็*นเป$น frustum (ป9ระม�ดยอดต�ด)
• ม� foreshortening กล้(าวค+อ อะไรทำ��อย5(ใกล้จะเห็*นให็ญ(กว(า
• ห็ล้�งจากฉายแล้ว เสนขนานอาจจะไม(ขนานก�นเห็ม+อนเด�ม
• ให็ความเป$นสามม�ต� เพราะเห็ม+อนก�บทำ��ตาคนทำ�างาน ทำ�าให็เห็ม+อนเขาไปอย5(ในฉากจร�งๆ
• ใช้ก�บโปรแกรมทำางความบ�นเทำ�ง
Perspective Projection (ต(อ)
Perspective Projection (cont.)
orthographic perspective
การน�ยาม Perspective Projection
• น�ยามดวยเล้ข 6 ต�วเห็ม+อนก�บ orthographic projection
การน�ยาม Perspective Projection (ต(อ)
• ปร�มาตรทำ��มองเห็*นค+อป9ระม�ดยอดต�ดทำ��ม�ยอดเป$นส��เห็ล้��ยม{(x,y,z) : left ≤ x ≤ right, bottom ≤ y ≤ top,
z = -near}ซึ3�งยอดของม�นถุ5กฉายต(อไปจนถุ3ง z = -far
การน�ยาม Perspective Projection (ต(อ)
• ให็จ"ด (x,y,z) มาใน eye space แล้วม�นจะถุ5กแปล้งเป$นอะไรใน 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 (ต(อ)
• อาศั�ยความร5 เร+�องสามเห็ล้��ยมคล้าย ไดว(าด�งน��น
???, 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 (ต(อ)
• เราร5 ว(า ส�าห็ร�บค(าคงทำ�� 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 จะถุ5กใช้เป$น ความล้3ก ของ “ ” fragment
• zclip จะตองม�ค"ณสมบ�ต�สองประการ– ถุา z นอย zclip ก*ตองนอยตามไปดวย– perspective matrix จะตองส(งเสนตรงไปย�งเสนตรง
• ต�วอย(าง zclip ทำ��ใช้ไม(ได– zclip=z
– 222 zyxzclip
การน�ยาม Perspective Projection (ต(อ)
• zclip ทำ�� OpenGL ใช้ม�ร5ป
• เน+�องจาก 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)– ค5ณ matrix ป8จจ"บ�นดวย matrix ของ perspective
projection ในห็นาก(อน– ก(อนใช้ควรเร�ยก
glMatrixMode(GL_PROJECTION)glLoadIdentity()
ก(อนเพ+�อเปล้��ยน mode แล้ะเคล้�ยร�ค(า projection matrix เด�ม
ค�าส��ง OpenGL เก��ยวก�บ Perspective Projection (ต(อ)
• gluPerspective(fovy, aspect, near, far)– ค5ณ matrix ป8จจ"บ�นดวย 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 ห็มายถุ3งความกวางของม"มมองตามแนวแกน y (ม�ห็น(วยเป$นองศัา)
– aspect ค+อ aspect ratio ของห็นาต�ดของป9ระม�ด– ป9ระม�ดทำ�� gluPerspective สรางม�ห็นาตาเป$นด�งขาง
ล้(าง
ค�าส��ง OpenGL เก��ยวก�บ Perspective Projection (ต(อ)
• ส�งเกตว(าค�าส��ง glFrustum สามารถุสรางป9ระม�ดทำ��ไม(สมมาตรรอบแกน z ได
• แต(ป9ระม�ดทำ��สรางดวย gluPerspective จะเป$นป9ระม�ดทำ��สมมาตรรอบแกน 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