rasterization

Download Report

Transcript rasterization

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
• ปริมาตรของบริเวณที่เห็นเป็ นปริซมึ
• ไม่มี foreshortening กล่าวคือ ไม่วา่ วัตถุจะอยูใ่ กล้ ไกลก็เห็น
ขนาดเท่ากันหมด
• หลังจากฉาก เส้ นขนานยังเป็ นเส้ นขนานอยู่
• ใช้ ในโปรแกรมช่วยเขียนแบบ/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 คู่
– left และ right --- ขอบเขตในแนวแกน x
– top และ bottom --- ขอบเขตในแนวแกน y
– near และ far --- ขอบเขตในแนวแกน -z (เพราะเรามองในแนว -z)
• ค่าทังหกเป็
้
นพิกดั ใน eye space
• ปริ ซมึ ที่นิยามคือ
{(x,y,z) : left ≤ x ≤ right, top ≤ y ≤ bottom,
near ≤ -z ≤ far}
ปริ ซึมปริ มาตรที่มองเห็น
การนิยาม 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
 2
r  l

 0

 0

 0

0
0
2
t b
0
0
0
2
f n
0
r l 

r l 

t b


t b 
f  n

f  n

1 
คาสัง่ OpenGL เกี่ยวกับ
Orthographic Projection
• glOrtho(left, right, bottom, top, near, far)
– คูณ matrix ปั จจุบนั ด้ วย matrix ของ orthographic
projection ในหน้ าก่อน
– ก่อนใช้ ควรเรี ยก
glMatrixMode(GL_PROJECTION)
glLoadIdentity()
ก่อนเพื่อเปลี่ยน mode และเคลียร์ คา่ projection matrix เดิม
• glOrtho2D(left, right, bottom, top)
– เหมือนกับ glOrtho แต่ให้ คา่ near เป็ น 0 และ ค่า far เป็ น 1
Perspective Projection
•
•
•
•
ปริมาตรของบริเวณที่เห็นเป็ น frustum (ปี ระมิดยอดตัด)
มี foreshortening กล่าวคือ อะไรที่อยูใ่ กล้ จะเห็นใหญ่กว่า
หลังจากฉายแล้ ว เส้ นขนานอาจจะไม่ขนานกันเหมือนเดิม
ให้ ความเป็ นสามมิติ เพราะเหมือนกับที่ตาคนทางาน ทาให้ เหมือนเข้ า
ไปอยูใ่ นฉากจริงๆ
• ใช้ กบั โปรแกรมทางความบันเทิง
Perspective Projection (ต่อ)
Perspective Projection (cont.)
orthographic
perspective
การนิยาม Perspective Projection
• นิยามด้ วยเลข 6 ตัวเหมือนกับ orthographic projection
การนิยาม Perspective Projection (ต่อ)
• ปริมาตรที่มองเห็นคือปี ระมิดยอดตัดที่มียอดเป็ นสี่เหลี่ยม
{(x,y,z) : left ≤ x ≤ right, bottom ≤ y ≤ top,
z = -near}
ซึง่ ยอดของมันถูกฉายต่อไปจนถึง z = -far
การนิยาม Perspective Projection (ต่อ)
• ให้ จดุ (x,y,z) มาใน eye space แล้ วมันจะถูกแปลงเป็ นอะไรใน
clip space?
xclip  1
xclip  1
zeye   f
(x,y,z)
zeye  z
zeye  n
xeye  l
xeye  r
(0,0,0)
การนิยาม Perspective Projection (ต่อ)
• หา x ใน clip space
xclip  1
xclip  ??? x  1
clip
zeye   f
(x,y,z)
zeye  z
zeye  n
xeye  l
xeye  r
(0,0,0)
การนิยาม Perspective Projection (ต่อ)
• เริ่มจากการหา x ใน eye space ของจุดปลายสองจุด
xclip  1
xeye,left  ???
xclip  ??? x  1
clip
(x,y,z)
xeye,right
zeye   f
 ???
zeye  z
zeye  n
xeye  l
xeye  r
(0,0,0)
การนิยาม Perspective Projection (ต่อ)
• อาศัยความรู้เรื่ องสามเหลี่ยมคล้ าย ได้ วา่
zr
ดังนัน้ xeye,right   n
xeye,right
r
z

n
xeye,right  ???
zeye  z
zeye  n
xeye  r
(0,0,0)
การนิยาม Perspective Projection (ต่อ)
• ทานองเดียวกัน
xeye,left
l
z

