intTypePromotion=1
zunia.vn Tuyển sinh 2024 dành cho Gen-Z zunia.vn zunia.vn
ADSENSE

Bài giảng Đồ họa và hiện thực ảo - Bài 3: Các giải thuật cơ sở

Chia sẻ: Ti Vu | Ngày: | Loại File: PDF | Số trang:10

43
lượt xem
3
download
 
  Download Vui lòng tải xuống để xem tài liệu đầy đủ

Bài 3 trình bày về các phép giải thuật cơ sở. Nội dung chính trong chương này gồm có: Các giải thuật xén tỉa - Clipping, các thuật toán tô miền kín, phép xử lý Antialiasing. Mời các bạn cùng tham khảo.

Chủ đề:
Lưu

Nội dung Text: Bài giảng Đồ họa và hiện thực ảo - Bài 3: Các giải thuật cơ sở

Khoa CNTT-DDHBK Hà nội<br /> Email: hunglt@it-hut.edu.vn<br /> 0913030731<br /> <br /> Nội dung<br /> <br /> Các giải thuật cơ sở<br /> <br /> Bài 3<br /> <br /> Các giải thuật xén tỉa - Clipping<br /> z Các thuật toán tô miền kín<br /> z Phép xử lý Antialiasing<br /> z<br /> <br /> Le Tan Hung<br /> hunglt@it-hut.edu.vn<br /> 0913030731<br /> <br /> 2<br /> <br /> 1<br /> <br /> Xén tỉa - Clipping<br /> <br /> Clipping đoạn thẳng<br /> <br /> Khái niệm<br /> Xén tỉa là tiến trình tự động xác định<br /> các điểm của 1 đối tượng nằm trong<br /> hay ngoài cửa sổ hiển thị<br /> Tiết kiệm thời gian tiến trình rasterize<br /> bỏ qua phần nằm ngoài cửa sổ hiển<br /> thị<br /> ymax<br /> Clipping điểm<br /> xmin ≤ x ≤ xmax<br /> ymin ≤ y ≤ ymax<br /> <br /> z<br /> <br /> Tiến trình, giải thuật kiểm tra chấp nhận các<br /> đoạn thẳng nằm trong và loại bỏ các đoạn thẳng<br /> nằm ngoài dựa trên 2 điểm đầu cuối<br /> Lý do:<br /> Không kiểm tra mọi điểm trên đoạn thẳng<br /> Hầu hết các đoạn thẳng với 1 màn hình hiển thị<br /> đều được chấp nhận hoặc loại bỏ<br /> Rất ít các đợn thẳng cắt cửa sổ hiển thị<br /> <br /> Giải thuật Cohen-Sutherland<br /> thực hiện nhanh với các trương<br /> hợp đoạn thẳng nằm trong hay<br /> ngoài cửa sổ hiện thị<br /> <br /> z<br /> <br /> If P1.code OR P2.code == 0000<br /> <br /> z<br /> <br /> If P1.code AND P2.code != 0000<br /> <br /> z<br /> <br /> Mỗi điểm đầu cuối được gán mã<br /> code phụ thuộc vào vị trí trong<br /> mặt phẳng mã<br /> <br /> z<br /> <br /> z<br /> <br /> p.code = 0000<br /> If p.x > P.code or 0001<br /> If p.y > P.code or 0100<br /> If p.x >= xmax >> P.code or 0010<br /> If p.y >= ymax >> P.code or 1000<br /> <br /> z<br /> <br /> z<br /> <br /> z<br /> <br /> z<br /> <br /> xmin<br /> <br /> z<br /> <br /> xmax<br /> <br /> z<br /> z<br /> <br /> ymin<br /> <br /> 3<br /> <br /> 4<br /> <br /> Giải thuật Cohen Sutherland Outcode<br /> z<br /> <br /> z<br /> z<br /> z<br /> z<br /> <br /> 5<br /> <br /> –<br /> <br /> Chấp nhận toàn đoạn thẳng<br /> <br /> – Loại<br /> Với truờng hợp cắt, giải thuật xác định lại<br /> điểm đầu cuối là giao của đoạn thẳng và<br /> khung bao của cửa sổ hiển thị<br /> <br /> 6<br /> <br /> 1<br /> <br /> Khoa CNTT-DDHBK Hà nội<br /> Email: hunglt@it-hut.edu.vn<br /> 0913030731<br /> <br /> Liabarsky<br /> <br /> z<br /> <br /> x = x1 + (x2 - x1)u = x1 + uDx<br /> y = y1 + (y2 - y1)u = y1 + uDy<br /> xmin ≤ x1 + Dx.u ≤ xmax ⇔ x ∈ [xm, xM]<br /> ymin ≤ y1 + Dy.u ≤ ymax ⇔ y ∈ [ym, yM]<br /> <br /> z<br /> <br /> Pk u ≤ qk<br /> <br /> z<br /> z<br /> z<br /> <br /> z<br /> <br /> k = 1, 2, 3, 4<br /> <br /> ⎧q1 = x1 − xm<br /> ⎪q = x − x<br /> ⎪ 2<br /> M<br /> 1<br /> ⎨<br /> ⎪q3 = y1 − ym<br /> ⎪⎩q4 = y M − y1<br /> <br /> z<br /> <br /> ⎧<br /> ⎪<br /> ⎪<br /> ⎨<br /> ⎪<br /> ⎪⎩<br /> <br /> P1 = − Dx<br /> <br /> z<br /> <br /> P 2 = Dx<br /> <br /> Nếu Pk = 0 : điều đó tương đương với việc đoạn thẳng<br /> đang xét song song với cạnh thứ k của hình chữ nhật<br /> clipping.<br /> a) Nếu qk < 0 ⇒ Đường thẳng nằm ngoài cửa sổ (hệ bất<br /> phương trình trên vô nghiệm)<br /> b)Nếu qk >= 0 thì đoạn thẳng nằm trong hoặc nằm trên<br /> cạnh của cửa sổ clipping.<br /> Hệ bất phương trình luôn thoả mãn.<br /> <br /> P 3 = − Dy<br /> P 4 = Dy<br /> <br /> 7<br /> <br /> 8<br /> <br /> z<br /> <br /> 9<br /> <br /> z<br /> <br /> Nếu Pk ≠ 0 : đoạn thẳng đang xét sẽ cắt cạnh k tương ứng<br /> của cửa sổ clipping tại vị trí trên đoạn thẳng uk = qk/Pk.<br /> – Pk < 0 đoạn thẳng có dạng đi từ ngoài vào trong<br /> z bất phương trình sẽ có dạng u ≥ qk/Pk Ù u ≥ uk.<br /> – Pk > 0<br /> z u ≥ uk sẽ thuộc cửa sổ hiển thị.<br /> z bất phương trình sẽ có dạng u ≤ qk/Pk<br /> z u ≤ uk với uk = qk/Pk là giao của đoạn thẳng với<br /> cạnh k của cửa sổ clipping<br /> z đoạn thẳng có dạng đi từ trong ra ngoài so với cạnh<br /> k.<br /> <br /> z<br /> <br /> Pk < 0 và uk < 0<br /> –<br /> –<br /> <br /> –<br /> <br /> cạnh k của cửa sổ clipping cắt đoạn thẳng tại phần mở rộng<br /> nằm ngoài đoạn thẳng.<br /> uk ≤ u< 0 thoả mãn bất phương trình sẽ không nằm trên đoạn<br /> thẳng cần xét.<br /> => uk sẽ nhận là 0 khi uk 0 và uk > 1<br /> <br /> z<br /> <br /> điểm nằm trong cửa sổ clipping sẽ có dạng như sau:<br /> <br /> –<br /> <br /> –<br /> <br /> => uk tương ứng sẽ nhận giá trị 1.<br /> U 1 ≤ u ≤ U2<br /> <br /> 10<br /> <br /> Sutherland-Hodgman Clipping<br /> z<br /> <br /> –<br /> <br /> ⎛<br /> ⎧<br /> ⎫⎞<br /> q<br /> U 2 = min⎜ {1}∪ ⎨u k : u k = k , Pk > 0 ⎬ ⎟<br /> ⎜<br /> ⎟<br /> Pk<br /> ⎩<br /> ⎭⎠<br /> ⎝<br /> ⎛<br /> ⎧<br /> ⎫⎞<br /> q<br /> U 1 = max ⎜ {0}∪ ⎨u k : u k = k , Pk < 0 ⎬ ⎟<br /> ⎜<br /> ⎟<br /> Pk<br /> ⎩<br /> ⎭⎠<br /> ⎝<br /> 11<br /> <br /> Basic idea:<br /> –<br /> –<br /> <br /> Consider each edge of the viewport individually<br /> Clip the polygon against the edge equation<br /> After doing all planes, the polygon is fully clipped<br /> <br /> 12<br /> <br /> 2<br /> <br /> Khoa CNTT-DDHBK Hà nội<br /> Email: hunglt@it-hut.edu.vn<br /> 0913030731<br /> <br /> Sutherland-Hodgman Clipping<br /> z<br /> <br /> Input/output for algorithm:<br /> –<br /> –<br /> <br /> z<br /> <br /> Sutherland-Hodgman Clipping<br /> z<br /> <br /> Input: list of polygon vertices in order<br /> Output: list of clipped poygon vertices consisting of<br /> old vertices (maybe) and new vertices (maybe)<br /> <br /> Sutherland-Hodgman basic routine:<br /> –<br /> –<br /> –<br /> <br /> Note: this is exactly what we expect from the<br /> clipping operation against each edge<br /> <br /> 13<br /> <br /> Go around polygon one vertex at a time<br /> Current vertex has position p<br /> Previous vertex had position s, and it has been added<br /> to the output if appropriate<br /> <br /> 14<br /> <br /> Sutherland-Hodgman Clipping<br /> z<br /> <br /> Sutherland-Hodgman Clipping<br /> <br /> Edge from s to p takes one of four cases:<br /> <br /> z<br /> <br /> (Purple line can be a line or a plane)<br /> inside<br /> <br /> outside<br /> <br /> inside<br /> <br /> outside<br /> <br /> inside<br /> <br /> Four cases:<br /> –<br /> <br /> outside<br /> <br /> p<br /> s<br /> <br /> inside<br /> <br /> p<br /> <br /> s inside plane and p inside plane<br /> z<br /> <br /> outside<br /> <br /> z<br /> <br /> s<br /> <br /> –<br /> <br /> s inside plane and p outside plane<br /> z<br /> z<br /> <br /> p<br /> <br /> s<br /> <br /> p output<br /> <br /> i output<br /> <br /> no output<br /> <br /> –<br /> <br /> s outside plane and p inside plane<br /> z<br /> <br /> i output<br /> p output<br /> <br /> z<br /> <br /> Add nothing<br /> Find intersection point i<br /> Add i to output, followed by p<br /> <br /> 16<br /> <br /> Giải thuật Cyrus-Beck<br /> Liang Barsky<br /> z<br /> z<br /> z<br /> z<br /> <br /> 17<br /> <br /> s outside plane and p outside plane<br /> z<br /> <br /> 15<br /> <br /> Find intersection point i<br /> Add i to output<br /> <br /> –<br /> <br /> s<br /> <br /> p<br /> <br /> Add p to output<br /> Note: s has already been added<br /> <br /> 3-D Clipping<br /> <br /> Giải Cohen-Sutherland yêu cầu cửa sổ là hình chữ<br /> nhật, các cạnh là cạnh của màn hình<br /> Vấn đề nảy sinh khi cửa sổ clip là 1 đa giác bất kỳ<br /> hoặc hình chữ nhật quay đi 1 góc<br /> Giải thuật Liang-Barsky tối ưu khi tìm giao điểm của<br /> đoạn thẳng với cử sổ hiển thị<br /> Nicholl-Lee-Nicholl reducing redundant boundary<br /> clipping by identifying edge and corner regions<br /> <br /> z<br /> z<br /> <br /> Before actually drawing on the screen, we have<br /> to clip (Why?)<br /> Can we transform to screen coordinates first,<br /> then clip in 2D?<br /> –<br /> <br /> Correctness: shouldn’t draw objects behind viewer<br /> (what will an object with negative z coordinates do in<br /> our perspective matrix?) (draw it…)<br /> <br /> 18<br /> <br /> 3<br /> <br /> Khoa CNTT-DDHBK Hà nội<br /> Email: hunglt@it-hut.edu.vn<br /> 0913030731<br /> <br /> Giải thuật đường biên (Boundary - File<br /> Algorithm)<br /> <br /> Edge Walking<br /> z<br /> <br /> z Giải_thuật_đường_biên ( x, y )<br /> Color : biến mầu<br /> Begin<br /> Color = Readpixel ( x, y );<br /> If ( Color = mầu tô ) or ( Color = mầu đường biên )<br /> Kết thúc vì chạm biên<br /> hoặc chạm phần đã tô<br /> Else<br /> Putcolor(x,y, mauto)<br /> Giải_thuật_đường_biên ( x+1, y );<br /> Giải_thuật_đường_biên ( x-1, y );<br /> Giải_thuật_đường_biên ( x, y+1 );<br /> Giải_thuật_đường_biên ( x, y-1 );<br /> // Thực hiện lại giải thuật với các điểm lân cận<br /> End.<br /> <br /> 19<br /> <br /> –<br /> –<br /> –<br /> –<br /> <br /> Draw edges vertically<br /> Fill in horizontal spans for each scanline<br /> Interpolate colors down edges<br /> At each scanline, interpolate<br /> edge colors across span<br /> <br /> 20<br /> <br /> Edge Walking: Notes<br /> z<br /> z<br /> <br /> –<br /> <br /> z<br /> <br /> z<br /> <br /> Fractional offsets:<br /> <br /> z<br /> <br /> Be careful when interpolating color values!<br /> Also: beware gaps between adjacent edges<br /> <br /> 3 cases: break left, break right, no break<br /> <br /> Walk down left and right edges<br /> –<br /> <br /> z<br /> <br /> Edge Walking: Notes<br /> <br /> Order vertices in x and y<br /> –<br /> <br /> Fill each span<br /> Until breakpoint or bottom vertex is reached<br /> <br /> Advantage: can be made very fast<br /> Disadvantages:<br /> –<br /> –<br /> –<br /> <br /> Lots of finicky special cases<br /> Tough to get right<br /> Need to pay attention to fractional offsets<br /> <br /> z<br /> 21<br /> <br /> 22<br /> <br /> Giải thuật đường quét<br /> Scan-Line Algorithm<br /> z<br /> <br /> The scan-line algorithm uses edge-coherence and<br /> incremental integer calculations for maximum efficiency:<br /> –<br /> –<br /> <br /> z<br /> z<br /> z<br /> <br /> 23<br /> <br /> Basic idea:<br /> <br /> Edge Table (ET)<br /> (0,0)<br /> <br /> Tạo bảng edge table (ET) tập của các cạnh đa giác theo thứ tự<br /> giá trị ymin của chúng<br /> Tạo bảng active edge table (AET) tập các cạnh giao vớI đoạn<br /> thẳng quét scan-line<br /> <br /> Trong tiến trình quét các cạnh sẽ chuyển từ ET ra AET.<br /> Các cạnh sẽ ở trong AET cho đến khi giá trị ymax của<br /> cạnh đạt tới = scanline<br /> Lúc nay cạnh sẽ bị loại ra khỏi AET.<br /> <br /> ymax<br /> <br /> xmin<br /> <br /> numerator<br /> 1 −3<br /> ⇒ =<br /> denominator m 5<br /> <br /> (15,15)<br /> scan-line<br /> Note: line (8,6) → (13,6) has been deleted according to the scan rules<br /> <br /> 24<br /> <br /> 4<br /> <br /> Khoa CNTT-DDHBK Hà nội<br /> Email: hunglt@it-hut.edu.vn<br /> 0913030731<br /> <br /> Active Edge Table (AET)<br /> <br /> Giải thuật dòng quét-Scanline cho việc tô mầu vùng<br /> <br /> round down<br /> <br /> round down<br /> <br /> round up<br /> <br /> round up<br /> <br /> AET =<br /> <br /> AET =<br /> <br /> 25<br /> <br /> yma<br /> <br /> current x denominator current numerator<br /> <br /> ymax<br /> <br /> 26<br /> <br /> current numerator<br /> current x denominator<br /> <br /> x<br /> <br /> Scan-Line Algorithm<br /> <br /> Rasterizing Triangles<br /> z<br /> <br /> y = y of first non empty entry in ET<br /> AET = null<br /> repeat<br /> move all ET entries in slot y to AET<br /> sort AET entries according to xmin<br /> fill spans using pairs of AET entries<br /> for all AET members<br /> if ymax = y then remove from AET<br /> y = y+1<br /> for all AET members<br /> update numerator<br /> if numerator>denominator<br /> numerator=numerator-denominator<br /> x = x+1<br /> until AET and ET empty<br /> <br /> 27<br /> <br /> z<br /> <br /> Interactive graphics hardware commonly uses<br /> edge walking or edge equation techniques for<br /> rasterizing triangles<br /> Two techniques we won’t talk about much:<br /> –<br /> –<br /> <br /> Recursive subdivision of primitive into micropolygons<br /> (REYES, Renderman)<br /> Recursive subdivision of screen (Warnock)<br /> <br /> 28<br /> <br /> Recursive Triangle Subdivision<br /> <br /> Edge Equations<br /> z<br /> <br /> An edge equation is simply the equation of the<br /> line containing that edge<br /> –<br /> –<br /> –<br /> –<br /> <br /> Q: What is the equation of a 2D line?<br /> A: Ax + By + C = 0<br /> Q: Given a point (x,y), what does plugging x & y into<br /> this equation tell us?<br /> A: Whether the point is:<br /> z<br /> z<br /> z<br /> <br /> 29<br /> <br /> On the line: Ax + By + C = 0<br /> “Above” the line: Ax + By + C > 0<br /> “Below” the line: Ax + By + C < 0<br /> <br /> 30<br /> <br /> 5<br /> <br />
ADSENSE

CÓ THỂ BẠN MUỐN DOWNLOAD

 

Đồng bộ tài khoản
2=>2