1. Trang chủ
  2. » Luận Văn - Báo Cáo

Tạo video 3d từ mô hình 3d sử dụng ông nghệ tính toán hiệu năng ao trên á bộ xử lý đồ họa

85 2 0

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

THÔNG TIN TÀI LIỆU

Thông tin cơ bản

Tiêu đề Tạo Video 3D Từ Mô Hình 3D Sử Dụng Công Nghệ Tính Toán Hiệu Năng Cao Trên Các Bộ Xử Lý Đồ Họa
Tác giả Dương Nhật Tân
Trường học Trường Đại Học Bách Khoa Hà Nội
Chuyên ngành Công Nghệ Thông Tin
Thể loại luận văn thạc sĩ
Năm xuất bản 2011
Thành phố Hà Nội
Định dạng
Số trang 85
Dung lượng 8,49 MB

Cấu trúc

  • 2.1.1 Đị nh d ng file 3ds ạ 35T (0)
  • 2.2.1 Bounding volume hiearachy (BVH) (23)
  • 2.2.2 Xây d ng cây BVH ự (0)
  • 2.2.3 Duyệt cây BVH (28)
  • 2.3.1 Mô hình chiếu sáng Phong 35T (31)
  • 2.3.2 Tia phản xạ (33)
  • 2.3.3 Tia khúc xạ 35T (33)
  • 2.3.4 Che bóng (34)
  • 2.3.5 Màn ảnh (35)
  • 2.3.6 Camera pinhole (37)
  • 2.3.7 Giao điể m tia – đố i tư ợ ng 35T (38)
  • 2.5.1 Các bộ ử x lý đ ồ ọa đa lõi củ h a NVIDIA (0)
  • 2.5.2 Môi trường phát triển ứng dụng CUDA 35T (54)
  • 3.2.1 Khử đệ quy raytracing s ử ụ d ng khuôn hình C++ 35T (0)
  • 3.2.2 Khử duyệt cây BVH đệ quy s d ử ụng ngăn xế p 35T (0)
  • 3.3.1 Thiết lập camera 35T (65)
  • 3.3.2 Tạo ảnh anaglyph trên GPU 35T (70)

Nội dung

Cũng Trang 7 5 DANH MỤC TỪ VIẾT TẮT, THUẬT NGỮ VÀ Ý NGHĨA Kí hiệu / Thuật ngữ Ý nghĩa 3D 3 chiều2D 2 chiềuRender Kết xuất ảnhAnaglyph phương pháp, ảnh có độ nổi dựa trên lọc màu CPU Bộ

Bounding volume hiearachy (BVH)

BVH (Bounding Volume Hierarchy) là một cấu trúc dữ liệu lưu trữ thông tin dạng cây, trong đó mỗi nút chứa tham chiếu tới các nút con và các nút lá lưu trữ danh sách hình nguyên thủy như hình tam giác Mỗi bounding volume của một nút được đảm bảo bao phủ hoàn toàn bounding volume của các nút con, và mỗi hình nguyên thủy phải nằm hoàn toàn trong một nút lá Các loại hình đơn giản như hình cầu, hộp có cạnh song song với trục tọa độ (AABB) và hộp có hướng thường được sử dụng làm bounding volume Việc lựa chọn loại hình nào để làm bounding volume phụ thuộc vào hai yếu tố: hiệu suất và độ chính xác.

- các đối tượng bị bao quanh có ằ n m vừa bên trong ốt nhất khôngt

- việc kiểm tra giao điểm giữa tia và hộ có dễp dàng nh t ấ hay không

Cây BVH (Bounding Volume Hierarchy) thường chỉ chứa một loại bounding volume, giúp đơn giản hóa quá trình xây dựng và duy trì cây Hình dưới đây minh họa một cây BVH được tổ chức từ một tập hợp gồm 12 hình tam giác.

Để xây dựng một cấu trúc phân cấp một cách nhanh chóng, cần phải hy sinh chất lượng của nó Cấu trúc BVH nổi bật với thời gian xây dựng nhanh và khả năng cập nhật dễ dàng khi các đối tượng trong khung cảnh chuyển động Vì vậy, BVH là phương pháp phổ biến nhất để biểu diễn cho các khung cảnh động.

Khi xây dựng hoặc cập nhật một cấu trúc phân cấp, các hàm heuristic được sử dụng để xác định cách tổ chức các đối tượng hình học trong phân cấp Luận văn này áp dụng phương pháp xây dựng cây phân cấp BVH theo hướng tiếp cận top-down, được đề xuất bởi Warld, sử dụng các hộp bao AABB (axis-aligned bounding box) và hàm heuristic SAH (Surface Area Heuristic) để phân chia các hình nguyên thủy, phương pháp này rất phổ biến trong việc xây dựng cấu trúc phân cấp kd-tree.

Goldsmith và Salmon đã phát triển một công thức đơn giản để đánh giá thời gian thực hiện của tia chạm vào p bảo hộ của nút gốc Họ đã đưa ra một quy luật cho rằng tỷ lệ liên quan đến thời gian này là một yếu tố quan trọng trong quá trình đánh giá.

Tia tới tương tác với nút trong cấu trúc BVH thông qua diện tích vùng bao của nút và các nút con Khi tia chạm vào nút trong, hàm kiểm tra giao điểm sẽ được kích hoạt để xác định mối quan hệ với các nút con Nếu một nút lá bị cắt, các hình tam giác trong danh sách của nó sẽ được kiểm tra giao điểm Thời gian trung bình để tia tương tác với BVH phụ thuộc vào số lượng nút trong cây và diện tích của các bounding volume Đối với nút trong, thời gian kiểm tra các hộp bao của hai nút con sẽ khác với thời gian kiểm tra hình tam giác trong nút lá Công thức tính toán thời gian thực hiện sẽ phản ánh những yếu tố này.

(1) trên sẽ ở tr thành: ở đây T R AABB R là thời gian để ểm tra một tia và một AABB có giao điểm hay không, ki

T R tri R là thời gian để tính một giao điểm tia tam giác, và N- R i R là số tam giác trong danh sách c a nút lá i ủ

Theo chiến lược top down trong xây dựng cây BVH, quá trình phân chia diễn ra theo từng bước đệ quy, bao gồm việc chia tập S thành hai tập con S₁ và S₂ Việc phân chia này tiếp tục cho đến khi tập S đạt đủ điều kiện để trở thành lá Mỗi bước phân chia cần được lựa chọn cẩn thận nhằm tối ưu hóa chi phí.

Việc xây dựng 24 đảm bảo bom t cây hai lá sả ộ ẽ đòi hỏi áp dụng công thức cụ thể cho trường hợp cây 2 ợ lá Ở đây, A(S) đại diện cho diện tích của hợp bao các tam giác trong tập S, trong khi N(S) là số tam giác trong tập S Do số lượng tam giác N có O(2 P N P) cách phân chia, việc tìm ra một tối ưu toàn cục bằng cách kiểm tra tất cả các trường hợp là không khả thi.

{quét từ bên trái} set S1 = Empty, S2 = S for i=1 to |S| do

S[i].leftArea = Area(S1) {with Area(Empty)= ∞} move triangle i from S2 to S1 end for

S[i].rightArea=Area(S2) {đánh giá chi phí theo công thức 3} thisCost=SAH(|S1|,S[i].leftArea,|S2|,S[i].rightArea) move Triangle i from S1 to S2 if thisCost < bestCost then

25 bestCost = thisCost bestEvent = i bestAxis = axis end if end for end for if bestAxis = -1 then {found no partition better than leaf} return makeleaf else sort S in axis ’bestAxis’