n
xeye,left  ???
ดังนัน้
xeye,left
zl

n
zeye  z
zeye  n
xeye  l
(0,0,0)
การนิยาม Perspective Projection (ต่อ)
• เรารู้วา่ xclip  ax  b สาหรับค่าคงที่ a และ b บางตัว
xclip  1 xclip  ??? xclip  1
(x,y,z)
xeye,left
zl

n
zeye  z
xeye,right
(0,0,0)
zr

n
การนิยาม Perspective Projection (ต่อ)
• เนื่องจากถ้ า x = -zl/n แล้ ว xclip = -1
และถ้ า x = -zr/n แล้ ว xclip = 1
• ได้ วา่
zl
 1  a
b
n
zr
1  a  b
n
• เมื่อแก้ สมการออกมาจะได้ วา่
2n
(r  l ) z
r l
b
r l
a
การนิยาม Perspective Projection (ต่อ)
• กล่าวคือ
2n
r l
xclip  
x
(r  l ) z
r l
• ในทานองเดียวกันเราก็จะได้ วา่
2n
t b
yclip  
y
(t  b) z
t b
การนิยาม Perspective Projection (ต่อ)
• แล้ ว zclip ควรจะมีคา่ เท่าไหร่?
• ค่า zclip จะถูกใช้ เป็ น “ความลึก” ของ fragment
• zclip จะต้ องมีคณ
ุ สมบัติสองประการ
– ถ้ า z น้ อย zclip ก็ต้องน้ อยตามไปด้ วย
– perspective matrix จะต้ องส่งเส้ นตรงไปยังเส้ นตรง
• ตัวอย่าง zclip ที่ใช้ ไม่ได้
– zclip=z
– zclip 
x y z
2
2
2
การนิยาม Perspective Projection (ต่อ)
• zclip ที่ OpenGL ใช้ มีรูป
B
z clip  A 
z
• เนื่องจาก zclip= -1 ถ้ า z = -n
และ zclip= 1 ถ้ า z = -f
จะได้ วา่
B
1  A 
n
B
1 A
f
การนิยาม Perspective Projection (ต่อ)
• เมื่อแก้ สมการออกมาแล้ วจะได้ วา่
• กล่าวคือ
2 fn
B
f n
f n
A
f n
f n
2 fn
zclip 

f  n ( f  n) z
การนิยาม Perspective Projection (ต่อ)
• กล่าวคือ perspective projection matrix จะต้ องส่ง
x
 y
 
z
 
1 
ไปยัง
2n
r  l   2n

r l 

x

x
z 
 (r  l ) z


r l
r l

  r l

2
n
t

b
2
n
t

b

 
y
y
z 
 (t  b) z
t b   t b
t b 
 f n
2 fn   f  n z  2 fn 


  f n

f

n
f

n
(
f

n
)
z

 


z
1


 
Matrix ของ Perspective Projection
 2n
r  l

 0

 0

 0

0
2n
t b
0
0
r l
r l
t b
t b
f n

f n
1

0 

0 

2 fn 

f  n

0 
คาสัง่ OpenGL เกี่ยวกับ
Perspective Projection
• glFrustum(left, right, bottom, top, near, far)
– คูณ matrix ปั จจุบนั ด้ วย matrix ของ perspective
projection ในหน้ าก่อน
– ก่อนใช้ ควรเรี ยก
glMatrixMode(GL_PROJECTION)
glLoadIdentity()
ก่อนเพื่อเปลี่ยน mode และเคลียร์ คา่ projection matrix เดิม
คาสัง่ OpenGL เกี่ยวกับ
Perspective Projection (ต่อ)
• gluPerspective(fovy, aspect, near, far)
– คูณ matrix ปั จจุบนั ด้ วย 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 หมายถึงความกว้ างของมุมมองตาม
แนวแกน y (มีหน่วยเป็ นองศา)
– aspect คือ aspect ratio ของหน้ าตัดของปี ระมิด
– ปี ระมิดที่ gluPerspective สร้ างมีหน้ าตาเป็ นดังข้ างล่าง
คาสัง่ OpenGL เกี่ยวกับ
Perspective Projection (ต่อ)
• สังเกตว่าคาสัง่ glFrustum สามารถสร้ างปี ระมิดที่ไม่สมมาตรรอบ
แกน z ได้
• แต่ปีระมิดที่สร้ างด้ วย gluPerspective จะเป็ นปี ระมิดที่สมมาตร
รอบแกน 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_BIT
glClear(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