MÀU SẮC VÀ ÁNH SÁNG TRONG ĐỒ HỌA MÁY TÍNH |
|
Saturation
Nếu chúng ta di chuyển càng xa trục đứng, thì màu càng giữ được bản chất của màu hơn. Một hình ảnh trắng đen hay màu cũng do yếu tố này góp phần chi phối
Trên thực tế, không gian màu Munsell (cũng như hệ màu HLS) không phản ánh trực tiếp lắm khía cạnh vật lý của ánh sáng. Vì vậy mà chúng ta mới có những không gian màu khác. Tuy vậy các kiến trúc sư và họa sĩ máy tính thì chỉ cần biết về không gian màu Munsell là tương đối đủ. Lý do mà chúng ta dùng không gian màu Munsell (và hệ màu HLS) là vì chúng rất trực quan và tiện lợi khi chúng ta muốn chọn màu trên máy tính. Các không gian màu khác thường không được trực quan như vậy.
4.Tóm tắt
Chúng ta nhìn thấy vật là do có một luồng sáng đi từ vật vào mắt ta. Tính chất vật lý của luồng ánh sáng này (bao gồm các tần số sóng điện từ, cường độ của sóng …) sẽ quyết định màu sắc của vật và các yếu tố như độ mạnh yếu hay độ “tươi” của màu sắc.
Hệ màu RGB được đưa ra trên cơ sở sinh lý của mắt người và có thể xem là hệ màu căn bản nhất. Các hệ màu khác như CMY có thể suy ra từ hệ màu RGB này.
Không gian màu Munsell và hệ màu HLS được sử dụng rộng rãi trong các phần mềm đồ họa vì chúng rất trực quan.
Các bạn có thể tìm hiều thêm về Lý thuyết màu sắc bằng cách tìm kiếm trên Google với từ khóa “Color Theory”, hoặc có thể tra cứu tại Wikipedia.
Lighting in photorealistic rendering
Một trong những mục đích chính của lĩnh vực Đồ họa máy tính (Computer Graphics) là tái hiện lại một cách chân thật những hình ảnh trong cuộc sống thực của chúng ta (tiếng Anh gọi là photorealistic rendering). Như chúng ta đã biết, Mắt người có thể nhìn thấy mọi vật xung quanh là vì có ánh sáng. Vậy nên để tái tạo lại hình ảnh từ cuộc sống thực của chúng ta một cách chân thật (realistic), chúng ta phải hiểu về bản chất vật lý của ánh sáng và vận dụng hiểu biết này tái hiện lại hình ảnh trên màn hình máy tính. Bài viết này sẽ đề cập đến cách mà ánh sáng được mô phỏng lại trên máy tính.
1. Bài viết này giúp ích gì cho các bạn, nhất là các kiến trúc sư và họa sĩ máy tinh?
Trước hết xin được giải thích về sự khác nhau của hai danh từ “Đồ họa máy tính” (Computer Graphics) và “Thiết kế đồ họa máy tính” (Computer Graphics Design, hoặc gọi tắt là Graphics Design). “Đồ họa máy tính” được dùng để chỉ một ngành khoa học. Nhiệm vụ của ngành này là tìm hiểu các phương pháp để tổng quát để mô phỏng lại hình ảnh từ không gian cuộc sống ba chiều của chúng ta. Với những hiểu biết từ ngành Computer Graphics, người ta sẽ cho ra đời những công cụ và phần mềm đồ họa như Autodesk 3ds Max, Autodesk Revit, Autodesk Maya, Esperient Creator … Những phần mềm này sẽ được bán lại cho các nhà thiết kế đồ họa máy tính (Computer Graphics Designer), họa sĩ máy tính (Computer Artist), và trong đó dĩ nhiên có cả các kiến trúc sư. Những người này sẽ sử dụng các phần mềm trên đễ tạo ra tác phẩm cuối cùng. Vậy nói một cách nôm na: “Computer Graphics = tạo ra công cụ và phần mềm đồ họa bằng những hiểu biết khoa học” và “Computer Graphics Design = dùng những công cụ và phần mềm đó để tạo ra tác phẩm thật sự, có tính nghệ thuật”. Vậy các bạn là kiến trúc sư và họa sĩ máy tính sẽ rơi vào trường hợp Graphics Design. Trong khi đó, bài viết này sẽ lại đề cập đến những khái niệm ánh sáng có nguồn gốc từ Computer Graphics. Lý do mà bài viết này sẽ giúp ích cho các bạn kiến trúc sư và họa sĩ máy tính là vì khi hiểu rõ hơn các khái niệm về ánh sáng, các bạn sẽ sử dụng các phầm mềm đồ họa như 3ds Max, Maya và những renderer như Vray, Mental Ray một cách hiệu quả hơn. Bức ảnh mà các bạn render sẽ trông thật hơn (realistic), có chiều sâu hơn về mặt không gian.
2. Ánh sáng giúp chúng ta nhìn thấy bề mặt của vật thể như thế nào?
Ánh sáng xuất phát từ một nguồn sáng nào đó và chiếu đến bề mặt của vật thể. Bề mặt của vật thể sẽ phản xạ lại ánh sáng này. Ánh sáng phản xạ nếu đi vào mắt sẽ khiến chúng ta thấy được vật. Chúng ta có sơ đồ sau.
Nguồn sáng → Bề mặt → Mắt
Tuy nhiên, nếu xét một các tổng quát, ánh sáng có thể phản xạ nhiều lần qua các bề mặt thể khác nhau trước khi tới mắt. Chúng ta có sơ đồ sau
Nguồn sáng → Bề mặt 1 → Bề mặt 2 → …→ Bề mặt n → Mắt
3. Cơ chế vật lý của ánh sáng và cách thức dùng để mô phỏng ánh sáng trên máy tính:
Những kiến thức trong phần này sẽ xoay quanh sơ đồ về đường đi của ánh sáng trong phần trên.
3.1 Nguồn sáng:
Loại nguồn sáng căn bản nhất được mô phỏng trên máy tính là nguồn sáng điểm (point light source, trong 3ds Max gọi là omni light). “Điểm” có nghĩa là nguồn sáng này có kích thước nhỏ bằng 0. Dĩ nhiên trong cuộc sống thực thì nguồn sáng điểm không tồn tại vì mọi vật đều có kích thước. Tuy nhiên nếu nguồn sáng mà chúng ta đang muốn mô phỏng có kích thước khá nhỏ so với khung cảnh (scene) thì dùng nguồn sáng điểm sẽ cho kết quả khá tốt. Ưu điểm của nguồn sáng điểm là thời gian render sẽ nhanh hơn so với các loại nguồn sáng khác. Nhược điểm lớn nhất là sẽ không tạo được bóng đổ có cạnh nhòe (soft shadow). Nếu các bạn để ý thì trong cuộc sống thực, bóng đổ thường không khi nào có cạnh biên sắt nét tuyệt đối mà sẽ ít nhiều bị nhòe. Lý do là vì nguồn sáng trong cuộc sống thực không phải là một điểm “hoàn hảo” (điểm có kích thước nhỏ bằng không). Vậy nếu dùng nguồn sáng điểm thì bóng đổ trong bức ảnh render sẽ có cạnh sắt nét tuyệt đối và điều này ít nhiều làm giảm độ hiện thực của bức ảnh. Có vài cách để khác phục điều này.
- Cách thứ nhất: dùng một thuật toán nào đó để làm nhòe cạnh của bóng. Đây thực chất là một cách “ăn gian” vì nó không dựa trên đúng bản chất hình học của soft shadow mà chỉ là một biện pháp “nhân tạo” để “tạm thời cứu vãn tình thế”. Ưu điểm của cách này là thời gian render vẫn rất nhanh so với dùng các phương pháp được nhắc tới ngay sau đây. Bên cạnh đó, trong phần lớn các trường hợp, kết quả render thu được nhìn chung là chấp nhận được
- Cách thứ hai: dùng nhiều nguồn sáng điểm để mô phỏng lại nguồn sáng có kich thước. Dùng càng nhiều nguồn sáng điểm thì kết quả mô phỏng càng chính xác. Tuy nhiên, “cái giá phải trả” cũng khá cao: thời gian render sẽ lâu hơn một cách rất đáng kể.
- Cách thứ ba: dùng những loại nguồn sáng có hình dạng và kích thước giống với nguồn sáng mà chúng ta đang muốn tái hiện. Ví dụ như dùng nguồn sáng hình trụ để mô phỏng bóng đèn neon. Cách này cho ra kết qua rất tốt. Nhưng thời gian render cũng sẽ lâu hơn khá nhiều. Bên cạnh đó, rất ít phần mềm có những loại nguồn sáng có hình dạng và kich thước cụ thể như vậy
Từ giờ trở đi chúng ta chỉ xem xét ánh sáng điểm.
3.2 Hiện tượng ánh sáng yếu dần khi di chuyển trong một môi trường:
Tên tiếng Anh của hiện tượng này là attenuation. Từ này cũng được dùng phổ biến trong các phần mềm đồ họa. Chắc tất cả chúng ta đều đồng ý là trong cuộc sống thực của chúng ta, hiện tượng attuenuation luôn tồn tại với bất kỳ ánh sáng nào (lưu ý là từ giờ trở đi, chúng ta chỉ nói đến nguồn sáng điểm). Vì vậy nếu muốn ảnh render được chân thật chúng ta phải chú ý đến hiện tượng này.
Nếu nói cho rõ hơn, ánh sáng “yếu dần” đi có nghĩa là cường độ (intensity) của nó giảm dần đi. Cũng xin đươc nhắc lại là trong vật lý, cường độ của ánh sáng được định nghĩa là năng lượng của ánh sáng đó trên một đơn vị diện tích (do đó đơn vị của cường độ là Joule/m2 hoặc Watt). Bây giờ điều mà chúng ta muốn biết là cường độ sẽ giảm “như thế nào”? Nói cách khác, chúng ta muốn có một công thức để tính cường độ ánh sáng tại một điểm cách nguồn sáng một khoảng , biết trước cường độ ban đầu ngay tại nguồn sáng là (tức là khi r=0 thì I=I0 ). Trên thưc tế, có tới bốn công thức để chúng ta lựa chọn.
Công thức thứ nhất:
Công thức này vô cùng đơn giản. Chúng ta giữ nguyên cường độ ánh sáng, bất kể là ánh sáng đã di chuyển ra xa khỏi nguồn sáng. Dĩ nhiên cách này không phản ánh đúng 100% thực tế. Tuy vậy, đôi lúc chúng ta muốn chọn cách này để render nhanh vì công thức này chỉ đòi hỏi máy tính làm việc chút ít. Ngoài ra, có những trường hợp khi mà độ giảm cường độ ánh sáng quá nhỏ, chúng ta có thể xem như cường độ giữ nguyên không giảm. Ví dụ tiêu biểu nhất cho trường hợp này là ánh sáng mặt trời: giả sử vật A đặt trên mặt đất và vật B đặt trên nóc của một toàn nhà 20 tầng. Rõ ràng vật B ở gần mặt trời hơn vật A và trên lý thuyết thì sẽ nhận nhiều năng lượng ánh sáng từ mặt trời hơn (cường độ ánh sáng trên vật B sẽ lớn hơn). Tuy nhiên chắc các bạn cũng đồng ý là sự chênh lệch cường độ ánh sáng của A và B hoàn toàn không đáng kể. Lý do là vì khoảng cách 20 tầng lầu quá nhỏ so với khoảng cách từ mặt trời đến trái đất.
Công thức thứ hai:
Công thức có là dạng “nghịch đảo” (tiếng Anh là Inversed, trong 3ds Max cũng dùng chữ này) vì nó sử dụng nghịch đảo của khoảng cách r .α chỉ là một hệ số. Hệ số này là một yếu tố “nhân tạo” được người ta đưa vào công thức nhằm cho phép người sử dụng phần mềm tăng hoặc giảm cường độ ánh sáng để điều chỉnh kết quả render như ý muốn (lưu ý là không phải phần mềm nào cũng cho người dùng điều chỉnh hệ số a). Trong nhiều trường hợp, công thức này cho ra kết quả render khá tốt.
Công thức thứ ba:
Công thức có là dạng “nghịch đảo của bình phương” (tiếng Anh là Inversed square, trong 3ds Max cũng dùng chữ này) vì nó sử dụng nghịch đảo của bình phương của khoảng cách r. Công thức này là công thức hoàn toàn chính xác về mặt vật lý, với điều kiện là chúng ta không tính đến phần năng lượng của ánh sáng bị hấp thụ vào môi trường không khí trong quá trình di chuyển. Nếu thích hoặc tò mò, các bạn có thể xem phân gợi ý in nghiêng sau để hiểu vì sao công thức này là chính xác nhất.
Giả sử chúng ta có một nguồn sáng điểm. Từ nguồn sáng này phát ra một phần năng lượng có gia trị Io . Phần năng lượng này sẽ tỏa ra khắp mọi hướng. Nói cách khác, chúng ta có thể hình dung phần năng lượng này được phân bố đều trên một mặt cầu, tâm là nguồn sáng và bán kính là r . lúc đầu r=0, . Sau đó khi năng lượng tỏa ra, mặt cầu sẽ lớn dần ra, bán kính tăng.Tuy nhiên, theo định luật bảo toàn năng lượng thì tổng năng lượng trên mặt cầu tại bất kỳ thời điểm nào vẫn là I0 ., với điều kiện không có phần năng lượng nào bị hấp thụ vào môi trường trong qua trình ánh sáng lan tỏa. Tiếp theo các bạn hãy nhớ lại: cường độ chính là năng lượng trên một đơn vị diện tích, mà diện tích của hình cầu là 4Πr2 . Và đây chính là lý do cho sự hiện diện của nghịch đảo bình phương khoảng cách trong công thức của chúng ta (Chúng ta thường không cần quan tâm tới các hằng số lắm vì chúng ta có thể gom chúng lại vào trong hệ số α .)
Công thức thứ tư:
Đây là dạng nghịch đảo bậc hai của khoảng cách . Tại sao công thức này được đề xuất? Như đã nói ở trên, công thức thứ ba (nghịch đảo bình phương) là chính xác 100% trên lý thuyết. Nhưng trên thực tế, môi trường mà chúng ta sống không phải là môi trường chân không, có nghĩa là một phần ánh sáng sẽ bị hấp thụ vào môi trường trong quá trình ánh sáng lan tỏa. Lúc này công thức nghịch đảo bình phương vốn đơn giản sẽ trở thành một công thức khá phức tạp. Chính vì vậy mà người ta mới đề xuất công thức nghịch đảo của bậc hai nhằm mô phỏng lại công thức phức tạp này. Người dùng có thể tinh chỉnh các hệ số a,b,c để ra kết qua render như y muốn. Tuy nhiên không phải phần mềm nào cũng cho phép người dùng lựa chọn công thức thứ tư này hoặc cho phép tinh chỉnh các hệ số a ,b ,c .
3.3 Bề mặt của vật thể phản xạ ánh sáng như thế nào?
Đây là phần phức tạp nhất nhưng cũng thú vị nhất. Nhưng trước khi đi vào phần “thú vị”, các bạn cần được giải thích một chút về lý thuyết vật lý của hiện tượng phản xạ ánh sáng. Sau đó chúng ta sẽ bắt đầu tìm hiểu về cách mà người ta “triển khai” những lý thuyết này trên mày tính để có được những hình ảnh 3D ấn tượng
3.3.1 Cơ chế phản xạ ánh sáng của bề mặt vật thề
Phản xạ hoàn hảo:
Cơ chế phản xạ này tiếng Anh gọi là perfect specular reflection. Đây là loại phản xạ mà chúng ta được học trong môn Vật lý quang học ở trường phổ thông (ở trường phổ thông gọi là phản xạ gương phẳng). Loại phản xạ này là loại căn bản nhất vì các loại phản xạ khác được trình bày dưới đây chỉ là các trường hợp phức tạp hơn của phản xạ hoàn hảo.
Hình vẽ sau sẽ mô tả loại phản xạ này.
Trong hình vẽ trên. Tia sáng i khi chiếu tới bề mặt sẽ bị phản xạ lại theo tất cả mọi hướng. Cường độ ánh sáng ở các hướng phản xạ bằng nhau (các mũi tên được vẽ với độ dài bằng nhau để minh họa ý này). Chúng ta gọi hiện tượng này là tán xạ ánh sáng (ánh sáng bị phát tán theo nhiều hướng khác nhau)
Tán xạ (một cách tuyệt đối)
Tên tiếng Anh gọi là diffuse reflection
Trên thực tế hầu hết mọi bề mặt đều không có độ phẳng tuyệt đối như trên (Thậm chí cả gương soi mặt cũng không hẳn là phẳng tuyệt đối, mặc dù chúng ta có thể xem như nó phẳng tuyệt đối để thuận tiện cho việc tính toán). Điều này có nghĩa là các bề mặt sẽ có một độ “gồ ghề” nhất định. Chính sự “gồ ghề” này sẽ làm cho ánh sáng bị phản xạ theo nhiều hướng khác nhau, và trong một vài trường hợp, chúng ta sẽ có hiện tượng tán xạ. Hãy xem hình minh họa bên dưới.
Trong hình vẽ trên. Tia sáng i khi chiếu tới bề mặt sẽ bị phản xạ lại theo tất cả mọi hướng. Cường độ ánh sáng ở các hướng phản xạ bằng nhau (các mũi tên được vẽ với độ dài bằng nhau để minh họa ý này). Chúng ta gọi hiện tượng này là tán xạ ánh sáng (ánh sáng bị phát tán theo nhiều hướng khác nhau)
Trường hợp tổng quát.
Tên tiếng Anh của trường hợp này là specular reflection.
Chúng ta có thể xem phản xạ hoàn hảo và tán xạ như là hai “thái cực” của hiện tượng phản xạ ánh sáng. Ở thái cực thứ nhất, tia sáng chiếu tới bề mặt sẽ bị phản xạ theo một hướng xác định. Ở thái cực thứ hai, tia sáng sẽ bị phản xạ theo mọi hướng với cường độ bằng nhau tại mọi hướng. Trên thực tế, không có bề mặt nào sẽ cho ta phản xạ hoàn hảo hoặc tán xạ một cách tuyệt đối. Mọi trường hợp phản xạ ánh sáng sẽ nằm đâu đó ở giữa hai thái cực này (tuy vậy, có rất nhiều trường hợp nằm rất gần với một trong hai thái cực này và chúng ta có thể xem chúng như là phản xạ hoàn hảo hoặc tán xạ để thuận tiện cho việc tính toán sau). Bây giờ chúng ta sẽ mô tả trường hợp tổng quát này bằng hình vẽ và bằng lời.
Phần lớn ánh sáng sẽ bị phản xạ theo hướng của tia phản xạ hoàn hảo. Tuy nhiên sẽ có một phần ánh sáng bị phản xạ theo những hướng gần với hướng của tia phản xạ hoàn hảo này. Nhưng điểm đáng chú ý nhất là càng ra xa tia phản xạ hoàn hảo thì cường độ ánh sáng sẽ yếu đi (các bạn có thể thấy các mũi tên được vẽ ngày càng ngắn đi để minh họa cho ý này). Qua mô tả này, chúng ta có thể thấy loại phản xạ này rõ ràng là nằm ở giữa hai “thái cực” phản xạ hoàn hảo và tán xạ một cách tuyệt đối.
Vậy là chúng ta đã có một mô tả trực quan bằng lời và bằng hình vẽ cho trường hợp tổng quát. Nhưng như vậy chưa đủ. Vấn đề đặt ra bây giờ là chúng ta cần có một công thức để tính toán chính xác loại phản xạ này, và chúng ta có một tin vui và một tin không vui về điều này. Tin vui là các nhà khoa học đã tìm được công thức này từ khá lâu. Tin không vui là công thức này cực kỳ phức tạp. Lý do cho sự phức tạp này là vì có quá nhiều yếu tố ảnh hưởng đến kết quả của sự phản xạ ánh sáng mà chúng ta cần phải xem xét. Chẳng hạn như chúng ta phải xét đến độ “gồ ghề” của bề mặt. Làm thế nào để “đo” được độ “gồ ghề” này không phải là chuyện đơn giản. Trên thực tế chúng ta phải nhờ đến sự trợ giúp của một vài kiến thức từ môn toán sác xuất để biểu diễn độ “gồ ghề”.
Dù sao thì các bạn cũng không cần quan tâm lắm về công thức này. Trên thực tế, không có phầm mềm đồ họa nào sử dụng trực tiếp công thức này cả mà sẽ dùng những công thức gần đúng đơn giản hơn. Dĩ nhiên là đơn giản hơn đồng nghĩa với kém chính xác hơn, nhưng kết quả render vẫn rất tốt. Phần tiếp theo sẽ giới thiệu với các bạn về một số phương pháp được dùng trong máy tinh để mô phỏng lại hiện tượng phản xạ ánh sáng trong đời sống thực của chúng ta.
3.3.2 Mô phỏng hiện tượng phản xạ ánh sáng trên máy tính
Trong phần này tôi có xu hướng giữ nguyên tên tiếng Anh của các thuật ngữ chứ không dịch ra tiếng Việt vì khi sử dụng các phần mềm, các bạn sẽ phải làm việc với những tên tiếng Anh này. Trước hết xin nhắc lại ba thuật ngữ vừa được nhắc đến trong phần trên.
Perfect specular reflection: Phản xạ hoàn hảo.
Diffuse reflection: Tán xạ một cách tuyệt đối.
Specular reflection: Trường hợp tổng quát, nằm “ở giữa” hai trường hợp trên.
Bây giờ chúng ta sẽ tìm hiểu một khái niệm gọi là “shading model”
Shading Model
Trong Computer Graphics, chữ “shade” có thể hiểu nôm na là tính ra giá trị màu (bao gồm cả các yếu tố như độ sáng, độ bảo hòa …) của một điểm trong khung cảnh (scence) của chúng ta. Và dĩ nhiên để làm được điều này trong 3D Computer Graphics, chúng ta phải xem xét đến yếu tố ánh sáng trong khung cảnh. Chữ “model” có nghĩa là “mô hình”. “Mô hình” là một phương pháp mô phỏng lại một hiện tượng có thật trong cuôc sống. Mặc dù phương pháp này có thể không chính xác một trăm phần trăm về mặt lý thuyết, nhưng nó sẽ cho kết quả khá tốt. Trong lịch sử kéo dài khoảng hơn 50 năm của ngành Computer Graphics, có rất nhiều shading model được phát minh và được đưa vào ứng dụng trong các phần mềm đồ họa. Một trong những shading model xuất hiện đầu tiên và rất thành công là Phong shading model mà chúng ta sẽ tìm hiểu trong phần tiếp theo.
Phong shading model
Cái tên “Phong” nghe rất Việt Nam. Và đúng là như vậy!!!. Phong shading model là kết quả nghiên cứu của Tiến sĩ Khoa học Máy tính Bùi Tường Phong. Đây là luận án tiến sĩ năm 1973 của ông tại trường Đại Học Utah, Mỹ. Lý do mà Phong shading model rất thành công và vẫn đang được sử dụng rất phổ biến ngày nay là vì tính đơn giản nhưng hiệu quả cao của nó. Dĩ nhiên Phong shading model không phải là hoàn hảo vì nó vẫn bỏ qua rất nhiều hiện tượng ánh sáng (nên nhớ, máy tính của thập niên 70 của thế kỷ trước rất chậm so với máy tính của ngày nay). Chúng ta hãy cùng tìm hiểu kỹ hơn về Phong shading model.
Tiến sĩ Phong đưa ra công thức để tính toán cường độ ánh sáng tại một điểm như sau (lưu ý, là cường độ ánh sáng).
chỉ đơn giản là một hằng số do người dùng phần mềm lựa chọn khi thục hiện lệnh render để tinh chỉnh lại độ sáng chung của toàn khung cảnh. Hằng số này sẽ được thảo luận thêm trong phần sau.
Intensity = Difuse + Specular + Ambient
đã được giải thích như trên trong phần Diffuse reflection. Công thức để tính cường độ của phần diffuse khá đơn giản: cường độ của tia ánh sáng chiếu tới bề mặt nhân với cosine của góc tới. Tại sao lại có công thức này? Thực ra các bạn là kiến trúc sư và họa sĩ máy tính thì cũng không cần phải quan tâm đến câu trả lời lắm, mặc dù nó cũng tương đối đơn giản. Ở đây sẽ không trình bày câu trả lời này mà chỉ đưa ra một ví dụ khá trực quan để minh họa cho sự xuất hiện của “cosine của góc tới” trong công thức: Giả sử bạn chiếu đèn pin vào một trang giấy và quan sát điểm A trên trang giấy (xem hình vẽ bên dưới). Ban đầu bạn để trục đứng của đèn pin vuông góc với tờ giấy. Sau đó di chuyển đèn pin theo như hình vẽ để thay độ góc giữa trục đứng và tờ giấy. Bạn sẽ thấy độ sáng tại điểm A trở nên yếu dần.
cũng đã được trình bày ở trên, trong phần Specular reflection. Như đã nói trong phần này, công thức chính xác để tính giá trị của rất phức tạp. Tiến sĩ Phong đã đưa ra một công thức đơn giản hơn rất nhiều nhưng vẫn cho ra kết quả render rất đáng hài lòng. Chúng ta sẽ tìm hiểu công thức này.
Trước hết hãy xem hình vẽ sau.
Trong hình trên, tia r là tia phản xạ hoàn hảo, tia e là tia hướng về phía mắt (hoặc camera). Góc là góc tạo bởi tia r và tia e. Công thức sau sẽ cho chúng ta biết cường độ ánh sáng theo hướng của tia e.
Specular = I0 × cosnθ
Trong công thức trên, số mũ n chỉ là một hằng số. Chúng ta sẽ tìm hiểu vai trò của n trong chốc lát. I0 là cường độ của ánh sáng bị phản xạ theo hướng của tia phản xạ hoàn hảo (tia r). Đây là cường độ phản xạ mạnh nhất (vì càng ra xa tia phản xạ hoàn hảo thì cường độ giảm dần). Nhìn vào công thức này chúng ta có thể thấy, khi n = 0, tức là chúng ta đang ở vị trí của tia phản xạ hoàn hảo, thì giá trị I = I0 . Càng ra xa tia phản xạ hoàn hảo, góc θ tăng, cosnθ sẽ giảm, do đó giá trị specular cũng sẽ giảm theo, đúng như chúng ta đã mô tả ở phần Specular reflection. Các bạn hãy xem hình minh họa dưới đây để thấy kết quả được tạo ra bởi sự kết hợp giữa diffuse và specular: Hình bên trái chỉ dùng diffuse, còn hình bên phải dùng cả diffuse và specular.
Bây giờ chúng ta hãy quay lại với số mũ n. Tiến sĩ Phong đưa số mũ này vào công thức nhằm cho phép người dùng có thể thay đổi kích thước của đốm sáng (highlight) trên bề mặt vật thể do hiện tượng specular reflection gây ra. Nhìn chung, khi số mũ này tăng, thì kích thước của đốm sáng sẽ giảm. Các bạn hãy xem hình vẽ sau để thấy kích thước của đốm sáng thay đổi khi ta thay đổi giá trị của n .
Nếu các bạn muốn biết rõ hơn lý do tại sao số mũ n lại làm thay đổi kích thước của đốm sáng, hãy làm theo phần gợi ý in nghiêng sau
Trước hết hãy vẽ đồ thị của hàm số cos θ trong khoảng θ=-1 đến θ=1 . TIếp theo, hãy thử vẽ đồ thị của cosn θ với các giá trị n = 1, 2, 3 … Các bạn sẽ thấy đồ thị sẽ bị thu hẹp lại dần khi giá trị của n tăng. Chính điều này làm cho đốm sáng trên hình render nhỏ lại dần
Lưu ý là trong các phầm mềm đồ họa, để tăng tính trực quan, người ta thường đặt một cái tên tiếng Anh cho số mũ . Ví dụ như trong 3ds Max, có tên là Glossiness. Các phần mềm khác cũng xài tên này hoặc các tên khác có nghĩa tương tự.
Cuối cùng, để kết thúc phần trình bày về Phong shading model, xin được nhắc lại rằng đây là một “model” (mô hình). Điều này nghĩa là Phong shading model không nhất thiết chính xác “một trăm phần trăm” với lý thuyết vật lý về ánh sáng. Tuy nhiên, điều quan trọng là Phong shading model cho ta kết quả render khá tốt với thời gian render rất nhanh.
Blinn shading model
Khoảng hai năm sau khi Bùi Tường Phong công bố luận án tiến sĩ của mình. Jim Blinn đề xuất một phiên bản “biến tấu” của Phong shading model. Phiên bản này được gọi là Blinn shading model. Chúng ta sẽ không đi sâu vào các chi tiết toán học của model này vì nó khá giống với Phong shading model. Điều mà chúng ta cần biết là Blinn model là một phiên bản “gần đúng” của Phong model. Có nghĩa là Blinn model còn kém chính xác so với lý thuyết vật lý hơn cả Phong model. Nhưng bù lại, Blinn model có tốc độ tính toán nhanh hơn Phong model và kết qua render của Blinn model vẫn rất tốt. Có lẽ vì vậy mà 3ds Max chọn Blinn model làm shading model mặc định. Hãy xem hình so sánh minh họa dưới đây về Blinn và Phong shading model (hình bên trái dùng Blinn model và hình bên phải dùng Phong model)
Một ghi chú nhỏ trước khi chúng ta chuyển qua phần tiếp theo, Phong model và Blinn model thường hay được nhắc đến dưới một cái tên chung: Blinn-Phong shading model.
Các shading model khác
Blinn-Phong shading model mặc dù thành công và rất phổ biến, nhưng nó không phải là hoàn hảo. Có nhiều loại vật liệu trong cuộc sống thực mà Phong-Blinn model không mô phỏng được một cách tốt lắm. Chính vì vậy mà các shading model khác mới được phát minh ra nhằm mục đích mô phỏng tốt hơn một số loại vật liệu đặc biệt, trong đó có vật liệu đất sét thô, kim loại … Chúng ta sẽ không tìm hiểu các model này.
Local illumination và global illumination
Giới thiệu
Đây là phần thú vị nhất, mặc dù chúng ta sẽ không đi vào mô tả chi tiết các thuật toán. Các bạn sẽ thấy nhưng nỗ lực của ngành Computer Graphics trong những năm vừa qua đã giúp nâng độ hiện thực của hình ảnh render lên một tầng cao mới.
Trước hết hãy xem lại hình vẽ về đường đi của ánh sáng từ nguồn sáng đến một vật, sau đó có thể đến một hoặc một vài vật khác và cuối cùng là đi vào mắt người.
Nguồn sáng → Bề mặt 1 → Bề mặt 2 → …→ Bề mặt n → Mắt
Vào những ngày trước, khi máy tính còn rất chậm so với bây giờ, thì chúng ta hầu như luôn bỏ qua không xem xét đến các lần phản xạ từ lần thứ hai trở đi của ánh sáng. Có nghĩa là nếu một tia sáng từ nguồn sáng chiếu đến vật và sau đó đi trực tiếp vào mắt người thì chúng ta sẽ nhận tia sáng đó và bắt đầu thực hiện việc tính toán (trường hợp này gọi là chiếu sáng trực tiếp, tiếng Anh gọi là Direct lighting). Còn nếu tia sáng chiếu tới vật, sau đó bị phản xạ và đi tới một vật khác (và có thể tiếp tục tới những vật khác nữa), rồi mới tới mắt người, thì chúng ta sẽ không xem xét tia sáng đó (trường hợp này gọi là chiếu sáng không trực tiếp, tiếng Anh gọi là Indirect lighting)
Trong những năm gần đây, khi máy tính trở nên rất nhanh so với trước đây, chúng ta đã có thể bắt đầu xem xét đến trường hợp Indirect lighting.
Phương án “chỉ xem xét direct lighting” được gọi tên là Local illumination và phương án “xem xét cả direct lighting và indirect lighting” được gọi là Global illumination.
Local illumination
Chúng ta có thể thấy một điều hiển nhiên là Local illumination sẽ làm giảm độ hiện thực của hình ảnh render so với global illumination một cách đáng kể vì trong cuộc sống thực của chúng ta, một phần lớn các tia sáng đều có thể bị phản xạ nhiều lần qua các bề mặt khác nhau trước khi đi vào mắt người (Indirect lighting).
Vào những ngày trước, khi máy tính còn chậm so với ngày nay, chúng ta hầu như chỉ quan tâm đến Local illumination. Có nghĩa là khi render thì máy tính sẽ chỉ tính toán giá trị của các lần phản xạ ánh sáng đầu tiên mà thôi (Direct lighting). Như vậy rõ ràng một phần lớn lượng ánh sáng (do những lần phản xạ từ lần thứ hai trở đi) đã bị bỏ qua và khung cảnh khi render sẽ bị tối đi rất đáng kể. Phương pháp đơn giản nhất để khắc phục điều này là dùng ambient lighting (được nhắc đến ở trên trong công thức của Phong Shading Model). Giá trị ambient có thể xem như là giá trị cường độ ánh sáng trung bình do những lần phản xạ từ lần lần thứ hai trở đi tạo nên. Giá trị này sẽ được cộng vào mọi điểm trong khung cảnh 3D khi render. Như vậy mọi điểm trong khung cảnh sẽ sáng lên với một lượng bằng nhau. Thông thường giá trị cụ thể của ambient lighting sẽ do người dùng lựa chọn và hiệu chỉnh theo ý thích của mình cho tới khi cảm thấy thỏa mãn với kết quả render. Hãy xem ví dụ dưới đây về ambient lighting.
Hình bên trái: Giá trị ambient bằng 0. Những điểm không nhận được ánh sáng trực tiếp sẽ bị xem như là tối hoàn toàn
Hình giữa: Tăng giá trị của ambient. Lúc này chúng ta đã có thể nhìn thấy phần mặt phẳng không được nhận ánh sáng trực tiếp. Hãy chú ý là những điểm đã nhận được ánh sáng trực tiếp cũng sẽ sáng hơn so với khi không dùng ambient lighting (như trong hình bên trái) vì giá trị ambient được cộng vào tất cả mọi điểm trong khung cảnh
Hình phải: Tiếp tục tăng giá trị ambient. Khung cảnh tiếp tục trở nên sáng hơn. Nếu chúng ta dùng quá nhiều ambient lighting thì khung cảnh sẽ không còn trông tự nhiên nữa.
Rõ ràng ambient lighting là một phương pháp mang tính “ăn gian” vì trên thực tế, cường độ ánh sáng do những lần phản xạ từ lần thứ hai trở đi không bằng nhau tại tất cả mọi điểm. Tuy nhiên, ưu điểm của phương pháp này là nó rất đơn giản (người dùng chỉ cần chọn một giá trị ambient trước khi thực hiện lệnh render) và không làm tăng thêm thời gian render.
Một phương pháp khác là dùng thêm các nguồn sáng phụ để mô phỏng lại phần ánh sáng tạo nên bởi các lần phản xạ từ lần thứ hai trở đi. Cách này thường cho kết quả tốt hơn với điều kiện chúng ta biết cách đặt các nguồn sáng phụ một cách hợp lý. Nhược điểm hiển nhiên của cách này là thời gian render sẽ lâu hơn (vì có nhiều nguồn sáng để tính toán hơn). Bên cạnh đó, việc đặt các nguồn sáng phụ như thế nào để ra kết quả đáng hài lòng không phải là dễ.
Trong những năm gần đây, khi máy tính trở nên nhanh hơn rất nhiều so với trước đó, cộng với sự ra đời của những thuật toán mới, chúng ta đã bắt đầu có thể giải quyết được bài toàn Global illumination trong lượng thời gian có thể chấp nhận được. Phần tiếp theo sẽ thảo luận về Global illumination.
Global illumination
Global illumination là một lĩnh vực khá mới trong Computer Graphics và các phương pháp để tính toán global illumination liên tục được cải tiến và mở rộng. Phần trình bày này không đi vào từng phương pháp một mà chỉ là một phần giới ngắn nhằm giúp các bạn thấy vai trò vô cùng quan trọng của Global illumination trong việc nâng mức độ hiện thực của đồ họa máy tính lên một tầm cao mới.
Trước hết hãy xem hình ví dụ sau để thấy sự khác nhau giữa Local illumination và Global illumination.
Chắc hẳn các bạn đều cảm nhận được hình bên phải (là hình có sử dụng Global illumination) trong thật hơn rất nhiều so với hình bên trái (là hình chỉ sử dụng Local illumination). Hãy xem xét một số điểm khác biệt quan trọng sau.
- Trong hình bên phải, màu đỏ của bức tường hắt xuống phần sàn nhà gần đó. Hiện tượng này có tên là Color bleeding (tràn màu, hoặc “chảy” màu). Nguyên nhân của hiện tượng này là do ánh sáng phản xạ từ bức tường đỏ xuống sàn nhà. Rõ ràng, chỉ khi dùng global illumination chúng ta mới có thể mô phỏng lại hiện tượng này. Tương tự chúng ta cũng có thể thấy màu xanh lá cây của bức tường đối diện hắt xuống phần sàn nhà gần đó.
- Các bạn hãy để ý đốm sáng trên bức tường đỏ ở hình bên phải. Hiện tượng này trong vật lý được gọi là Caustic (tụ quang): ánh sáng bị khúc xạ hoặc phản xạ bởi bề mặt cong (mà trong khung cảnh ví dụ ở hình trên chính là hai quả cầu trong suốt). Phương pháp đầu tiên có thể mô phỏng lại hiện tượng này là photon mapping.
- Cuối cùng, điểm quan trong nhất: Hãy nhìn vào khu vực bị khuất ánh sáng của căn phòng. Ánh sáng từ ánh đèn trên trần nhà sẽ không thể chiếu trực tiếp vào khu vực này mà phải phản xạ qua các bề mặt khác trong căn phòng để tới được khu vực này. Trong hình bên trái, khu vực này được “chiếu sáng” nhờ ambient lighting. Vì vậy mà cường độ ánh sáng tại đây trông rất đều và chúng ta không thể nhìn thấy cạnh giao nhau giữa các mặt tường. Trong khi ở hình bên phải, nhờ có global illumination mà ánh sáng tại khu vực này được mô phỏng chính xác hơn, và chúng ta có thể nhìn thấy cạnh giao nhau giữa các mặt tường.
Dưới đây là một ví dụ khác. Các bạn hãy thử suy nghĩ xem hình nào dùng Local illumination, hình nào dùng Global illumination. Hãy thử giải thích tại sao trần nhà trong hình bên trái lại có màu đen? Theo bạn, hình bên trái có sử dụng ambient lighting hay không?
| |
Có thể nói vai trò của Global illumination rất quan trọng. Nó giúp hình ảnh render trông thật hơn, giúp người xem cảm nhận hình khối của các vật thể một cách rõ ràng hơn, và các vật thể ở sẽ được render một cách đầy đủ hơn (nhất là ở những khu vực ít ánh sáng hoặc không nhận được ánh sáng trực tiếp).
Các phần mềm đồ họa hiện nay, đặc biệt là các renderer như Mental Ray, Pixar Photorealistic Renderman, VRay, Brazil, Final Renderer, đều có sử dụng Global illumination Người dùng phần mềm thường có thể chọn ra phương pháp tính toán Global illumination phù hợp với yêu cầu của mình. Các yếu tố mà chúng ta cần xem xét khi chọn phương pháp tính toán Global illumination bao gồm:
- Phương pháp này có tính toán được Global illumination một cách đầy đủ so với nhu cầu của chúng ta hay không? (Vì có những phương pháp chỉ có thể tính được một phần của global illumination)
- Thời gian tính toán (cũng chính là thời gian render).
- Bộ nhớ RAM. Nhiều phương pháp cần sử dụng rất nhiều bộ nhớ RAM. Điều này không cho phép chúng ta render các khung cảnh quá phức tạp nếu chúng ta không có nhiều RAM.
Như đã nói ở trên, các phương pháp tính toán Global illumination hiện vẫn đang liên tục được phát triển, cải tiến hoặc mở rộng. Người dùng các phần mềm đồ họa thường phải hiểu được nguyên lý hoạt động căn bản của các phương pháp này thì mới có thể lựa chọn các thông số thiết lập (setting parameter) cho các phương pháp này một cách có hiệu quả. Hy vọng một lúc nào đó tôi sẽ có dịp thực hiện một bài viết để trình bày cụ thể hơn về các phương pháp tính toán Global illumination và nguyên lý hoạt đông của chúng.
Không có nhận xét nào:
Đăng nhận xét
Lưu ý: Chỉ thành viên của blog này mới được đăng nhận xét.