S1 S[0 bestEvent); = S2 S[bestEvent |S|) return make inner node with axis ’bestAxis’; end if end

Trong đoạn mã, biến bestCost được khởi tạo là chi phí tối ưu cho một lá Giải thuật xét các mặt phẳng ứng viên để phân hoạch các hình tam giác trong tập S bằng cách duyệt theo 3 trục tọa độ Với mỗi trục tọa độ, giải thuật sắp xếp các tam giác trong S theo thứ tự tăng dần dựa trên tọa độ trọng tâm Thao tác "quét từ trái" tính diện tích bề mặt của hộp chứa các tam giác trong S_R1 Tiếp theo, giải thuật thực hiện "quét từ phải" để chuyển các tam giác của S từ bên phải sang trái, và tính diện tích bề mặt của hộp chứa các tam giác trong S_R2 Sau khi có đủ dữ liệu, chi phí phân hoạch được đánh giá bằng công thức Các tam giác được chuyển từ S_R1 sang S_R2 để tìm ra phân hoạch tốt nhất với thông tin về trục tọa độ tối ưu, chi phí tốt nhất và hình tam giác được chuyển lần cuối Cuối cùng, khi tìm được phân hoạch tối ưu, giải thuật tạo ra một nút trong cây với 2 nút con là S_R1 và S_R2, và quá trình xây dựng này được thực hiện đệ quy cho đến khi tập S được tạo thành lá.

Chi tiết hơn về các bước trong quá trình xây d ng có th tìm th y trong [ự ể ấ 10]

BVH (Bounding Volume Hierarchy) là một phương pháp hiệu quả để tìm kiếm giao điểm giữa tia sáng và các hình tam giác Khi một nút lá được kiểm tra, tia sáng sẽ được xác định xem có giao điểm nào với hộp bao chứa nút hay không Nếu có giao điểm, danh sách các hình tam giác trong nút sẽ được xem xét Đối với các nút không phải lá, nếu tia sáng giao với hộp bao, các nút con sẽ được kiểm tra theo cách đệ quy Điều này đảm bảo rằng ngay cả khi một giao điểm đã được tìm thấy ở một nút, các nút con vẫn cần được kiểm tra để tìm giao điểm gần nhất Cuối cùng, thuật toán sẽ trả về giao điểm gần nhất giữa tia sáng và hình tam giác Dưới đây là đoạn mã minh họa cách duyệt cây BVH để tìm giao điểm gần nhất.

Ray tracing là phương pháp mô phỏng hành vi của các tia sáng phát ra từ mắt người xem để tạo ảnh cho vật thể Ý tưởng cơ bản là theo dõi đường đi của các photon ánh sáng ngược chiều về nguồn phát sáng, tức là cho tia sáng xuất phát từ vị trí mắt và đi qua từng điểm trên màn hình vào ảnh 3 chiều Sau đó, mô hình chiếu sáng được sử dụng để tính toán giá trị màu cho mỗi điểm ảnh trên màn hình Giải thuật bắt đầu bằng cách phóng ra các tia sơ cấp – là các tia phát ra từ mắt hoặc camera tới các điểm ảnh trên màn hình.

Các công thức toán học định nghĩa đối tượng trong khung cảnh giúp xác định sự giao điểm giữa tia sáng và đối tượng Nếu tia sáng không giao với bất kỳ đối tượng nào, màu nền sẽ được trả lại cho điểm ảnh Ngược lại, khi tia sáng tương tác với vật thể trong khung cảnh, điểm ảnh sẽ có màu sắc tương ứng với vật thể gần nhất mà tia đó tương tác.

Raytracing là một kỹ thuật mô phỏng ánh sáng, trong đó khi tia sáng chạm vào bề mặt của một vật thể, hiện tượng phản xạ và khúc xạ xảy ra Để tính toán màu sắc tại điểm tiếp xúc, cần phải dò thêm các tia phản xạ và tia khúc xạ phát sinh từ bề mặt vật thể Các tia này, gọi là tia thứ cấp, có thể tiếp tục tương tác với các bề mặt khác, tùy thuộc vào tính chất của từng bề mặt Quá trình này được gọi là xử lý đệ quy trong ray tracing Các tia thứ cấp sẽ được phát ra cho đến khi không còn giao điểm giữa tia và đối tượng, hoặc đạt đến một độ sâu đệ quy nhất định Màu sắc tại một giao điểm trên bề mặt vật thể được tính toán theo một công thức cụ thể.

28 Ở đây I R local R cường độ sáng c c bụ ộ, thường được tính b ng mô hình ằ chi u ế sáng Phong

[12], I R reflected R và I R transmitted R là cường độ ủa tia phản xạ, khúc xạ đượ c - c xác đ nh đ quy ị ệ

K R r R và K R t R các hệ ố s phản xạ và khúc xạ c a ủ đối tượng đó.

Hình 7 Raytracing có tính chấ ệ t đ quy

Mã giả ủ c a gi i thuả ật như sau:

Color trace_ray( ray, depth )

{ if depth > MAX_DEPTH return BLACK;

/*check ray- object intersection*/ if (intersection of- - Ray To Object) - -

/*find the closest hit*/ obj = get_first_intersection(ray);

/*Ilocal is calculated by Phong model*/ final_color = get_local_illumination(obj);

In rendering techniques, when an object is reflective, the final color is calculated by adding the traced ray of the reflected light, multiplied by the reflection coefficient (Kr) Conversely, for refractive objects, the final color incorporates the traced ray of the refracted light, multiplied by the transmission coefficient (Kt) Ultimately, the function returns the computed final color.

} else /*have no intersection*/ return BACKGROUND_COLOR;

2.3.1 Mô hình chiếu sáng Phong

Duyệt cây BVH

BVH (Bounding Volume Hierarchy) sử dụng một thuật toán đơn giản để tìm kiếm giao điểm của tia sáng với các hình tam giác Khi tia sáng kiểm tra giao điểm với nút lá, danh sách các hình tam giác trong nút sẽ được xem xét Đối với các nút nội, nếu tia giao với bao bọc của nút, thuật toán sẽ kiểm tra đệ quy các nút con để tìm giao điểm Cần lưu ý rằng việc kiểm tra này cũng phải được thực hiện cho cả hai nút con, ngay cả khi đã tìm thấy một giao điểm ở nút cha, do đặc tính của thuật toán xây dựng cây BVH Cuối cùng, thuật toán sẽ trả về giao điểm gần nhất giữa tia sáng và hình tam giác Dưới đây là đoạn mã minh họa cách duyệt cây BVH để tìm giao điểm gần nhất.

Ray tracing là phương pháp mô phỏng hành vi của ánh sáng phát ra từ mắt người xem để tạo ra hình ảnh cho các vật thể Ý tưởng cơ bản là theo dõi đường đi của các photon ánh sáng ngược chiều về nguồn phát sáng, tức là cho tia sáng xuất phát từ vị trí mắt và đi qua từng điểm trên màn hình vào ảnh 3 chiều Sau đó, một mô hình rọi sáng được sử dụng để tính toán giá trị màu cho mỗi điểm ảnh trên màn hình Giải thuật bắt đầu bằng cách phóng ra các tia sơ cấp từ máy ảnh đến các điểm ảnh trên màn hình.

Các công thức toán học định nghĩa đối tượng trong khung cảnh giúp xác định giao điểm giữa tia sáng và đối tượng Nếu tia sáng không giao với bất kỳ đối tượng nào, một màu nền sẽ được trả lại cho điểm ảnh đó Ngược lại, nếu tia sáng tương tác với vật thể trong khung cảnh, điểm ảnh tương ứng sẽ có màu của vật thể gần nhất được tương tác.

