MỞ ĐẦU 1.1 Lý do chọn đề tài và lịch sử nghiên cứu Các mô hình 3 chiều (3D) đang ngày trở nên phổ biến và được sử dụng rộng rãi trong nhiều lĩnh vực chính như kiến trúc, làm phim, game. Các mô hình này có thể là các đối tượng giao thông, các công trình kiến trúc hay các nhân vật hoạt hình được thiết kế bởi các phần mềm đồ họa như Maya hay Autodesk 3DS Max, giúp các kĩ sư có được một môi trường, đối tượng ảo dùng để nghiên cứu, thử nghiệm trước khi đưa vào thực hiện trong thực tế. Thông qua một quá trình xử lý gọi là kết xuất đồ họa (rendering), các mô hình/cảnh kịch 3 chiều – thường được xây dựng từ các hình đa giác hay các đối tượng hình học cơ bản hay hình nguyên thủy (primitives) được kết xuất thành một bức ảnh 2 chiều trên máy tính. Sự phát triển nhanh chóng của đồ họa máy tính từ những năm 1960 đã đưa đến nhiều phương pháp kết xuất đồ họa khác nhau.
Các phương pháp này đều đòi hỏi chi phí tính toán lớn và có một sự tương xứng giữa thời gian thực hiện và chất lượng của bức ảnh đầu ra. Chúng có thể được phân biệt bởi thời gian kết xuất ảnh: kết xuất online và offline. Kết xuất đồ họa thời gian thực - online được dùng trong các ứng dụng như game, hiện thực ảo hay các bộ mô phỏng, máy tính cần sinh ra khoảng 30 (hoặc nhiều hơn) ảnh/frame trong 1 giây. Kết xuất offline thường phù hợp với làm phim, máy tính cần nhiều thời gian để sinh ra các bức ảnh chân thực hơn.
Đến những năm 90, nhiều sự quan tâm đặc biệt đã được dành cho việc giảm tải khối lượng tính toán đồ họa trên bộ xử lý trung tâm (CPU). Điều này dẫn tới sự phát triển của các bộ xử lý đồ họa (GPU), với mục đích chính là đảm nhận quá trình kết xuất các mô hình 3D thay cho CPU. Hiện nay có hai phương pháp kết xuất đồ họa chính được quan tâm nhiều nhất là rasterization và raytracing. 9 Rasterization là một phương pháp kết xuất đồ họa được sử dụng rộng rãi nhất trong những năm gần đây bởi hầu hết các dòng phần cứng đồ họa đều được thiết kế để hỗ trợ cho rasterization.
Rasterization có thể định nghĩa là một quá trình tuần tự kết xuất một mô hình /cảnh kịch 3 chiều bằng cách chuyển đổi tọa độ của các hình nguyên thủy sang một tập các điểm ảnh 2 chiều để vẽ lên màn hình. Do đó, phương pháp này thường có thời gian kết xuất tuyến tính với số lượng hình tam giác được vẽ. GPU hỗ trợ rasterization nhờ vào phần cứng chuyên biệt bên trong, làm cho thời gian xử lý một hình tam giác là rất nhỏ. Các GPU hiện đại có thể vẽ tới 600 triệu hình đa giác trong một giây [30].
Tuy nhiên, kết quả của rasterization thiếu độ chân thực bởi vì nó không dựa trên các đặc điểm vật lý của các đối tượng. Các hiệu ứng ánh sáng và màu sắc phải được thêm vào bằng các phương pháp riêng biệt để tạo ‘xấp xỉ’ các hiệu ứng, làm tăng độ phực tạp và thời gian. Raytracing mặt khác, là một quá trình xây dựng lại cảnh kịch dựa trên lấy mẫu, nó xem màn hình như một lưới điểm ảnh và phóng ra các tia từ mỗi điểm ảnh tọa độ 2 chiều trên màn ảnh vào trong một cảnh kịch 3 chiều đã dựng trước và nằm trong bộ nhớ. Mỗi thông tin về giao điểm của tia với các đối tượng 3 chiều sau đó được dùng để xác định giá trị màu của điểm ảnh trên màn hình.
Nhờ mô phỏng tia sáng trong tự nhiên nên nhiều hiệu ứng phức tạp như phản xạ, đổ bóng - vốn rất khó đạt được với các phương pháp khác là một kết quả tự nhiên của raytracing. Do đó, tuy không được hỗ trợ bởi các phần cứng đồ họa nhưng raytracing vẫn được sử dụng trong những ứng dụng kết xuất đồ họa off-line như làm phim hoạt hình, ví dụ hãng Pixar đã sử dụng raytracing để tạo ra các bức ảnh phục vụ cho việc làm các bộ phim nổi tiếng như “Finding Nemo” và “Cars”. Để sinh ra được những bức ảnh ‘siêu thực’, raytracing phải trả giá bằng thời gian kết xuất rất lớn. Nhiều thực thi raytracing trên các hệ thống tính toán thông dụng đã thể hiện sự kém khả thi, trong [12], để kết xuất một cảnh kịch phức tạp gồm 15 cars, raytracing mất trung bình 15 giờ cho một bức ảnh/frame trên một máy tính Apple G5, dual-CPU PowerPC 2Ghz và 2GB RAM.
10 Mặc dù không phải là một ý tưởng mới, nhưng kể từ khi được giới thiệu dưới dạng hiện đại của nó bởi Turner Whitted trong [7], raytracing dần nhận được nhiều sự quan tâm của các nhà khoa học. Các nghiên cứu sau đó đã đưa ra nhiều cải tiến đa dạng cho raytracing cả về các hiệu ứng quang học (path tracing, beam và cone tracing, packet và distribution raytracing, .) và tăng tốc (ví dụ các cấu trúc tăng tốc SAH, BVH, Kd-tree, .) cho giải thuật này. Cùng với sự phát triển mạnh mẽ của công nghệ phần cứng, raytracing ngày càng được thử nghiệm để hướng đến thời gian thực nhiều hơn, và được xem là tương lai của đồ họa tương tác. Tuy nhiên, thực hiện một sự chuyển dịch ngay lập tức từ rasterization sang raytracing là không thể vì việc này cần thời gian và nghiên cứu để phát triển lại các phần mềm đồ họa hiện tại [9].
Nguyên thủy, các kỹ thuật kết xuất đồ họa như raytracing không thể sinh ra trực tiếp những bức ảnh lập thể (stereoscopic) hay có ảo giác về độ sâu của các đối tượng trong mô hình 3d. Trong vài thập kỷ qua, có nhiều kỹ thuật khác nhau đã được phát triển để biểu diễn các bức ảnh nổi lập thể nhưng nguyên lý chung để xem được ảnh 3d là giống nhau: gửi tới hai bức ảnh lệch tới mắt trái và phải của người xem, cả hai ảnh lệch này sau đó được kết hợp trong nào và làm người xem có ảo giác về độ sâu 3d. Đã có các nghiên cứu về sinh ảnh stereoscopic với raytracing, [11, 13] là các minh chứng cho điều này. Tuy nhiên các phương pháp này đều không đặt thêm camera vào raytracing mà cố gắng sử dụng các công thức toán học để nội suy ra bức ảnh lệch thứ hai dựa vào bức ảnh được kết xuất thực sự.
Hầu hết các công việc này đều thực hiện raytracing tuần tự trên CPU. Những cải thiện gần đây trong công nghệ sản xuất các bộ xử lý đồ họa (GPU) không những mang lại những sản phẩm tốt hơn cho mục đích diễn họa, mà còn mang lại một môi trường tính toán mạnh cho các ứng dụng phi đồ họa. Nhiều thí nghiệm được thực hiện trên các bộ xử lý đồ họa đã chứng minh được tính hiệu quả hơn hàng chục, hàng trăm lần so với thực hiện trên các bộ xử lý trung tâm. Sự xuất hiện của các môi trường 11 lập trình trên GPU như CUDA của hãng NVIDIA cho phép người phát triển dễ dàng thực hiện các tính toán đa dụng và khai thác sức mạnh của các GPU hiện đại [19] thay vì phải sử dụng các API đồ họa (OpenGL, DirectX) và các ngôn ngữ tô bóng đỉnh/đoạn (GLSL, Cg, HLSL) vốn phức tạp như trước đây.
Một trong những ưu điểm của raytracing là nó có khả năng song song hóa rất cao [30]. Điều này dẫn đến một câu hỏi: Làm thế nào để thực hiện được giải thuật raytracing trên các kiến trúc đồ họa song song ngày nay để tận dụng được sức mạnh tính toán của chúng, tiết kiệm thời gian thực hiện cho raytracing? Luận văn trình bày một cách tiếp cận đơn giản trong việc tạo ra các video nổi 3d từ các mô hình 3d dựng sẵn bằng cách kết hợp kỹ thuật kết xuất raytracing và một số lược đồ lọc màu đơn giản (anaglyph, colorcode 3D). Ý tưởng cơ bản là kết xuất ra một tập các ảnh nổi 3d và sau đó nối các ảnh này thành một video 3d. Các bước thực hiện được minh họa trong hình dưới.
Hình 1 Tiếp cận tạo ra video 3d từ các mô hình 3d dự ng sẵn 12 Trước hết nghiên cứu này thiết lập cảnh kịch 3d sử dụng 2 camera quay xung quanh các đối tượng. Vị trí của các camera được đặt sao cho chúng tương ứng với hai góc nhìn từ hai mắt trái, phải. Sau đó sử dụng giải thuật raytracing để sinh ra hai bức ảnh lệch 2d của tương ứng với 2 camera. Cuối cùng, các phương pháp kết hợp ảnh dựa trên anaglyph, colorcode 3d được sử dụng để kết hợp 2 bức ảnh 2d thành một bức ảnh nổi 3d.
Quá trình này được lặp lại cho đến khi tập hợp đủ số fame cho việc tạo video 3d. Trở ngại lớn nhất trong cách tiếp cận này đó là sự phức tạp tính toán lớn của giải thuật raytracing. Thực tế, raytracing mô phỏng mỗi tia sáng đi qua màn ảnh, với mỗi tia, raytracing kiểm tra giao điểm của tia đó với mọi đối tượng trong cảnh kịch 3d. Để lần vết đúng đắn đường đi của tia, chúng ta cần kiểm tra sự giao nhau của tia với các đối tượng trong khung cảnh.
Một cách làm đơn giản là kiểm tra mỗi tia với tất cả các đối tượng trong khung cảnh để tìm ra đối tượng đầu tiên được giao. Việc kiểm tra này có chi phí thực hiện O(Rays x Polygons) trong đó, Rays là số tia sáng còn Polygons là số hình đa giác tạo nguyên thủy tạo nên mô hình 3d, do đó rất tốn kém. Để vượt qua trở ngại này, luận văn đã áp dụng cấu trúc tăng tốc BVH (bounding volume hierarchy) được đề xuất bởi Wald trong [15, 8] để giảm số lượng kiểm tra giao điểm giữa tia sáng với đối tượng vật thể. Để tăng tốc việc thực hiện chương trình, luận văn đã ứng dụng công nghệ tính toán song song trên các bộ xử lý đồ họa đa dụng cho việc thực hiện giải thuật raytracing cùng với kết hợp ảnh theo kỹ thuật anaglyph.
Chương trình song song thử nghiệm đã được viết bằng ngôn ngữ CUDA [19] chạy trên một bộ xử lý đồ họa Geforce GTX 295 của nVidia.