b. Nguồn sáng vùng
2.1.3. Xác định các tứ giác bao quanh bóng khối
Khi chúng ta đã có danh sách các cạnh viền rồi, chúng ta sẽ tạo ra bóng khối bằng cách xây dựng các tứ giác từ mỗi cạnh viền đó dựa vào vị trí của nguồn sáng. 2 đỉnh đầu của tứ giác là 2 đỉnh của cạnh viền. 2 đỉnh tiếp theo sẽ nằm trên 2 đƣờng thẳng nối giữa nguồn sáng và 2 đỉnh đầu. 2 đỉnh này theo lý thuyết sẽ đƣợc chiếu ra vô cực nhƣng nhƣ thế sẽ không cần thiết vì thế ta sẽ chỉ cho chúng các giá trị tọa độ lớn là đƣợc.
v1 và v2 là 2 đỉnh của một cạnh viền bất kỳ trong danh sách. L là vị trí của nguồn sáng.
v3 và v4 sẽ là 2 điểm cần tìm tọa độ để tạo ra tứ giác.
Const He_so_chieu 100 //Hệ số chiếu này phải là một số lớn.
v3.x = (v1.x - L.x) * He_so_chieu; v3.y = (v1.y - L.y) * He_so_chieu; v3.z = (v1.z - L.z) * He_so_chieu; v4.x = (v2.x - L.x) * He_so_chieu; v4.y = (v2.y - L.y) * He_so_chieu; v4.z = (v2.z - L.z) * He_so_chieu;
Số hóa bởi Trung tâm Học liệu - Đại học Thái Nguyên http://www.lrc-tnu.edu.vn
Hình 2.5: Bóng khối được tạo ra nhờ cạnh viền.
Từ các điểm này ta sẽ vẽ đƣợc các tứ giác bao ngoài bóng khối. Vấn đề còn lại cần phải giải quyết với bóng khối là phải “đậy nắp” (Capping) 2 đầu của khối lại để nó trở thành một khối kín [9]. Lúc đó ta có thể thực hiện các phép kiểm tra một cách chính xác nhất. Để “nấp” phía trƣớc thì đơn giản là ta dùng luôn các mặt trƣớc của vật thể đối với vị trí của ánh sáng. Nấp mặt sau thì ta chỉ cần chiếu từng mặt sau của vật thể với ánh sáng đó ra vô cực. Phần này không cần thiết lắm bởi vì ta đã chiếu nó ra gần nhƣ là vô cực. Nên những điểm đó không cần xét đến nhiều.
Hình 2.6: Hình bên trái với bóng khối chưa được “đậy nắp”, và hình bên phải là được “đậy nắp”
Số hóa bởi Trung tâm Học liệu - Đại học Thái Nguyên http://www.lrc-tnu.edu.vn
thực sự vẽ bóng của vật thể ra, hay nói chính xác là vẽ ra vật thể cùng với bóng của nó. Để làm đƣợc việc đó ta phải xác định đƣợc một pixel có nằm trong vùng bóng khối đó hay không. Thuật toán xác định một pixel có nằm trong vùng bóng khối đó hay không khá đơn giản [12]. Tƣ tƣởng của nó là, nối điểm cần kiểm tra với điểm đặt camera (mắt nhìn). Nếu số mặt trƣớc và số mặt sau của bóng khối mà nó cắt bằng nhau thì điểm đó không nằm trong vùng bóng khối. Nếu nó cắt số mặt trƣớc của bóng khối nhiều hơn số mặt sau mà nó cắt thì có nghĩa là điểm đó nằm trong vùng bóng khối.
Để xác định xem đoạn đó cắt bao nhiêu mặt trƣớc, bao nhiêu mặt sau ta sẽ dùng một bộ đếm cho mỗi điểm cần kiểm tra, mà sẽ tăng lên 1 đơn vị khi nó đi xuyên qua một mặt trƣớc và giảm đi một đơn vị nếu nó đi xuyên qua một mặt sau của bóng khối. Khi đó nếu bộ đếm cho giá trị bằng 0 thì điểm đó không nằm trong phần bóng, Còn nếu nó lớn hơn 0 thì có nghĩa là điểm này nằm trong vùng bóng và sẽ không đƣợc đƣợc vẽ ra.
Và Stencil Buffer sẽ thực hiện điều đó. Stencil Buffer sẽ cung cấp cho mỗi pixel trên màn hình một “bộ đếm” và chúng ta có thể tăng và giảm nó khi pixel đó đƣợc ghi vào trong Frame Buffer. Sau đó chúng ta hoàn toàn có thể kiểm tra bộ đếm đó để xác định xem điểm đó sẽ đƣợc ghi ra màn hình hay không.
Thuật toán sẽ đƣợc mô tả bằng mã giả nhƣ sau:
Procedure IN_SHADOW_TEST // Z-pass
For {tất cả các vật thể cần đổ bóng} do
- Xây dựng danh sách các cạnh viền.
- Tính toán các tứ giác bao quanh bóng khối dựa trên các cạnh viền và từ vị trí của nguồn sáng.
End for
Số hóa bởi Trung tâm Học liệu - Đại học Thái Nguyên http://www.lrc-tnu.edu.vn
if Depth test passes then
- Tăng giá trị Stencil Buffer.
End if
End for
For {Tất cả các mặt sau của bóng khối nhìn từ vị trí của điểm nhìn} do
if Depth test passes then
- Giảm giá trị Stencil Buffer.
End if
End for
Số hóa bởi Trung tâm Học liệu - Đại học Thái Nguyên http://www.lrc-tnu.edu.vn
Hình 2.8: Bước 2, Vẽ các mặt sau của bóng khối.
Số hóa bởi Trung tâm Học liệu - Đại học Thái Nguyên http://www.lrc-tnu.edu.vn
Hình 2.10: Trái: Khôngcó bóng, Giữa: Bóng khối được tạo ra, Phải: Kết quả cuối.
Các bƣớc thực hiện nhƣ sau:
Xóa hết trong Z-buffer và Stencil-Buffer, Chắc chắn rằng Chế độ ghi vào Z-buffer và chế độ Stencil test đƣợc bật.
Tạo ảnh của toàn bộ khung cảnh (bao gồm vật thể và các mặt hứng bóng) với Ambient Light để cho Z-buffer đƣợc cập nhật.
Tắt chế độ ghi vào Z-buffer.
Vẽ ra các mặt trƣớc của bóng khối, Nếu chúng thực sự đƣợc vẽ ra. (Có nghĩa là Depth Pass) thì tăng giá trị Stencil Buffer.
Vẽ các mặt sau của bóng khối, Nếu chúng thực sự đƣợc vẽ ra.(Có nghĩa là Depth Pass) thì giảm giá trị Stencil Buffer.
Bật chế độ Stencil test (chỉ những điểm có giá trị Stencil = 0 mới đƣợc vẽ ra màn hình), Xóa Z-buffer, bật chế độ ghi vào Z-buffer, bật nguồn sáng.
Vẽ ra toàn bộ khung cảnh những điểm có giá trị trong stencil Buffer là 0.
2.1.5. Tạo bóng bằng thuật toán Z-Fail
Thuật toán Z-Pass ở trên có một nhƣợc điểm rất lớn là chƣa xử lý đƣợc trƣờng hợp khi điểm nhìn (viewpoint) nằm ở trong vùng bóng khối. Có 3 giải pháp để xử lý trƣờng hợp này:
Số hóa bởi Trung tâm Học liệu - Đại học Thái Nguyên http://www.lrc-tnu.edu.vn
nhƣ thế này thì chi phí tính toán sẽ rất đắt.
Tạo một mặt phẳng nằm trƣớc và rất gần điểm nhìn cho mỗi phần bóng khối mà điểm nhìn nằm trong đó. Cách này cũng vậy, khá phức tạp và chi phí tính toán cũng đắt.
Cách thứ 3 là sử dụng thuật toán Z-Fail [13]. Thay vì tính toán giá trị Stencil bằng việc tăng các mặt trƣớc của bóng khối và giảm giá trị của các mặt sau khi Z-Buffer Pass, toàn bộ quá trình sẽ đƣợc thay đổi để đếm từ vô cực thay vì đếm từ điểm nhìn. Vì thế thuật toán này còn gọi là Z-Fails.
Thuật toán Z-fail đƣợc thể hiện bằng đoạn mã giả sau:
Procedure IN_SHADOW_TEST // Z-fail
For {tất cả các vật thể cần đổ bóng} do
- Xây dựng danh sách các cạnh viền.
- Tính toán các tứ giác bao quanh bóng khối dựa trên các cạnh viền và từ vị trí của nguồn sáng.
End for
For {Tất cả các mặt trƣớc của bóng khối nhìn từ vị trí của điểm nhìn} do
if Depth test fails then
- Giảm giá trị Stencil Buffer.
End if
End for
For {Tất cả các mặt sau của bóng khối nhìn từ vị trí của điểm nhìn} if Depth test fails then
Số hóa bởi Trung tâm Học liệu - Đại học Thái Nguyên http://www.lrc-tnu.edu.vn
- Tăng giá trị Stencil Buffer.
End if
End for
2.1.6. So sánh giữa 2 thuật toán
Thuật toán Z -Pass Thuật toán Z -fail Ƣu điểm Không cần thiết phải
“đậy nắp” (Cap)
Tạo ít mặt hơn (do không cần tạo capping ) Nhanh hơn Z-fail. Dễ thƣ̣c hiện hơn
Giải quyết đƣợc trƣờng hợp điểm nh ìn nằm trong bóng khối .
Nhƣợc điểm
Không giải quyết đƣợc vấn đề khi điểm nhìn ở trong bóng khối .
Không có tƣ̣ bóng (Self- shadow)
Chậm hơn Z-pass. Đòi hỏi bóng khối phải
đƣợc Capping.
Phải tạo ra nhiều mặt hơn do phải Capping . Khó thực hiện hơn . Không có tƣ̣ bóng (Self-
Shadow)
2.2. Kỹ thuật tạo bóng sử dụng bản đồ bóng
2.2.1. Giới thiệu
Shadow Mapping đƣợc giới thiệu đầu tiên bởi Lance Williams năm 1978. Từ đó nó đƣợc sử dụng rất rộng rãi cả trong tạo ảnh offline lẫn trong các ứng dụng thời gian thực. Shadow mapping đƣợc sử dụng bởi Pixar’s
Số hóa bởi Trung tâm Học liệu - Đại học Thái Nguyên http://www.lrc-tnu.edu.vn
Shadow mapping [6] là kỹ thuật tạo bóng trên không gian ảnh (image- space algorithm) nên ta những thông tin về hình dạng của vật thể hay những kiến thức hình học là không cần thiết. Thuật toán này cũng giống nhƣ thuật toán bóng khối, thực hiện phép kiểm tra “trong bóng” (in shadow) trên từng pixel. Một pixel đƣợc chiếu sáng nếu không có vật nào chắn giữa đƣờng nối nó và nguồn sáng. Chìa khóa để hiểu đƣợc thuật toán Shadow Mapping (bản đồ bóng) là những điểm nằm trên bản đồ bóng chính là những điểm sẽ đƣợc hiển thị ra màn hình nếu nhƣ điểm nhìn đặt ở vị trí của ánh sáng.
Chúng ta có một thuật toán để xét xem điểm nào sẽ đƣợc hiển thị với ngƣời quan sát. Đó là sử dụng Z-buffer. Vì thế những điểm có depth test pass nếu chúng ta vẽ toàn bộ khung cảnh từ vị trí của nguồn sáng thì đó chính là những điểm không nằm trong bóng.
2.2.2. Thuật toán
Thuật toán sẽ gồm 2 bƣớc chính:
Đầu tiên ta sẽ vẽ toàn bộ khung cảnh (chƣa có bóng) từ vị trí của ánh sáng ra màn hình.
o Lƣu giá trị độ sâu trong Z-buffer vào trong bản đồ độ sâu. Các giá trị độ sâu này thực chất là giá trị z của những điểm có depth test pass và đƣợc hiển thị trên màn hình.
o Bản đồ độ sâu này sẽ đƣợc dùng trong bƣớc 2.
Sau đó chúng ta lại vẽ toàn bộ khung cảnh từ vị trí của điểm nhìn (camera).
o Với mỗi điểm ta sẽ chuyển tọa độ của chúng sang hệ tọa độ của ánh sáng.
Số hóa bởi Trung tâm Học liệu - Đại học Thái Nguyên http://www.lrc-tnu.edu.vn
o Tọa độ này chính là tọa độ để xác định giá trị độ sâu khi thực hiện depth test. Giả sử điểm này khi chuyển sang sẽ có tọa độ là (x,y,z’).
o Sau đó công việc còn lại là so sánh giá trị độ sâu z của điểm có tọa độ (x,y) trong bản đồ độ sâu với giá trị z’ của điểm (x,y,z’) đó.
Nếu z < z’ thì điểm này nằm trong bóng và sẽ không đƣợc vẽ ra màn hình khi thực hiện vẽ khung cảnh từ vị trí của điểm nhìn.
Nếu z >=z’ thì điểm đó đƣợc chiếu sáng và sẽ đƣợc vẽ ra màn hình từ vị trí của điểm nhìn.
Số hóa bởi Trung tâm Học liệu - Đại học Thái Nguyên http://www.lrc-tnu.edu.vn
Số hóa bởi Trung tâm Học liệu - Đại học Thái Nguyên http://www.lrc-tnu.edu.vn
Hình 2.13: Hình trên cùng bên trái: Khung cảnh không có bóng được vẽ từ vị trí của điểm nhìn . Hình trên cùng bên phải : Khung cảnh được nhìn từ nguồn sáng. Hình giữa trái : Bản đồ bóng được tạo ra kh i nhìn từ vị trí của nguồn sáng. Hình giữa phải (a): Bản đồ bóng được chiếu lên trên khung cảnh được nhìn từ mắt (giá trị A ). Hình dưới trái (b): Chiếu khoảng cách phẳng của nguồn sáng lên khung cảnh được nhìn từ mắt (Giá trị B ). Hình Dưới phải : Bóng được vẽ ra sau phép kiểm tra chiều sâu giữa (a) và (b).
Số hóa bởi Trung tâm Học liệu - Đại học Thái Nguyên http://www.lrc-tnu.edu.vn
tọa độ hiển thị ánh sáng.
Hình 2.14: Các hệ tọa độ và các ma trận biến đồi.
Đầu tiên ta phải chuyển từ hệ tọa độ mắt (Camera’s Eye Space) về hệ tọa độ thế giới bằng ma trận nghịch đảo của ma trận biến đổi hiển thị. (Camera’s View Matrix = Viewing matrix). Ta ký hiệu ma trận này là VEV
Sau đó ta sẽ phải đƣa từ hệ tọa độ thế giới về hệ tọa độ của ánh sáng bằng ma trận hiển thị của ánh sáng (Light’s Viewing Matrix). Kí hiệu ma trận này là VLV
Tiếp theo thực hiện phép chiếu thích hợp (Phép chiếu trực giao) để đƣa về hệ tọa độ thiết bị tiêu chuẩn. PS
Số hóa bởi Trung tâm Học liệu - Đại học Thái Nguyên http://www.lrc-tnu.edu.vn
Cuối cùng thực hiện phép biến đổi cổng nhìn đƣa đoạn [-1,1] về đoạn [0,1] với ma trận S là:
Nhƣ vậy ma trận T đƣa một điểm từ hệ tọa độ của mắt về tọa độ hiển thị của ánh sáng sẽ có dạng:
Số hóa bởi Trung tâm Học liệu - Đại học Thái Nguyên http://www.lrc-tnu.edu.vn
3.1. Bài toán
Giới thiệu chƣơng trình mô phỏng hai kỹ thuật tạo bóng cứng là dùng bóng khối và bản đồ bóng dựa trên thuật toán bóng khối là thuật toán tạo bóng dựa trên các thông tin về hình dạng của vật thể cần tạo bóng , vì thế nó đòi hỏi phải có các thông tin về tính kết nối của các lƣới đa giác của tất cả các vật thể có trong khung hình (scene) để có thể tính toán một cách hiệu quả và chính xác. Thuật toán tạo bóng dựa trên bản đồ bóng là kỹ thuật tạo bóng trên không gian ảnh (image-space algorithm) nên những thông tin về hình dạng của vật thể hay những kiến thức hình học là không cần thiết. Thuật toán này cũng giống nhƣ thuật toán bóng khối, thực hiện phép kiểm tra “trong bóng” (in shadow) trên từng pixel. Một pixel đƣợc chiếu sáng nếu không có vật nào chắn giữa đƣờng nối nó và nguồn sáng. Chìa khóa để hiểu đƣợc thuật toán Shadow Mapping (bản đồ bóng) là những điểm nằm trên bản đồ bóng chính là những điểm sẽ đƣợc hiển thị ra màn hình nếu nhƣ điểm nhìn đặt ở vị trí của ánh sáng.
3.2. Chƣơng trình
3.2.1. Bóng khối (SHADOW VOLUME) Một số hƣớng dẫn:
Nhấn P: Để Pause. Nhấn U: Để Unpause.
Nhấn F: Để chuyển sang dùng thuật toán Z -fail. Nhấn G: Để chuyển sang dùng thuật toán Z -pass. Key Up (): Để dịch chuyển nguồn sáng lên trên .
Số hóa bởi Trung tâm Học liệu - Đại học Thái Nguyên http://www.lrc-tnu.edu.vn
Click chuột trái vào và dịch chuyển để thay đổi vị trí camera .
Hình 3.1: Bóng được tạo bằng thuật toán Z-fail
Nguồn sáng Vật thể đƣợc
tạo bóng
Số frames đƣợc render mỗi giây
Thuật toán đƣợc sƣ̉ dụng
Số hóa bởi Trung tâm Học liệu - Đại học Thái Nguyên http://www.lrc-tnu.edu.vn
Hình 3.2: Bóng được tạo bởi thuật toán Z-pass. Số Frame tăng đáng kể so với thuật toán Z-fail do không cần Capping.
3.2.2. Bản đồ bóng (SHADOW MAPPING)
Một số hƣớng dẫn:
Nhấn C: Chuyển chế độ sang dịch chuyển Camera . Nhấn L: Chuyển chế độ sang dịch chuyển nguồn sáng.
Click chuột trái và di chuyển để dịch chuyển (nguồn sáng hoặc camera tùy thuộc đang ở chế độ nào )
Ấn Space: Để vẽ vùng quan sát (Frustum)
Nhấn T: Để chuyển vật thể sang hình chiếc vòng . Nhấn B: Để chuyển vật thể thà nh hình cầu .
Số hóa bởi Trung tâm Học liệu - Đại học Thái Nguyên http://www.lrc-tnu.edu.vn
Nhấn () hoặc (): Để tăng hoặc giảm kích thƣớc của Bản đồ bóng.
Hình 3.3: Bóng được tạo với kích thước bản đồ bóng là 512. Sồ frames được render mỗi giây khá thấ p do kích thước bản đồ bóng tăng , phải tính toán nhiều.
Số Frames đƣợc render mỗi giây.
Kích thƣớc của bản đồ bóng. Mặt phẳng nhận bóng Vật đƣợc tạo bóng
Số hóa bởi Trung tâm Học liệu - Đại học Thái Nguyên http://www.lrc-tnu.edu.vn
Hình 3.4: Bóng được tạo với kích thước bản đồ bóng là 256. Số Frames được render mỗi giây tăng lên khá cao do số lượng tính toán giảm.
Số hóa bởi Trung tâm Học liệu - Đại học Thái Nguyên http://www.lrc-tnu.edu.vn
Hình 3.5: Bóng được tạo với kích thước bản đồ bóng là 128. Sồ Frames được render mỗi giây lên đến 101.
Số hóa bởi Trung tâm Học liệu - Đại học Thái Nguyên http://www.lrc-tnu.edu.vn