Ray tracing là một kỹ thuật mô phỏng ánh sáng, trong đó tia sáng chiếu vào bề mặt vật thể có thể tạo ra hiện tượng phản xạ và khúc xạ Để tính toán màu sắc tại điểm tiếp xúc, cần phải dò thêm tia phản xạ và tia khúc xạ tương ứng từ bề mặt vật thể Các tia này tiếp tục tương tác với các bề mặt khác, tùy thuộc vào tính chất của từng bề mặt, dẫn đến các hiện tượng phức tạp hơn trong quá trình ray tracing Quá trình này được gọi là xử lý đệ quy, trong đó các tia được phóng ra cho đến khi không còn giao điểm giữa tia và đối tượng hoặc đạt đến một độ sâu đệ quy nhất định Màu sắc tại một giao điểm trên bề mặt của vật thể được tính toán thông qua một công thức cụ thể.

28 Ở đây I R local R cường độ sáng c c bụ ộ, thường được tính b ng mô hình ằ chi u ế sáng Phong

[12], I R reflected R và I R transmitted R là cường độ ủa tia phản xạ, khúc xạ đượ c - c xác đ nh đ quy ị ệ

K R r R và K R t R các hệ ố s phản xạ và khúc xạ c a ủ đối tượng đó.

Hình 7 Raytracing có tính chấ ệ t đ quy

Mã giả ủ c a gi i thuả ật như sau:

Color trace_ray( ray, depth )

{ if depth > MAX_DEPTH return BLACK;

/*check ray- object intersection*/ if (intersection of- - Ray To Object) - -

/*find the closest hit*/ obj = get_first_intersection(ray);

/*Ilocal is calculated by Phong model*/ final_color = get_local_illumination(obj);

In computer graphics, when dealing with reflective objects, the final color is computed by adding the contribution from the reflected ray, scaled by the reflection coefficient (Kr) Conversely, for refractive objects, the final color includes the contribution from the refracted ray, adjusted by the transmission coefficient (Kt) Ultimately, the final color is returned, incorporating the effects of both reflection and refraction.

} else /*have no intersection*/ return BACKGROUND_COLOR;

Mô hình chiếu sáng Phong 35T

Tất cả các đối tượng hình học đều có một hàm đặc trưng gọi là BRDF (bidirectional reflectance distribution function) để mô tả đặc tính phản xạ tại bề mặt Nếu không có một mô hình phản xạ BRDF rõ ràng, ánh sáng sẽ không tác động chính xác đến đối tượng, dẫn đến sự thiếu chân thực Một trong những phương pháp đơn giản nhưng hiệu quả trong việc mô hình hóa ánh sáng tác động lên đối tượng là mô hình chiếu sáng Phong, được thiết lập bởi Bùi Tường Phong vào năm 1975.

Mô hình chiếu sáng Phong phân biệt các loại ánh sáng thành ba thành phần chính: ánh sáng môi trường, ánh sáng khuếch tán và ánh sáng specular Thành phần ánh sáng môi trường đại diện cho lượng ánh sáng chiếu lên bề mặt đối tượng từ nguồn sáng toàn cục Ánh sáng khuếch tán mô tả sự phân bố ánh sáng tại những điểm khác nhau trên bề mặt của đối tượng, trong khi thành phần specular xác định độ bóng và phản chiếu của bề mặt.

Hình 8 Minh h ọ a công t h ứ c tính cư ng đ ờ ộ sáng theo mô hình Phong

Mỗi đối tượng trong khung cảnh có các loại ch t li u khác nhau Vấ ệ ới m i lo i material, ỗ ạ các tham số sau được xác định:

- k R s R : h ng sằ ố phản xạ specular

- k R d R : h ng sằ ố phản xạ diffuse

- k R a R : h ng sằ ố phản xạ ambient

- k R e R : độ bóng c a v t li u (material), s có giá trị ớn hơn tạủ ậ ệ ẽ l i các b m t m n và g n ề ặ ị ầ giống như gương Khi hằng số này lớn thì độ specular sẽ nh ỏ đi.

Trong bối cảnh ánh sáng, cường độ sáng của thành phần môi trường được ký hiệu là L_R, trong khi L_Ri và L'_Ri đại diện cho cường độ sáng của các thành phần khuếch tán và phản xạ tương ứng Các tham số này, cùng với màu sắc và thông tin về vectơ tại điểm giao nhau, được sử dụng để xác định màu sắc cuối cùng của điểm ảnh Giả sử điểm ảnh P trên bề mặt vật thể được chiếu sáng bởi tia S_b từ nguồn sáng, thì R_i là tia phản xạ của ánh sáng.

S R i R , N là véc tơ pháp tuyến tại điểm P, V là vectơ ỉch chi u n mề đế ắt người xem hay camera ảo

Công th c tính màu cu i cùng tứ ố ại điểm P theo mô hình Phong là:

Trong công thức trên, màu cuối cùng được tạo thành từ sự kết hợp của ba thành phần: ambient, diffuse và specular Tích của các vector là tích vô hướng, phản ánh tổng hợp tất cả các tia sáng từ các nguồn sáng chiếu tới điểm P.

Tia phản xạ

Để xác định các bề mặt có tính chất phản xạ, cần phát ra các tia phân xạ tại giao điểm của tia với đối tượng Với mỗi điểm đặt máy/camera, mọi vị trí trên một đối tượng có đặc tính phản xạ chỉ cho phép ánh sáng đi tới mắt ở một chiều duy nhất Màu sắc của tia phản xạ phụ thuộc vào màu của tia tới và màu của bề mặt đối tượng.

Gọi S là tia tới, N là vecto pháp tuyến tại bề mặt đối tượng, việc ạo ra tia phản xạt tương ứng R khá đơn giản theo công th c: ứ

Tia khúc xạ 35T

So với tia ph x, các tia khúc xạ có hướng đi phụ thuộc vào chỉ số khúc xạ của vật liệu Hình ảnh dưới đây minh họa một đường đi của tia khúc xạ khi tia truyền qua vật thể.

Việc sinh ra các tia khúc xạ tuân theo công th c sau:ứ

Che bóng

Quá trình raytracing bắt đầu bằng việc phát ra tia từ giao điểm tại nguồn sáng để xác định bóng che Nếu không có giao điểm giữa tia và nguồn sáng, bề mặt sẽ không có bóng Ngược lại, nếu có giao điểm, sẽ xuất hiện bóng che trên bề mặt Hình ảnh minh họa hai tia bóng che từ một bề mặt: tia LRA đi tới nguồn sáng A mà không bị ngắt, trong khi tia LRB chạm một đối tượng mờ trên đường đi tới nguồn sáng B.

Hình 11 Các tia che bóng để ự th c hi n hi u ứng che bóng ệ ệ

Màn ảnh

Màn hình được coi là một lưới ảo, tương tác 1-1 với các pixel và được định vị giữa mặt và khung cảnh 3D Kết quả render sẽ hiển thị các bức tranh 2 chiều, được lưu trữ trên màn hình này Hình ảnh minh họa cho một màn hình có độ phân giải là hả R res R x v R res.

Trong đồ họa máy tính, có sự phân biệt rõ ràng giữa các hệ tọa độ tương ứng với thế giới, màn hình, các nguồn sáng và các đối tượng Màn hình có một hệ tọa độ 2 chiều với các trục được đánh dấu bởi (i, j) Mỗi ô vuông trong hệ tọa độ này đại diện cho vị trí của một điểm ảnh, với kích thước s x s, trong trường hợp không cần chống nhiễu, s có giá trị là 1 Hệ tọa độ thế giới cũng được biểu diễn với các ký hiệu X, Y, Z.

