Màu khuếch tỏn là sự trải ra như nhau theo mọi phương hướng, và vỡ thế chỉ phụ thuộc trờn vectơ ỏnh sỏng đầu vào L, và vectỏ phỏp tuyến trực chuẩn N. Hỡnh vẽ sau cho thấy ý tưởng đú:
Hỡnh 8.7 Mụ tả ỏnh sỏng khuếch tỏn
Mụ hỡnh Phong sau khi thực hiện thành phần phản chiếu:
Specular Color Calculation
ReflectionVector R IntersectionNormal N IntersectionPoint P
Surface S = Surface P lies on
float glossiness = S.material.glossiness float angle = R.dot(N)
float intensity = Light.Color * S.material.specular return intensity * pow(angle,glossiness)
Hỡnh 8.8 hỡnh cầu Raytraced chỉ với thành phần phản chiếu
Mụ Hỡnh Phong:
Đa số vật thể khụng chỉ được mụ tả đơn thuần bằng mỗi thuộc tớnh phản xạ hay khuếch tỏn, mà nú là sự kết hợp của cả hai yếu tố này thậm chớ là cả cỏc thuộc tớnh bao quanh nếu cần.
Mụ hỡnh Phong được định nghĩa trong BRDF như sau:
Khỏi niệm Định nghĩa
Diffuse Phần nhỏ năng lượng phản chiếu
Specular Phần nhỏ của năng lượng khuyếch tỏn phản chiếu
Hỡnh 8.9 Phõn phối của Phong. Đa số việc mở rộng thực thi đều đưa tới: Đoạn mó rỳt gọn: Phong Calculation return AmbientColorCalculation()+DiffuseColorCalculation()+SpecularColorCalculation();
Lưu ý: nếu ta dựng màu sắc theo hướng trực quan hoỏ thỡ sẽ cần dựng đến phương phỏp chồng chất màu.
Hỡnh 8.10 Hỡnh cầu Raytraced với ỏnh sỏng Phong 8.2.5. Sự tương tỏc bề mặt/ỏnh sỏng
Mỗi bề mặt tương tỏc ỏnh sỏng theo những cỏch khỏc nhau tuỳ theo thuộc tớnh riờng của nú.
Absorbance
Trong thế giới thật một bề mặt luụn thu hỳt một vài luồng ỏnh sỏng khỏc nhau nào
đú. Điều đú lý giải cho sự tỏn sắc nhiệt. Và đa số những thuộc tớnh này đều bị bỏ qua khi render. Đụi khi quỏ trỡnh render cũng phải sử dụng một số vật thay thế ngẫu nhiờn (fake)
để trỏnh cỏc vũng đệ quy vụ hạn.
Reflectance
Một bề mặt phản chiếu ỏnh sỏng dựa trờn cỏc yếu tố như: bề mặt bỡnh thường của vật, hướng nhỡn, và gúc tới của ỏnh sỏng. Tham số hệ số phản xạ chớnh là giỏ trị cường độ
ỏnh sỏng trong khu vực xem xột được mụ tảở trờn.
8.2.6. Sự khỳc xạ và sự truyền sỏng
Bất kỳ một vật thể nào với một độ trong suốt nhất định thỡ đều truyền sỏng. Đú là hiện tượng ỏnh sỏng đi qua cỏc điểm cong P, tuõn theo luật Snell. Hiện tượng này dễ thấy nhất khi ta quan sỏt một cốc nước, nơi mà cỏc đối tượng ở một mặt khỏc hay ở dưới bề mặt
quan sỏt cú vẻđược chuyển vị trớ. Vỡ thế nếu một tia tới trong mụi trường vật chất m1 (lỳc này khụng khớ và chõn khụng đều được coi là vật chất) với hệ số khỳc xạ n1ở một gúc θ1,
đến mụi trường vật chất m2 cú hệ số khỳc xạ n2; thỡ luật Snell định nghĩa là:
Đõy được gọi là phương trỡnh khỳc xạ của tia T.
R là tia tới của ỏnh sỏng.
Biờn giới giữa hai mụi trường vật chất được gọi là giao diện.
8.3. CÁC CễNG NGHỆ 8.3.1. Raytracing
8.3.1.1. Giới thiệu
Raytracing bắt đầu được sử dụng trong đồ họa mỏy tớnh từ khoảng 1980 như là một sự thử
nghiệm sớm nhất trong việc giải quyết vấn đề chiếu sỏng tổng thể. Sau đú đó cú vụ số cải tiến được đưa ra, nhưng chỳng ta chỉ diễn tả một ý tưởng cơ bản và những phần liờn quan. Phần này cú nhiều ưu điểm hơn và cũng chứa một vài kỹ thuật mới hơn, tuy khụng cải thiện chất lượng hỡnh ảnh nhưng lại tăng tốc độ trong việc xử lý biểu diễn.
8.3.1.2. Thuật toỏn
í tưởng cơ bản trong raytracing là lần theo dấu vết của cỏc phần tử ỏnh sỏng ngược chiều với nguồn phỏt sỏng, vớ dụ từ mắt đến khung cảnh. Khi một tia sỏng tiếp xỳc với đối tượng trong khung cảnh cú ỏnh sỏng cường độ mạnh tại điểm giao nhau được tớnh toỏn cho phương đối diện với tia sỏng. Cường độ này chớnh là “màu” của tia sỏng.
Để tớnh toỏn cường độ, chỳng ta sử dụng cụng thức sau: I = Ilocal + kr*Ireflected + kt*Itransmitted
Trong đú:
Ilocal: ỏnh sỏng trực tiếp
Kr: nhõn tố phụ thuộc vật chất đại diện sự phản chiếu Ireflected: cường độ ỏnh sỏng đến từ nguồn phản chiếu Kt: nhõn tố phụ thuộc vật chất đại diện độ chắn sỏng Itransmitted: cường độ ỏnh sỏng truyền xuyờn qua đối tượng
Ilocal:(ỏnh sỏng trực tiếp) cú thểđược tớnh toỏn sử dụng bất kỳ sự phản chiếu mụ hỡnh cục bộ nào, nhưng trong thực tế điều này đa số luụn luụn là mụ hỡnh Phong được mụ tả
trong phần trước của tài liệu. Mụ hỡnh thường được tăng cường và được gọi là “búng nhạy sỏng”(Shadow feelers). Búng nhạy sỏng là tia sỏng được nộm xuyờn qua khung cảnh từ điểm giao nhau đến mỗi nguồn sỏng để xỏc định nếu cú tầm nhỡn (line of sight) hoặc nếu ỏnh sỏng bị chặn lại bởi một vài đối tượng khỏc. Nếu một nguồn sỏng bị chặn lại thỡ nú bị
bỏ qua trong mụ hỡnh cục bộ. Mụ hỡnh Phong cú thểđược tớnh toỏn từđiểm giao nhau và tại điểm bề mặt thụng thường.
Cả Ireflecttedvà Itransmittedđều được xỏc định bằng việc bắn một tia sỏng mới xuyờn qua khung cảnh cũng giống như tia sỏng được bắn xuyờn qua điểm ảnh của hỡnh ảnh. Điểm bắt đầu của chuỗi tia sỏng này là điểm giao nhau, cú phương là phương phản chiếu của Ireflected và hướng khỳc xạ của Itransmitted. Việc tớnh toỏn những phương hướng này được biểu diễn (covered) bờn dưới:
Phương hướng được tớnh toỏn như sau: R = 2(N*L)N - L
Trong đú: N : phỏp tuyến trực chuẩn tại điểm giao nhau L: phương đối diện với tia sỏng đến
Điều khiển việc truyền tia sỏng (khỳc xạ):
T = (n1/n2)L - (cos(φ) + (n1/n2)(L*N))N Trong đú: n1: chỉ số khỳc xạ của vật chất đến
n2: chỉ số khỳc xạ của vật chất đi φ: được xỏc định bằng cụng thức sau: (sin φ/sin θ) = (n1/n2) và θ là gúc giữa L và N
Một khi bắn một tia sỏng mới tới mỗi điểm giao nhau (để tớnh toỏn Ireflected và Itransmitted) raytracing sử dụng một hàm đệ quy. Điều kiện giới hạn cho đệ quy cú thể hoặc là định trước chiều sõu phộp đệ quy cực đại cú thểđạt đến hoặc khi tia sỏng khụng chạm tới bất kỳ đối tượng nào trong khung cảnh trong trường hợp nào đú được cấp phỏt một màu nền.
Rừ ràng độ sõu hơn mà ta cho phộp phộp đệ quy sẽ làm thời gian dịch lõu hơn nhưng chiều sõu phộp đệ quy cực tiểu cú thể làm cho một phần nhất định của hỡnh ảnh bị mất. Việc tỡm chớnh xỏc chiều sõu của phộp đệ quy cực đại để sử dụng là một vấn đề của việc vặn và kiểm tra cho đến khi kết quả hỡnh ảnh nhỡn được tốt.
Một vớ dụ làm cỏch nào để xỏc định trước chiều sõu phộp đệ quy cú thểảnh hưởng
đến hỡnh ảnh cuối cựng cú thể được nhỡn thấy trong ảnh dưới. Hỡnh ảnh đầu tiờn hiển thị
một cảnh tổng quan với độ sõu phộp đệ quy là 5. Trong những ảnh tiếp theo, ta cú cỏi nhỡn cận cảnh một phần bờn trong thỳ vị - tức là ởđõu cú 2 hỡnh cầu tương tỏc với nhau. Ảnh 2 cho thấy chiều sõu phộp đệ quy 0, vớ dụ chỉ mụ hỡnh phản xạ cục bộ (Phong trong trường hợp này) được sử dụng. Ảnh 3 biểu diễn chiều sõu phộp đệ quy 1. Ở đõy ta cú thể nhỡn thấy 2 hỡnh cầu phản chiều lẫn nhau một lần. Hỡnh cầu cực tả (leftmost) cũng sỏng hơn khi màu nền của cảnh được cho phộp nảy ra khỏi nú. Ảnh cũn lại cho thấy chiều sõu phộp đệ
quy 2, 3 và 4. Chỳ ý thụng số tương ứng của hỡnh cầu phản chiếu lẫn nhau và thật khú để
1 2 3
4 5 6
Hỡnh 8.11 Hỡnh cỏc quả cầu phản chiếu
Raytracing cú thểđược nhỡn như một cõy- xử lý tạo thành từ mỗi va chạm tia làm phỏt sinh ra nhiều hơn 2 tia: 1 phương phản chiếu và 1 phương khỳc xạ. Những tia này
được giả thiờt rất mỏng và khụng dàn trải. Kết quả này trong một số vấn đề được mụ tả
phớa dưới nhưng cũng cú nghĩa 1 raytracer cú thể phải đủ nhanh một khi số điểm giao nhau trờn 1 pixel cú hạn bởi 2n với n là chiều sõu của phộp đệ quy. Cú thể thấy chiều sõu của phộp đệ quy khụng phải rất cao- thụng thường giữa 4 và 8 là đủ. 256 điểm giao nhau bởi vậy là cực đại và trong trường hợp những đối tượng mờ đục chỉ cú 1 tia trờn 1 điểm giao nhau thỡ sinh ra 1 khối lượng lớn số giao điểm trờn 1 pixel tới 8. Điều này cú nghĩa là những cảnh cú độ phức tạp vừa phải cú thể biểu diễn lại trong 10 phần giõy (tens of second) trờn phần cứng hiện tại và thậm chớ khung hỡnh thời gian thực (realtime framerates) là cú thể nếu thuật giải được tối ưu húa.
Chỳ ý: cả 3 thành phần trong cụng thức tớnh cường độ cú thểđược tớnh toỏn từđiểm giao nhau và vectỏ phỏp tuyến trực chuẩn trờn điểm đú.
Mó giả cho toàn bộ thuật giải như sau:
Color traceRay(Vector start, Vector direction, int depth){ if (depth < 0) return BLACK;
Object hitObject; Vector hitPoint;
if (rayHit(start, direction, &hitObject, &hitPoint)) { Color result;
result = calculateLocalContribution(hitObject, hitPoint); result += calculateReflection(hitObject, hitPoint,
traceRay(hitPoint, reflectedDirection, depth - 1)); result += calculateRefraction(hitObject, hitPoint, traceRay(hitPoint, refractedDirection, depth - 1)); return result;
} else
return BACKGROUND_COLOR; }
Image image;
for(each scanline Y) { for(each pixel X) {
image[X][Y] = traceRay(eye,directionFromEyeToXY, RECURSION_DEPTH); }
}
return image; }
8.3.1.3. Màu gốc (Primitives)
Cảnh raytraced phải bao gồm những đối tượng (được gọi là những màu gốc) mà cú thể
tớnh toỏn được giao điểm với một tia và vectỏ phỏp tuyến trực chuẩn tại điểm đú. Mặt khỏc chỳng yờu cầu một raytracer và bởi vậy nú dễ dàng được thờm vào những màu gốc- chỉ một trong sốđú phải viết hàm để thực hiện nhiệm vụ này.
8.3.1.4. Màu gốc chớnh xỏc (Mathematical primitives)
Những đối tượng như những hỡnh cầu và mặt phẳng thỡ dễ dàng để điều khiển trong một raytracer từ tia sỏng – sự giao nhau và thụng thường rất dễ để tớnh toỏn. Những điều này cũng cú thểđược tớnh toỏn trong một khoảng thời gian khụng thay đổi và với độ chớnh xỏc tựy ý (đõy khụng phải là trường hợp cho màu gốc được mụ tả bờn dưới). Ởđõy khụng đi vào chi tiết về tia sỏng – tớnh toỏn cắt ngang (intersect), chỳng cú thểđược tỡm thấy trong [6] và việc thực hiện cú thểđược tỡm thấy trong code.
8.3.1.5. Lưới đa giỏc (Polygon meshes)
Lưới đa giỏc rất hữu ớch để mụ hỡnh húa những đối tượng tựy chọn và rất thớch hợp để hỗ
trợ như việc vẽ lại màu gốc trong một tia vạch nếu muốn vẽ lại khung cảnh hiển thị đối tượng từ thế giới thực như là ụ tụ, cỏi bàn, mỏy bay hay ngụi nhà… - tất cả những đối tượng khú hoặc khụng thể mụ hỡnh húa thực sự mà chỉ sử dụng một thuật toỏn đối tượng như là hỡnh cầu, mặt phẳng… Trong trường hợp ởđõy chỉ làm việc với những lưới đa giỏc nơi mà tất cả đa giỏc đều là tam giỏc. Đõy là cỏch truyền thống để biểu diễn một lưới đa giỏc và như vậy cũng khụng bị quỏ hạn chế.
Với bất kỳ màu gốc nào trong một tia vạch tất cả chỳng ta cần cú thể vẽ lại nú là một cỏch để tớnh toỏn điểm giao nhau với một tia sỏng đó cho và một bề mặt bỡnh thường mà cú điểm đú bờn trong. Với những đối tượng toỏn học được miờu tảở trờn ta cú thể nhanh chúng tớnh toỏn chớnh xỏc. Với một lưới đa giỏc cú phần khú hơn và ta sẽ hướng vào 2 nhiệm vụ lần lượt ở bờn dưới.
Vấn đề tớnh toỏn giao điểm giữa một lưới đa giỏc và một tia sỏng cú thể bị phỏ vỡ
trong việc tớnh toỏn giao điểm giữa tia sỏng và tất cả cỏc hỡnh tam giỏc mà tạo ra lưới. Cỏi gần nhất của những điều này là rất nhiều sự giao nhau là một cỏi mà chỳng ta sử dụng
điểm giao nhau giữa lưới và tia sỏng.
Như vậy chỳng ta gặp phải thỏch thức với việc tớnh toỏn giao điểm giữa một tam giỏc và một tia sỏng. Những đặc trưng được làm trước bởi việc tớnh toỏn giao điểm giữa tia sỏng và mặt phẳng mà cú tam giỏc ở đú. Một điểm như vậy sẽ luụn tồn tại trừ phi tia sỏng song song tuyệt đối với mặt phẳng tam giỏc. Nếu trường hợp chỳng ta cú thể quyết
tam giỏc thỡ chỳng ta tiếp tục kiểm tra nếu điểm đú nằm trong hỡnh tam giỏc. Cú rất nhiều cỏch để làm việc này và giải thuật mà chỳng ta chọn để sử dụng chi tiết về cơ bản nú tạo một nửa mặt phẳng từ mỗi hỡnh tam giỏc 3 đoạn, tất cả hướng sao cho những điểm trực giao (normal) của chỳng hoặc chỉ đi vào trong tam giỏc hoặc ra khỏi từ nú. Một điểm trong vấn đề là bờn trong tam giỏc nếu nú hoặc nằm giữa mặt phẳng hoặc đằng sau tất cả 3 nửa mặt phẳng (phụ thuộc vào cỏch chọn phương hướng của nửa mặt phẳng).
Bõy giờ chỳng ta trở lại với nhiệm vụ tớnh toỏn trực giao như là một giao điểm. í tưởng hiển nhiờn và trước hết là cú thểđơn giản trả lại trực giao của mặt phẳng cú tam giỏc nằm trờn đú. Một hướng khỏc cú thể phản đối rằng điều này sẽ thực sự là đỳng trực giao của hầu hết những điểm bờn trong hỡnh tam giỏc đú. Tuy nhiờn, lưới tam giỏc cũng thường được sử dụng để làm mềm hơn mụ hỡnh, uốn cong bề mặt và sau đú làm nhẵn bề
ngoài của mặt được nhỡn thấy của lưới tam giỏc. Nếu sử dụng những mặt phẳng tam giỏc trực giao như là giao cắt thụng thường thỡ kết quả ta được giữa cỏc cạnh với cỏc hỡnh tam giỏc đơn lẻ.
Giải phỏp phổ biến nhất là tớnh toỏn cỏi gọi là đỉnh trực giao cho lưới. Điều này cú nghĩa là mỗi tam giỏc sẽ cú 2 trực giao liờn quan đến nú – 1 cho mỗi đỉnh trong tam giỏc – và những hỡnh tam giỏc đú sẽ chia sẻ 1 đỉnh cũng sẽ chia sẻ những đỉnh trực giao tương
ứng. Đỉnh trực giao được tớnh toỏn bằng cỏch lấy trung bỡnh của mặt phẳng trực giao cho những tam giỏc mà cú đỉnh được sử dụng. Hiệu ứng này cú nghĩa là đỉnh đú đặt trờn 1 cạnh (mộp) giữa 2 hỡnh tam giỏc mà ở 1 gúc nhất định đối với mỗi gúc khỏc sẽ chỉ trong 1 phương cú phần giữa mặt phẳng trực giao của tam giỏc và sẽ làm mềm ở ngoài ỏnh sỏng ở
mộp. Trực giao cho 1 điểm đó cho bờn trong hỡnh tam giỏc được tớnh toỏn bởi phộp nội suy tuyến tớnh giữa 3 đỉnh trực giao (xem thờm chi tiết cho giải thuật này trong code).
Hỡnh 8.12 lưới đa giỏc
TỔNG KẾT: điểm giao nhau được tớnh toỏn bởi việc kiểm tra mỗi tam giỏc trong lưới cho sự giao nhau với tia sỏng và sau đú sử dụng giao điểm gần nhất. Trực giao cho mỗi giao điểm được tớnh toỏn bởi phộp nội suy giữa 3 đỉnh trực giao của hỡnh tam giỏc.
8.3.2. Radiosity
8.3.2.1. Giới thiệu
Phương phỏp Radiosity là một phần giải phỏp làm sỏng tỏ vấn đề toàn cầu, tập trung vào giải quyết sự phản xạ trực tiếp(interreflection) giữa những bề mặt khuếch tỏn bờn trong một mụi trường đúng. Phương phỏp khụng gửi những vấn đề với khuếch tỏn – phản chiếu, phản chiếu – khuếch tỏn hoặc phản chiếu – phản xạ phản chiếu trực tiếp.
8.3.2.2. Tổng quan về phương phỏp Radiosity (Overview of the radiosity method)
Một khỏi niệm chớnh của phương phỏp radiosity là những miếng vỏ (patches), mà là những vựng hỡnh chữ nhật được phỏt và nhận radiosity của những miếng vỏ khỏc, như vậy mụ phỏng sự tương tỏc nhẹ.
Hỡnh học của mụi trường được chia ra thành những miếng vỏ. Những miếng vỏ, mà khụng phải là những nguồn sỏng, thoạt tiờn cho phộp cường độ là khụng, trong khi những miếng vỏ cú nguồn sỏng được đặt ở một lượng năng lượng ban đầu, phụ thuộc vào cường
độ của nguồn sỏng.
Mục đớch là tớnh toỏn tổng lượng bức xạ của mỗi miếng vỏ nhận được từ mụi trường, nhưđõy là một ước lượng của cường độ ỏnh sỏng phõn tỏn. Điều này được làm lặp đi lặp lại (iteratively), bằng cỏch tớnh toỏn radiosity tại tất cả cỏc miếng vỏ cho đến lượng năng lượng tối đa được tỏch ra dưới một ngưỡng nhất định. Điểm tận cựng được đảm bảo bởi thực tế, một lượng nhất định năng lượng tỏa ra được nhận lại thỡ lại được hỳt lại tạo mỗi