Y R W R với trục ZW R R có chiều dương hướng ra phía người xem còn chiếu âm đi vào khung cảnh 3 chiều

Các tia được phát ra từ vị trí i=0 và j=0, sau đó tiếp tục di chuyển theo chiều dọc và chiều ngang Tuy nhiên, các đối tượng 3D được định nghĩa và đặt trong hệ tọa độ thế giới, vì vậy tọa độ 2 chiều trên màn hình cần được chuyển sang hệ tọa độ 3 chiều Công thức sau thể hiện việc chuyển đổi chỉ số i thành X trong hệ tọa độ thế giới và j thành Y trong hệ tọa độ thế giới.

Khi thực hiện các chuyển đổi, việc kiểm tra giao điểm giữa đường tư ng và tia ố ợ được tiến hành trong hệ tọa độ 3 chiều Các tia này có điểm gốc nằm trên trục dương.

Z R W R và có chiều đi vào trục âm Z R W R Điều này ng ý r ng màn nh b c ụ ằ ả ị ố định theo trục

Z R W R Để có thể xem được khung cảnh ở các góc nhìn khác nhau, raytracing sử ụng một d loại camera ảo là pinhole.

Camera pinhole

Camera ảo trong raytracing sử dụng loại camera pinhole, cho phép quan sát khung cảnh từ một vị trí cụ thể Các tham số quan trọng bao gồm điểm đặt mắt (e), điểm nhìn (l), vector up và khoảng cách giữa mắt và màn hình Điểm đặt mắt xác định vị trí của người xem, trong khi điểm nhìn chỉ ra điểm trong khung cảnh mà camera hướng tới Vector up chỉ định hướng lên, thường là trục tọa độ y; ví dụ, nếu vector này hướng âm trục x, camera sẽ quay sang trái 90 độ.

Để thực hiện một camera pinhole, cần tính toán chiều của các tia sơ cấp và xác định điểm đặt mắt (e) với các thành phần là các vecto u, v và w Các công thức liên quan tuân theo thứ tự quy định.

Sau đó chiều c a mủ ỗi tia sơ cấp được tính toán như sau: rayDirection = X R w R u + Y R w R v – d.w

Giao điể m tia – đố i tư ợ ng 35T

Các hàm tìm giao điểm của tia với các đối tượng trong không gian 3D là yếu tố cốt lõi trong một chương trình raytracing Dù là các mô hình chiếu sáng, ánh xạ bề mặt hay các kỹ thuật phân chia không gian, những hàm này đóng vai trò quan trọng trong việc xử lý và giảm thiểu hiện tượng răng cưa.

37 được s d ng trong gi i thu t, luôn luôn cử ụ ả ậ ần phải tìm ra giao điểm c a m t tia và một ủ ộ đối tượng

Khi một tia được phóng vào môi trường mô hình hóa, thông tin cần thu thập phụ thuộc vào mục đích của tia đó Đối với tia phát ra từ ánh sáng, hàm tính giao điểm với đối tượng sẽ trả về giao điểm gần nhất và pháp tuyến bề mặt tại điểm đó Nếu tia được sử dụng để kiểm tra bóng, thông tin cần thiết là liệu có giao điểm nào trên đường đi tới nguồn sáng hay không Ngoài ra, các thông tin khác cũng cần được thu thập tùy thuộc vào mô hình chiếu sáng Đối với các tia sáng kiểm tra với hộp bao (bounding volume), việc xác định liệu tia có chạm vào hộp hay không là đủ.

Như đã đề cập ở cấp trên, chúng ta sử dụng cấu trúc tăng tốc BVH cho các hộp bao của các hình tam giác nguyên thủy trong mô hình 3D Do đó, việc xác định giao điểm của tia với hộp cần được thực hiện một cách nhanh chóng Phần này sẽ trình bày một giải thuật đơn giản được đề xuất bởi Kay và Kajiya để xác định xem tia có cắt hộp hay không, sau đó sẽ giới thiệu các hàm tia – giao mảnh phẳng và tia giao đa giác, vì cây BVH chứa các hình tam giác của mô hình.

Giao điểm tia - hộp là một khái niệm trong đồ họa máy tính, liên quan đến hình hộp chữ nhật với các trục song song với trục tọa độ thế giới, được gọi là AABB (axis aligned bounding boxes) Mặc dù chúng không phải là một phần của cấu trúc phân cấp, việc kiểm tra giao điểm giữa các tia và hộp này vẫn được thực hiện, nhưng không cần xuất ra các hộp này.

Trước h t mế ột tia được xác đ nh b i hai thành ph n :ị ở ầ

Hình 14 Định nghĩa 1 tia trong hệ ọ t a đ ộ world Tia này có phương trình là :

Một hộp bao được biểu diễn bởi hai đỉnh ở 2 góc đối diện của nó B R l R = (Xl R R , Y R l R , Z R l R ) và

B R h R = (X R h R , Y R h R , Z R h R ) v i Xớ R l R X< R h R , Y R l R Y< R h R , Z R l R Z< R h R Kay và Kajiya đã giới thiệu một phương pháp kiểm tra tia cắt phù hợp trên các slabs Mỗi slab đơn giản là không gian giữa hai mặt phẳng song song Giao điểm của một tập hợp các slab sẽ xác định một hộp bao Theo đó, một hộp AABB là giao của 3 slab trong giao xứ [X R l R , X R h R ], [Y R l R , Y R h R ], [Z R l R , Z R h R ]: box = [X R l R , X R h R ] [Y R l R , Y R h R ] [Z R l R , Z R h R ].

Giá trị t R near R và t R far R được so sánh để xác định xem tia có cắt hộp hay không T R near R là giá trị nhỏ nhất giữa hai khoảng cách từ gốc của tia tới hai giao điểm của tia với slab mà tia đi vào, trong khi t R far R là giá trị nhỏ nhất giữa hai khoảng cách từ gốc của tia tới giao điểm của tia với slab mà tia đi ra Nếu t R near R lớn hơn t R far R, tia sẽ không cắt hộp; ngược lại, tia sẽ cắt hộp.

Sau đây là giải thu t kiậ ểm tra giao điểm tia và h p AABB,ộ giải thuật tr lả ại TRUE nếu tia c t hắ ộp và FALSE nếu ngược lại

Bắt đầu quá trình kiểm tra giao điểm: thiết lập t_near = -INFINITY (để tìm giá trị lớn nhất) và t_far = +INFINITY (để tìm giá trị nhỏ nhất) Đối với mỗi cặp mặt phẳng tương ứng với các trục x, y và z (ví dụ xét cặp mặt phẳng x), nếu XdR bằng 0 (nghĩa là tia song song với các mặt phẳng này), kiểm tra xem điểm gốc X0R có nằm giữa các slabs hay không; nếu X0R nhỏ hơn XlR hoặc lớn hơn XhR, trả về FALSE Nếu không, tia không song song với các mặt phẳng Tính toán khoảng cách từ giao điểm với các mặt phẳng: t1R = (XlR - X0R) / XdR và t2R = (XhR - X0R) / XdR Nếu t1R lớn hơn t2R, đổi chỗ t1R và t2R.

(t if if if if if R 1 R > t R near R ) thenthenthenthenthen t R near R = t R 1 R (t if if if if if R 2 R < t R far R ) then then then then then t R far R = t2 R

The algorithm checks if a ray intersects with a specified range If the ray's position is not within the defined limits, it returns FALSE Additionally, if the ray is behind a certain point, the function also returns FALSE This process involves multiple conditional checks to ensure accurate intersection detection.

{hộp đã qua tất cả các kiểm tra do đó} return TRUE

Hình 15 Hình ả nh 2 chi ề u minh h ọ a tìm giao điể m tia – h ộ p Bên trái, t R near R > t R far R nên tia không c ắ t h ộ p Bên ph ả i, t R near R < t R far R nên tia c ắ t h ộ p

2.3.7.2 Giao điểm tia – mặt phẳng

Mặt phẳng được định nghĩa bởi bốn hệ ố [A B C D] có phương trình là: s

+++ = 0 ở đây   +  +  = 1 Vec tơ pháp tuyến đơn vị ủ c a m t ph ng là Pặ ẳ R normal R = P R n R = [A B C]

Khoảng cách từ ốc của tia tới giao điể g m v i m t phớ ặ ẳng P thu được b ng cách thay thế ằ phương trình của tia vào phương trình mặt ph ng : ẳ

Viết dưới dạng vec tơ, biểu thức trên trở thành :  =   (    )

Đặt \( v_R d_R = P_R n_R \) Nếu \( v_R d_R = 0 \), tia sẽ song song với mặt phẳng và không có giao điểm Nếu \( v_R d_R > 0 \), vectơ pháp tuyến của mặt phẳng hướng ra xa so với hướng của tia, dẫn đến việc không có giao điểm Trong các trường hợp còn lại, ta tính giá trị của \( t \) theo công thức đã nêu.

Nếu t < 0 thì đường thẳng chứa tia giao với mặt phẳng tại 1 điểm nằm phía sau tia, do đó không có giao điểm th c s N u t  ự ự ế 0 thì có giao điểm v i t a đ (ớ ọ ộ  +  ,  +

2.3.7.3 Giao điểm tia đa giác–

Để tìm giao điểm giữa tia và đa giác, trước tiên cần xác định giao điểm giữa tia và mặt phẳng chứa đa giác Sau đó, vấn đề còn lại là xác định xem một điểm trên mặt phẳng có thuộc vào đa giác hay không.

Trước hết đa giác được định nghĩa là mộ ật t p n đi m ể

Mặt phẳng chứa đa giác có phương trình:

+++ = 0 và gi s ả ửtia giao với mặt ph ng này tẳ ại điểm  = (  ,  ,  )

Để chuyển đổi đa giác trong không gian lên mặt phẳng hai chiều, ta cần lựa chọn một trong ba trục X, Y, Z Cách thực hiện là xem xét giá trị tương ứng trong phương trình mặt phẳng của từng trục; nếu giá trị của một trục lớn nhất, ta sẽ chọn trục đó để thực hiện việc chuyển đổi.

Ví dụ ế pháp vec tơ n u P R n R = [0 5 3] thì s- ẽ ỏ đi trụ b c Y.

Hình 16 Chiế u đa giác lên m ặ t phẳng 2 chiều

Khi một đa giác được chiếu lên mặt phẳng, việc xác định xem một điểm có nằm trong đa giác hay không trở nên đơn giản Đầu tiên, ta chuyển đổi tọa độ của đa giác để điểm I trở thành gốc tọa độ Việc này được thực hiện bằng cách lấy tọa độ của mỗi đỉnh đa giác trừ đi tọa độ của điểm I Sau đó, ta bắn một tia từ gốc tọa độ theo một trong hai trục tọa độ và đếm số đoạn thẳng của đa giác mà tia này cắt phải Theo lý thuyết đường cong Jordan, nếu số đoạn bị cắt là lẻ, thì điểm I nằm trong đa giác; ngược lại, nếu số đoạn cắt là chẵn, điểm I nằm ngoài đa giác.

Hình 17 Kiể m tra đi ể m nằm trong đa giác Số đo ạ n thẳ ng b c ị ắt là lẻ (3) nên điểm nằm trong đa giác

2.4 Biểu diễn ảnh nổi và các lược đồ lọc màu

Theo nguyên lý chụp ảnh 3D, để tạo ra hình ảnh hoặc đoạn phim nổi, cần sử dụng một hệ thống máy quay ảnh động hoặc chụp ảnh ghi lại những bức ảnh tương ứng từ hai góc nhìn khác nhau của cùng một đối tượng hoặc cảnh vật Sau đó, các loại máy chiếu và thiết bị đeo mắt đặc biệt sẽ được sử dụng để mang lại trải nghiệm về độ sâu của đoạn phim hoặc bức ảnh cho người xem.

Hầu hết các công nghệ 3D hiện nay yêu cầu sử dụng kính, bao gồm kính 3D chủ động tương tác với hình ảnh trên màn hình để cải thiện chất lượng hình ảnh (như eclipse, interference filter) và kính 3D thụ động không tương tác (như anaglyph, colorcode) Ngoài ra, nghiên cứu trong công nghệ 3D cũng đã phát triển các hệ thống hiển thị 3D không cần kính (hologram, màn hình autostereoscopic), mặc dù những công nghệ này vẫn đang trong quá trình phát triển và chưa phổ biến Trong các rạp chiếu phim, hệ thống phân cực là công nghệ 3D phổ biến nhất, nhưng đi kèm với nó là yêu cầu đầu tư vào máy chiếu và màn hình chất lượng cao.

Lựa chọn biểu diễ ảnh nổ dựa trên một số lượn i c đ ọc màu là phù hợp với mục tiêu nghiên cứu của luận văn Mặc dù không phải là công nghệ cao trong lĩnh vực 3D do có thể gây ra màu sắc không đồng nhất ở ảnh cuối cùng, nhưng phương pháp này vẫn có những lợi thế như tạo cảm nhận về độ sâu rõ ràng và hiển thị tốt trên nhiều loại màn hình với chi phí thiết bị thấp.

Môi trường phát triển ứng dụng CUDA 35T

CUDA (Compute Unified Device Architecture) là một bộ phần mềm phát triển dành cho các bộ xử lý đồ họa đa lõi của NVIDIA Nó bao gồm trình điều khiển thiết bị, công cụ phát triển phần mềm, ngôn ngữ lập trình cho ứng dụng trên GPU, chương trình dịch, cùng với các thư viện và chương trình mẫu hỗ trợ lập trình viên trong việc tối ưu hóa hiệu suất ứng dụng.

CUDA là một ngôn ngữ lập trình mở rộng của C và C++, cho phép lập trình viên phát triển các chương trình có khả năng thực thi song song trên GPU Chương trình CUDA bao gồm một hoặc nhiều hàm được gọi là kernel, được đánh dấu đặc biệt Những kernel này có thể chạy đồng thời trên hàng triệu luồng, giúp tăng hiệu suất xử lý Để tối ưu hóa hiệu năng, lập trình viên cần chú ý đến cách tổ chức và quản lý các luồng, bởi vì chúng thực thi cùng một mã nhưng được phân biệt bởi chỉ số luồng.

53 áp dụng các kỹ thuật song song hóa dữ u (dliệ ữ liệu đượ c phân chia thành các phần nhỏ và được chia cho t ng lu ng xừ ồ ử lý)

Người lập trình cần quy định số lượng luồng cho mỗi nhiệm vụ để đảm bảo chương trình hoạt động hiệu quả Điều này giúp chương trình không phụ thuộc vào hệ thống thực thi, từ đó cải thiện hiệu suất và khả năng xử lý.

Trên bộ xử lý đồ họa, các luồng được chia thành các nhóm nhỏ gọi là khối luồng (thread block) để có thể thực thi đồng thời Những khối luồng này được tổ chức thành một lưới luồng (grid), như được mô tả trong hình dưới đây.

Hình 25 Lướ i g ồ m các kh ố i lu ồ ng CUDA

CUDA cho phép thực hiện đồng thời 54 luồng, trong khi các luồng khác sẽ tự động được chia thành nhiều đợt thực hiện Để tối ưu hóa việc lập trình, các luồng trong một khối (cũng như các khối trong một lưới) có thể được tổ chức thành các mảng một chiều, hai chiều hoặc ba chiều Chỉ số ba chiều threadIdx được sử dụng để phân biệt các luồng trong cùng một khối, trong khi

Các chương trình CUDA được phân thành mã ch y trên CPU và mã ch y trên GPU ạ ạ

Việc khởi tạo môi trường CUDA và gọi các hàm kernel được thực hiện bởi CPU, nhằm chuyển giao các tác vụ tính toán nặng nề cho GPU Lời gọi kernel sử dụng cú pháp đặc biệt >, ví dụ: myKernel>( … params … );.

Lời gọi này chấp nhận các tham số numBlocks và numThreadsPerBlock, cho phép lập trình viên chỉ định số lượng luồng trong một block và số block được khởi tạo bởi GPU để thực thi hàm kernel Các GPU thế hệ GT 200 của NVIDIA có khả năng chứa tối đa 512 luồng trong một khối Sau khi xác định số luồng trong một khối, số lượng block thường được tính toán dựa trên kích thước dữ liệu N, được xác định qua công thức: int numBlocks = N/numThreadsPerBlock + (N % numThreadsPerBlock == 0 ? 0 : 1).

Ví dụ sau đây minh họa phép toán saxpy trong bộ thư viện đại số tuyến tính cơ bản BLAS (y < a x + y) v- ới m i véc-ỗ tơ x và y gồm n s th c d u phố ự ấ ảy động:

global void saxpy(int n, float a, float *x, float *y)

{ int i = blockIdx.x * blockDim.x + threadIdx.x; if (i < n) y[i] = a * x[i] + y[i];

} int main(int argc, char *argvs[])

Trong ví dụ này, hàm saxpy được thực hiện song song trên GPU, với phép tính y[i]=a*x[i]+y[i] được phân chia thành nblocks, mỗi block có 256 luồng Chỉ số được tính toán thông qua threadIdx.x và blockIdx.x, với blockDim.x đại diện cho số lượng luồng trong một block CUDA cho phép GPU hoạt động như một bộ đồng xử lý cho CPU, trong khi CPU chỉ định nhiệm vụ và nhận kết quả từ GPU Nó cung cấp API để truy cập và truyền dữ liệu hai chiều giữa GPU và CPU Mã dưới đây minh họa quy trình thông thường mà các chương trình CUDA thường tuân theo: khởi tạo dữ liệu trên CPU và GPU bằng cách sử dụng cudaMalloc và cudaMemcpy.

G ọ i hàm kernel đ ể thực hiện tính toán sử ụng dữ d liệu gpu_data cuda MemCpy(cpu_data,gpu_data, data_size* sizeof(float),cudaMemcpyDevice

ToHost); free( cpu_data ); cudaFree( gpu_data );

Trong lập trình CUDA, việc phân chia dữ liệu bài toán cho nhiều luồng xử lý và tổ chức các loại bộ nhớ là rất quan trọng Bộ nhớ được chia thành nhiều cấp độ truy cập: bộ nhớ RAM chỉ có thể truy cập từ mã chương trình chạy trên CPU, trong khi bộ nhớ toàn cục GPU chỉ có thể truy cập từ các luồng GPU Bộ nhớ chia sẻ có thể truy cập từ các luồng trong cùng một khối, bộ nhớ cục bộ chỉ có thể truy cập trong một luồng, và bộ nhớ hộp đen cho phép các luồng GPU đọc dữ liệu.

Hình 26 Các lo ạ i b ộ nh ớ ủ c a CUDA

Bộ nhớ trên GPU có dung lượng và tốc độ truy cập khác nhau, với bộ nhớ toàn cục có dung lượng lớn nhưng tốc độ truy cập thấp Ngược lại, bộ nhớ chia sẻ nằm trên chip có tốc độ truy cập nhanh hơn nhưng dung lượng hạn chế Do đó, lập trình viên CUDA cần chú trọng vào việc tối ưu hóa truy cập bộ nhớ để nâng cao hiệu suất chương trình Thông tin chi tiết có thể tìm thấy trong tài liệu hướng dẫn lập trình CUDA của NVIDIA.

3.1 Song song hóa giải thuật raytracing trên GPU

Raytracing là phương pháp tạo ra hình ảnh bằng cách bắn các tia từ mắt người qua từng điểm ảnh trên màn hình và tính toán các giao điểm của tia với các đối tượng trong khung cảnh Mục tiêu cuối cùng là xác định giá trị màu cho từng điểm ảnh tương ứng với các tia đó Giá trị màu này được xác định độc lập và không phụ thuộc vào màu sắc của các điểm hàng xóm, do đó các phần tử nhỏ nhất trong thuật toán được gọi là các điểm ảnh.

Đặc tính của giải thuật cho phép song song hóa quá trình render bằng cách sử dụng nhiều luồng để xử lý các điểm ảnh đồng thời Mỗi luồng thực hiện đầy đủ các công việc của raytracing như tính toán chiếu sáng, tô bóng, che bóng và kiểm tra giao điểm giữa tia và đối tượng Điều này rất quan trọng vì khi tính toán cho nhiều tia phân xạ và khúc xạ, mỗi tia có thể có một hướng đi khác nhau, ảnh hưởng đến các phần của khung hình Do đó, mỗi luồng cần thực hiện độc lập và đầy đủ quá trình render cho một điểm ảnh nhất định.

Màn hình được đặt giữa khung cảnh và điểm đặt camera với tỷ lệ 1-1 tại các điểm trên bề mặt để hiển thị hình ảnh có độ phân giải MAXX*MAXY Tọa độ của màn hình được biểu diễn bằng cặp chỉ số (x, y) Đồng thời, một hệ tọa độ thế giới (XWR, YWR, ZWR) cũng được thiết lập để quy chiếu cho tất cả các đối tượng như camera, màn hình và khung cảnh 3D Tọa độ thế giới có gốc tại tâm của màn hình, với trục dương của ZWR hướng vào khung cảnh.

Hình 27 Tương ứ ng gi ữ ộ đệ a b m lưu gi ữ ả nh và màn nh ả

Việc bắn tia bắt đầu từ vị trí x = 0 và y = 0, và tiếp tục theo chiều dài và rộng của màn hình cho đến khi hoàn tất GPU với khả năng xử lý nhiều luồng song song trở thành giải pháp lý tưởng cho bài toán render này Chúng ta có thể gán cho các luồng của GPU nhiệm vụ render các điểm ảnh từ trái sang phải, và từ dưới lên trên của màn hình Do các đối tượng hình học 3D được định nghĩa trong không gian thế giới, nên tọa độ điểm ảnh trên màn hình cần được chuyển đổi từ hệ tọa độ 2 chiều sang tọa độ 3 chiều của thế giới Đoạn mã sau minh họa ý tưởng cơ bản về việc sử dụng song song, với hàm kernel mã CUDA: parallelRendering(MAXX, MAXY, buffer, camera).

{ for idx = 0 to MAXX*MAXY - 1 in parallel x = idx mod MAXX; y = idx div MAXX;

/* tạo tia t ừ camera t ớ i t ọ a đ ộ (xw,yw)*/ primaryRay = MakeRay(xw, yw, camera);

/* th ự c hi ệ n raytracing để tính giá tr ị màu*/

/* lưu color vào điể m nh (x,y) tương ả ứ ng */ buffer[y*MAXX + x] = Color;

Thiết lập camera 35T

Việc thiết lập khung cảnh 3D bao gồm sắp xếp các đối tượng ảo, nguồn sáng, camera và các yếu tố khác Phần này trình bày cách thiết lập hai vị trí camera và mô tả chuyển động của camera xung quanh khung cảnh/mô hình 3D Hai vị trí camera này sẽ được truyền tải để thực hiện raytracing song song, nhằm tạo ra hai bức ảnh cho việc tạo ảnh nổi 3D theo chuẩn anaglyph.

Một đối tượng camera bao gồm hai thành phần chính: vị trí đặt camera (eye) và vị trí mà camera hướng tới (lookat) Cả hai vị trí này đều được xác định bằng tọa độ trong không gian ba chiều Oxyz Cấu trúc dữ liệu để lưu trữ thông tin của đối tượng camera được định nghĩa như sau: struct Camera.

Vector3 eye; /* eye là v ị trí đ ặ t c ủ a camera trong h ệ t ọ a đ ộ không gian 3 chiều Oxyz */

Vector3 lookat; /* lookat là vị trí mà camera chiế u đ ế n trong h t a ệ ọ độ không gian 3 chi u Oxyz */ ề

Khi tạo đối tượng camera, vị trí của camera ảnh hưởng đến góc nhìn và hướng chụp Hướng nhìn của camera được xác định bởi một vector, với điểm đầu là vị trí đặt camera và điểm cuối trùng với góc nhìn Điều này tạo ra một mặt phẳng Oxy với góc angle2, trong khi hình chiếu trên Oxy tạo ra góc angle1 Khoảng cách từ vị trí đặt camera đến đối tượng cần chụp cũng rất quan trọng Để điều chỉnh vị trí của camera, người dùng có thể thay đổi giá trị của các tham số liên quan.

Hình 28 V ị trí của camera (eye, look at) trong tọ - a đ ộ không gian 3 chi u ề

Khi camera được thiết lập để chuyển động, góc angle1 sẽ thay đổi trong khi góc angle2 và khoảng cách d giữ nguyên Vị trí của camera sẽ được cập nhật dựa trên ba tham số này: angle1, angle2 và d.

Để tính khoảng cách d từ camera đến điểm (x, y, z), ta sử dụng công thức d = √(x² + y² + z²) Khi thay đổi góc quay angle1, vị trí của camera sẽ được tính toán lại theo công thức tương ứng.

Chế độ chuyển động của camera cho phép quay tự động quanh khung cảnh, cụ thể là quanh trục Oz Hình ảnh minh họa hướng quay của camera bằng cách điều chỉnh góc angle1 trong khi giữ nguyên các giá trị của d và angle2 Khi camera quay, nó được dịch chuyển theo hướng ngang trong một mặt phẳng song song với mặt phẳng ngang 0xy, đảm bảo rằng góc nhìn tới đối tượng không bị lệch.

Camera có khả năng di chuyển theo nhiều hướng khác nhau, bao gồm lên và xuống Để thực hiện các chuyển động này, ta cần xác định một vector đơn vị trên trục Oz (0,0,1) Từ đó, xác định vector hướng từ vị trí của camera đến đối tượng cần nhìn Từ hai vector này, ta có thể tính toán vector rightAxis, thể hiện hướng di chuyển của camera vuông góc với hướng nhìn Vector rightAxis nằm trong một mặt phẳng ngang Để tính toán hướng di chuyển lên và xuống của camera, ta sử dụng vector upAxis, là tích có hướng của vector rightAxis và vector EyeToLookat.

Để tạo ra các bức ảnh anaglyph, một camera thứ hai được thiết lập song song với camera ban đầu, nhưng vị trí của camera thứ hai được điều chỉnh lệch một đoạn theo phương của vector rightAxis Khoảng cách lệch này có thể được tính toán bằng một số công thức, tuy nhiên trong chương trình thực nghiệm, giá trị này được xác định thông qua thực nghiệm.

Trong nghiên cứu của luận văn, hoạt động của camera chủ yếu là thực hiện việc quay xung quanh vật thể Mỗi bước quay, góc quay sẽ thay đổi một lượng nhỏ, và vị trí của hai camera sẽ được cập nhật để tiến hành render ảnh tại vị trí đó Sau đó, camera thứ hai sẽ được dịch chuyển theo phương ngang để tạo độ lệch.

Trong quá trình thực hiện, cả hai camera đều quay xung quanh khung cảnh qua các bước sau:

 Khởi tạ camera1o và camera2

 Tính toán vec tơ rightAxis

 Đặt camera2 l ch theo chi u c a rightAixs so v i camera1 m t kho ng ệ ề ủ ớ ộ ả d được xác định b i th c nghi m ở ự ệ

 Truyền các camera tới hàm render

 L p: ặ o Cập nhật vị trí: camera2 = camera1 o Di chuyển camera1 m t kho ng ộ ả d xung quanh v t ậ camera1 += rightAxis * d o Thực hiện render

Ở bước này, mọi thay đổi về vị trí hoặc góc nhìn camera đều cần được cập nhật đồng thời cho cả hai camera Điều này đảm bảo rằng các thay đổi đó sẽ được đưa vào hàm render một cách chính xác.

Tạo ảnh anaglyph trên GPU 35T

Việc thêm camera thứ hai vào quá trình raytracing cho phép tạo ra hai bức ảnh tương ứng với hai camera, đồng thời các luồng xử lý sẽ lần lượt thực hiện hàm trace_ray cho cả hai camera Khả năng song song hóa của công thức trộn màu anaglyph được thể hiện rõ, khi việc trộn màu được thực hiện cho từng điểm ảnh của hai bức ảnh đầu vào Ảnh anaglyph có thể được thực hiện ngay trong nhân song song, với chiến lược là khi mỗi luồng kết xuất nhận được hai điểm ảnh tương ứng từ hai camera, luồng đó sẽ tiếp tục trộn màu và tạo ra một điểm ảnh duy nhất để lưu trữ vào bộ đệm Điều này giúp giảm thiểu chi phí truyền các cặp frame về CPU, đặc biệt khi chương trình tạo ra nhiều frame liên tục.

Mã gi cho công viả ệc tạo ảnh anaglyph như sau:

/* THREADS_PER_BLOCK là số tiề n trình song song t ố i ưu trên GPU */ numThreads = THREADS_PER_BLOCK

/* Tính s ố ầ l n g ọi các nhân song song */ numblocks = (MAXX*MAXY + numThreads – 1)/numThreads ;

/* khở ạ i t o hai đ i tư ố ợ ng camera trên device */ cudaMalloc(cudaCam1); cudaMalloc(cudaCam2);

Để thiết lập hệ thống camera trên host, cần liên tục cập nhật vị trí của camera di chuyển theo kịch bản đã định Sau đó, tiến hành đặt camera thứ hai lệch đi so với camera đầu tiên để đảm bảo hiệu quả giám sát tối ưu.

To perform ray tracing calculations on a GPU, the camera data must be copied from the host to the device using CUDA This process involves utilizing the `cudaMemcpy` function to transfer the camera structures, `Cam1` and `Cam2`, to their respective device pointers, `cudaCam1` and `cudaCam2`.

/*Cấ p phát m t m ộ ả ng trên GPU đ ể ch a ả ứ nh anaglyph k t xuấ ế t đư ợ c*/ cudaMalloc(Pixels);

/* Gọi nhân song song để th c hi n k t xuất ảnh nổi anaglyph ự ệ ế parallelRendering(cudaCam1, cudaCam2,

/* Lấy kết quả trả ề ừ v t GPU */ i nt *result; cudaMemcpy(result, Pixels, MAXX MAXY * *(sizeof(int)), cudaMemcpyDeviceToHost)

Ghi kết quả render vào nh đ ả ầ u ra bằng cách sử dụng hàm write_output_file(output, result) Đoạn mã này thực hiện việc thu thập dữ liệu và thiết lập các camera trên CPU, sau đó sao chép chúng lên vùng nhớ GPU Tiếp theo, nó gọi nhân song song để thực hiện kết xuất ảnh nổi Kết quả đầu ra là ảnh anaglyph chứa trong vùng nhớ Pixels trên GPU, được sao chép trở về CPU.

Và hàm parallelRendering được vi t l i chi tiế ạ ết hơn so với mô t ảở 3.1, như sau:

global void parallelRendering( cudaCam1, cudaCam2, Pixels )

{ int idx = blockIdx.x * blockDim.x + threadIdx.x; if (idx MAXX*MAXXY) return;  x = idx mod MAXX;

/*mỗ i lu ng t o 2 tia t 2 camera t i t ồ ạ ừ ớ ọ a đ ộ (xw,yw)*/ primaryRay 1 = MakeRay(xw, yw, camera 1 ); primaryRay 2 = MakeRay(xw, yw, camera 1 );

/ *mỗi luồng thực hiệ n raytracing đ ể tính giá trị màu*/

Color = mix_color(color1, color2);

/*mỗi luồng lưu color vào điểm ả nh (x,y) tương ứ ng */

Trong đoạn mã này, việc tính toán màu cho ảnh đầu ra được thực hiện ngay khi có sự kết hợp màu từ từng điểm ảnh với mô hình camera Hàm mix_color() đảm nhận việc trộn màu theo chuẩn anaglyph Cuối cùng, mảng Pixels lưu trữ dữ liệu của ảnh nổi anaglyph.

Kết quả từ pha trước cho phép thực hiện render ảnh 3D anaglyph từ mô hình 3D, sử dụng song song hóa trên GPU Bằng cách áp dụng kết quả này và tạo hoạt cảnh cho camera, chúng ta có thể liên tục render các frame ảnh và sau đó kết hợp chúng thành video.

Hình 31Các bướ ạc t o video t mô hình 3D ừ

Phần này mô tả quy trình thực hiện sau khi thu thập đủ số lượng khung hình anaglyph, dựa trên kết quả từ các phần trước Quy trình này chủ yếu được thực hiện trên CPU, với mục tiêu tận dụng sự hỗ trợ từ các phần mềm mã nguồn mở có sẵn, bao gồm các thư viện JPEGLIB và abilib.

Các bức ảnh anaglyph được tạo ra từ kỹ thuật bitmap (BMP) nhằm đảm bảo màu sắc chính xác và xử lý các bit màu của mỗi pixel một cách thuận tiện Tuy nhiên, định dạng bitmap không nén dẫn đến dung lượng lớn hơn so với các định dạng khác với cùng độ phân giải Ví dụ, một bức ảnh bitmap có độ phân giải 600x800 có dung lượng khoảng 1.4 MB Kết quả là, một đoạn video dài 1 phút được tạo nên từ các bức ảnh này với tỷ lệ khung hình nhất định sẽ có dung lượng lớn.

Khi làm video 3D từ các bức ảnh lớn, kích thước khoảng 2.05 GB cho 25fps sẽ gây khó khăn Do đó, cần nén các ảnh anaglyph trước khi tạo video Phương pháp nén sử dụng định dạng JPEG, một chuẩn phổ biến trong đồ họa Nền tảng Linux hỗ trợ thư viện JPEGLIB, giúp dễ dàng thực hiện các thao tác xử lý ảnh liên quan đến định dạng này.

Bằng cách sử dụng các API của thư viện này, ảnh bitmap được chuyển đổi sang định dạng JPEG với kích thước nhỏ hơn nhiều so với ảnh ban đầu Kết quả của quá trình này là một bộ dữ liệu chứa tất cả các ảnh đã được chuyển đổi Quá trình nén sang định dạng JPEG bao gồm nhiều bước.

- Khởi tạo và ấp phát bộc nh ớ cho đối tượng JPEG

- Ch ra ỉ ảnh lưu kết quả đầu ra

- Đặt các tham số nén

- Bắt đầu quá trình nén

- Đọc từng dòng nội dung ảnh để nén

- Kết thúc quá trình nén

Sau khi thu được ảnh nén JPEG, luận văn tạo video định dạng MJPEG bằng cách sử dụng thư viện avilib Thư viện này cung cấp ba hàm cơ bản: avi_open() để khởi tạo file video đầu ra, avi_add_frame() để thêm các khung hình vào video, và avi_close() để kết thúc quá trình tạo video.

Create_avi(int number_fram s) e

{ if(number_frames == 0) return; else

Avi_write_header(output_video);

/*write frames to the video*/ for i = 0 to number_frames

Toàn b quá trình trên, bao g m chuyộ ồ ển đ i ảổ nh và tạo video, được thực hiện trên CPU với giá trị number_frames được thiết lập là 100 để ử th nghi m ệ

CHƯƠNG 4 KẾT QUẢ THỬ NGHIỆM

Các gi i thu t song song hóa raytracing trên GPU và sinh ả ậ ảnh nổi 3d anaglyph đã được cài đặt và th nghi m trên m t h th ng máy tính có c u hình ử ệ ộ ệ ố ấ

• CPU: Intel(R) Pentium(R) D CPU 2.80GHz

• GPU: mộ ộ ử lý đồ ọt b x h a GeForce GTX 295 của NVIDIA

Hệ điều hành được sử dụng là CentOS 5.3 32 bit (Linux) Chương trình đầu vào bao gồm hai mô hình 3DS: chessboard.tri với khoảng 46.000 hình tam giác và garden.3DS phức tạp hơn với khoảng 970.000 hình tam giác Mục tiêu của chương trình là kết xuất 100 bức ảnh 3D theo chuẩn anaglyph cho mỗi mô hình, với độ phân giải 600x800 pixels Trong quá trình kết xuất, camera sẽ xoay quanh mô hình để tạo ra các bức ảnh từ những góc nhìn khác nhau.

Hình ảnh dưới đây trình bày hai bức ảnh anaglyph tương ứng với hai mô hình đầu vào là bàn cờ và khu vườn, được tạo ra thành công bằng công nghệ màu red/cyan Để trải nghiệm hiệu ứng nổi, người xem cần đeo kính lọc màu red/cyan.

75 Hình 32 Ảnh anaglyph t ạ o đư c vớ ợ i mô hình chessboard

Hình 33 Bức ảnh nổi đượ c k t xu t t ế ấ ừ mô hình garden.3ds

Chương trình sử dụng giải thuật song song đã giảm đáng kể thời gian chờ đợi so với chương trình tuần tự Bảng 2 minh họa thời gian kết xuất với mô hình đơn giản chessboard, cho thấy sự khác biệt khi chạy trên GPU và CPU với số lượng khung hình 3D thay đổi.

B ả ng Th 2 - ờ i gian ch ạ y tính theo giây k ế t xu ấ t mô hình chessboard.tri g ồ m kho ả ng 46 000 tam giác v ớ ộ i đ phân gi ả i 600*800 điể m ả nh trên CPU Pentium D 2.8 GHz và GPU Geforce GTX 295

S ố lượng frame Thời gian kết xuất trên CPU

Thời gian kết xuất trên GPU

Ngày đăng: 22/01/2024, 17:03

TÀI LIỆU CÙNG NGƯỜI DÙNG

TÀI LIỆU LIÊN QUAN