Các mô hình tổng hợp

Một phần của tài liệu Nghiên cứu một số hiệu ứng bóng và ánh sáng trong xây dựng các ứng dụng thực tại ảo (Trang 35)

Thông thƣờng ngƣời ta không sử dụng các mô hình ánh sáng trên một cách độc lập mà ngƣời ta thƣờng sử dụng kết hợp chúng với nhau để tạo nên những loại bề mặt phức tạp hơn. Có 3 trƣờng hợp ngƣời ta hay sử dụng đó là sử dụng độc lập Ambient để sử dụng cho những đối tƣợng không có sự phản ứng với các nguồn sáng, sử dụng kết hợp ambient-diffuse để thể hiện những đối tƣợng có độ trơn, bóng của bề mặt thấp, kết hợp cả ba phần ambient-diffuse-specular sử dụng cho đối tƣợng có độ bóng- trơn nhất định.

Với cách sử dụng động lập Ambient, sẽ không phản ánh bất kỳ loại đối tƣợng nào trong thực tế, tuy nhiên sử dụng Ambient lại cho kết qua render nhanh nhất do đó trong một số trƣờng hợp không cần có sự chiếu sáng phức tạp, chỉ cần thể hiện đƣợc mầu sắc thì ngƣời ta hay sử dụng cách này.

Hai kiểu kết hợp sau là hai kiểu kết hợp rất phổ biến, tùy vào từng loại đối tƣợng nhất định mà ngƣời ta quyết định sử dụng mô hình kết hợp ambient-diffuse hay mô hình kết hợp ambient-diffuse-specular. Đƣơng nhiên mô hình kết hợp ambient- diffuse-specular có thể thể hiện đƣợc mô hình ambient-diffuse (hay nói cách khác

ambient-diffuse có thể đƣợc biểu diễn thông qua ambient-diffuse-specular), tuy nhiên tốc độ của nó lại chậm hơn do phải tính thêm một bƣớc, vì vậy ngƣời ta không đồng nhất các mô hình này lại với nhau, mà vẫn sử dụng độc lập nhằm tạo ra sự tối ƣu tính toán, cũng nhƣ lƣu trữ cho hệ thống. Công thức (2.4) là công thức thể hiện cho mô hình ambient-diffuse. Từ (2.4)(2.5) có thể đƣa ra công thức tính ánh sáng cho mô hình ambient-diffuse-specular nhƣ sau:

n j j n s n i i i i d g x i I x l n l k r v I k v x L v x L 1 1 0( , ) ( , ). ( , ).cos( , ) cos( , ) . ) , (        (2.8)

Trong công thức trên mô hình phản xạ gƣơng đƣợc sử dụng là mô hình phản xạ

Phong. Việc xây dựng, thể hiện các công thức cho các mô hình phản xạ gƣơng khác có thể dễ dàng thực hiện dựa vào các công thức (2.4)->(2.8).

Hình 2.2 Các mô hình thể hiện hiệu ứng phản xạ, từ trái qua phải tƣơng ứng là “Ambient”, “Ambient-diffuse”, và “Ambient-diffuse-specular”

Hình 2.2 thể hiện một đối tƣợng khi nó đƣợc vẽ bằng các mô hình phản xạ kết hợp khác nhau “Ambient”, “Ambient-diffuse”, và “Ambient-diffuse-specular” lần lƣợt từ trái qua phải.

Ngày nay ngoài việc sử dụng kết hợp, hiệu chỉnh, mở rộng các mô hình phản xạ cơ bản còn có rất nhiều nghiên cứu, và kết quả nghiên cứu khác nhau nhằm thể hiện cho các bề mặt mà đặc tính phản xạ là không đồng nhất hoàn toàn, thông thƣờng ngƣời ta tập trung vào những mô hình bề mặt tuân theo một số quy luật nhất định. Có thể kể đến một số mô hình nhƣ Normal Mapping, Bump Mapping, Mô hình chiếu sáng cho tóc, Mô hình chiếu sáng cho da người vv… [7], [8], [9], [10], [11].

2.1.5. Các phương pháp tô bóng trong đồ họa 3D (Shader)

Trong phần “1.2.5” chúng ta đã có các công thức, mô hình hóa cho việc tô bóng, và các phần trên cũng đã cụ thể hóa các trƣờng hợp sử dụng thành các mô hình riêng biệt, và các mô hình kết hợp trong việc thể hiện hiệu ứng bóng bề mặt. Tuy nhiên các phƣơng pháp trên đều giả sử rằng bề mặt là hoàn toàn liên tục, ngƣời ta xét các điểm là các khu vực rất nhỏ trên bề mặt do đó có thể coi đó là mặt phẳng.

Mặt khác, dữ liệu trong máy tính luôn là các dữ liệu rời rạc, các mô hình đối tƣợng đều đƣợc quy về thành các tam giác phẳng. Vậy muốn thể hiện đƣợc đối tƣợng gần với thực tế phải có những phƣơng pháp nội suy để thể hiện đƣợc xấp xỉ cho những bề mặt cong, trơn thông qua các mặt phẳng rời rạc.

Khi sử dụng trực tiếp các mô hình chiếu sáng ở trên, kết quả thu đƣợc là một hình ảnh phản ánh đúng đối tƣợng là một tập các đa giác, không có sự liên tục về độ sáng trên bề mặt. Phƣơng pháp tô bóng nhƣ vậy đƣợc gọi là phƣơng pháp tô bóng phẳng (Flat shadering). Phƣơng pháp tô bóng phẳng phù hợp với rất nhiều đối tƣợng đặc biệt là các đối tƣợng cần thể hiện góc cạnh, ví dụ nhƣ một hộp chữ nhật, tƣờng, trần nhà đƣợc sơn phẳng vv… Tuy vậy, với các đối tƣợng có độ cong, trơn mà khi chuyển thành dữ liệu rời rạc trên máy tính (là các đa giác phẳng), thì cách tô bóng phẳng không thể hiện đƣợc đúng với đối tƣợng ban đầu do đó ngƣời ta đƣa ra một số phƣơng pháp tô bóng xấp xỉ bằng cách nội suy nhằm tăng độ trơn của vật thể, và từ đó làm tăng mức độ trung thực của hình ảnh thu đƣợc.

Hình 2.3 là ảnh kết quả khi thể hiện xấp xỉ một hình cầu bằng các tứ giác. Rõ ràng khi quan sát ta thấy các tứ giác, mỗi tứ giác có một mức sáng riêng biệt, không có sự chuyển tiếp mức sáng từ tứ giác này sang tứ giác kia. Có thể tăng chất lƣợng thể hiện hình cầu bằng cách tăng số lƣợng đa giác lên, trong trƣờng hợp số lƣợng tứ giác đủ nhiều thì chất hình ảnh thu đƣợc sẽ gần với bản chất của hình cầu. Nhƣng hậu quả của việc này là số lƣợng dữ liệu cần phải lƣu trữ là rất lớn, số lƣợng đa giác cần vẽ cũng rất nhiều, do đó khả năng đáp ứng thời gian thực của phƣơng pháp sẽ giảm đi. Vì vậy mà hƣớng xây dựng thuật toán xấp xỉ đƣợc quan tâm, phát triển.

Hình 2.3. Hình cầu đƣợc tô bóng theo phƣơng pháp (Flat shadering)

Hai phƣơng pháp nội suy bóng bề mặt phổ biến nhất hiện nay là phƣơng pháp

Gauraud, và phƣơng pháp Phong. Đây cũng là hai phƣơng pháp đƣợc để cập trong các phần dƣới đây.

a. Tô bóng Gauraud

Phƣơng pháp tô bóng Gauraud đƣợc đƣa ra để khắc phục nhƣợc điểm của phƣơng pháp tô bóng phẳng, nhằm làm tăng độ trơn của hình ảnh kết quả, mà không

làm tăng đáng kể độ phức tạp, cũng nhƣ thời gian tính toán của thuật toán. Phƣơng pháp Gauraud ra đời từ khá sớm và đƣợc ứng dụng rất phổ biến trong lĩnh vực dựng hình. Ngày nay, hầu hết các bộ thƣ viện đồ họa 3D hiện nay đều hỗ trợ trực tiếp phƣơng pháp tô bóng này.

Phƣơng pháp Gauraud làm việc bằng cách tính, nội suy cƣờng độ ánh sáng của các điểm trong đa giác nhƣ là một hàm của các đỉnh cấu thành nên đa giác đó. Thông thƣờng mỗi đa giác đều có một vector pháp tuyến, và trong phƣơng pháp tô bóng phẳng vecter pháp tuyến này đƣợc sử dụng trực tiếp để tính lƣợng ánh sáng phản xạ khỏi bề mặt (dựa vào các công thức từ (1.23)->(2.8). Tuy nhiên, phƣơng pháp

Gauraud lại đi xa hơn một chút bằng cách tính sau đó sử dụng vector pháp tuyến tại mỗi đỉnh của đa giác.

Vấn đề đặt ra là một đa giác phẳng có thể có nhiều vector pháp tuyến ?. Thực sự thì nó chỉ có môt mà thôi. Nhƣng đối tƣợng lại đƣợc cấu thành từ nhiều đa giác xếp liên tiếp nhau. Dựa vào đó Gauraud đã đƣa ra cách tính vector pháp tuyến tại mỗi đỉnh của đa giác bằng cách tính trung bình các vector pháp tuyến của các mặt phẳng có chung đỉnh đang xét.

Sau khi đã có vector pháp tuyến cho mỗi đỉnh, việc tính toán sự phản xạ theo phƣơng pháp tô bóng phẳng chuẩn đƣợc thực hiện môt cách bình thƣờng tại mỗi đỉnh của đa giác với các vector trên các đỉnh này. Các điểm nằm trong đa giác đƣợc tính bằng cách nội suy giá trị mầu sắc (color), và độ sâu (depth) từ các điểm đỉnh đã đƣợc tính theo thuật toán dòng quét (scanline).

Hình 2.4. Giải thuật scanline cho nội suy bóng Gauraud

Phƣơng pháp nội suy Gauraud thực hiện nhƣ sau: đầu tiên ta tính cƣờng độ ánh sáng tại các điểm đỉnh của đa giác tức IA, IB, Ic, bình thƣờng (nhƣ phƣơng pháp tô bóng

P Q R A B C

phẳng) sau đó cƣờng độ tại điểm P bất kỳ đƣợc tính bằng cách nôi suy cƣờng độ tại Q

và cƣờng độ tại R.

Ip = t*IQ + (1.-t) * IR (2.9) (adsbygoogle = window.adsbygoogle || []).push({});

trong đó t là tỷ số giữa độ dài đoạn thằng PR và độ dài đoạn thẳng PQt =|PR|/|QR|, IR, và IQ đƣợc tính tƣơng tự nhƣ sau:

IQ =u*IA + (1.-u) * IB (2.10) IR = v*IB + (1.-v) * IC (2.11) u, v cũng đƣợc tính tƣơng tự nhƣ t, u = |QB|/|AB|, v=RC/|BC|.

Công thức (2.9) cũng có thể viết lại dƣới dạng phụ thuộc giữa hai điểm liên tiếp ta có Ip2 = t2*IQ + (1.-t2) * IR, và Ip1 = t1 *IQ + (1.-t1) * IR trừ hai công thức này cho nhau ta đƣợc: t I I t t I I I Ip2 p1 ( Q R)( 2 1) p1 . (2.12)

Mặc dù khắc phục đƣợc một số nhƣợc điểm của phƣơng pháp tô bóng phẳng, nhƣng phƣơng pháp vẫn tồn tại một số vấn trong phƣơng pháp Gauraud nhƣ: vì sử dụng nội suy tuyến tính nên nó không thực sự thể hiện tốt đƣợc các bề mặt cong, mặt khác nếu một đỉnh là lân cận của các đa giác có kích thƣớc không đồng đều thì kích thƣớc của đa giác không ảnh hƣởng đến sự chiếu sáng do đó vùng đa giác lớn sẽ có ánh sáng ít thay đổi hơn vùng đa giác nhỏ (tính trên phƣơng diện diện tích), hay nói cách khác đối tƣợng sẽ không trơn tại các đa giác lớn bằng trên các đa giác nhỏ. Các vấn đề này nhìn chung đƣợc khắc phục trong phƣơng pháp đƣợc đƣa ra bởi Phong.

Hình 2.5. Hình cầu đƣợc tô bóng theo phƣơng pháp FlatGauraud

Quan sát Hình 2.5 dễ dàng nhận thấy khi thể hiện hình cầu phƣơng pháp

Gauraud kết quả thu đƣợc là môt hình ảnh trông giống hình cầu hơn là với phƣơng pháp tô bóng phẳng. Tuy nhiên, dễ thấy ánh sáng tập trung vào các điểm đỉnh đa giác chứ không phải điểm mà với hình cầu tại đó hƣớng nhìn là tia phản xạ của hƣớng

chiếu sáng. Có hiệu ứng nhƣ vậy là do Gauraud tính ánh sáng, trƣớc tại mỗi đỉnh sau đó mới nội suy chúng cho các điểm trong đa giác.

b. Tô bóng Phong

Phong tên đầy đủ là “Bùi Tường Phong” sinh năm 1942 tại Hà Nội mất năm 1975 khi đó ông đang tham gia nghiên cứu, giảng dậy tai trƣờng đại học Stanford của Mỹ, có thể nói ông là một trong những ngƣời tiên phong trong lĩnh vực khoa học máy tính đặc biệt là lĩnh vực đồ họa máy tính. Tuy cuộc đời đặc biệt là cuộc đời khoa học của Ông tƣơng đối ngắn ngủi (chƣa đầy 15 năm) nhƣng Ông đã có những đóng góp to lớn cho lĩnh vực khoa học máy tính đặc biệt là lĩnh vực đồ họa 3D, những đóng góp tiêu biểu của Ông trong lĩnh vực đồ họa máy tính có thể kể đến là: mô hình chiếu sáng (phản xạ) bề mặt Phong (trình bày trong mục 2.1.3.) và phƣơng pháp nội suy bóng

Phong hay thƣờng đƣợc gọi đơn giản là (Phƣơng pháp tô bóng Phong).

Phƣơng pháp Phong đƣợc đƣa ra để giải quyết một số vấn đề của phƣơng pháp tô bóng Gauraud. Trong khi Gauraud là phƣơng pháp nội suy theo trị số dọc dòng quét. Phƣơng pháp Phong là phƣơng pháp nội suy sử dụng vector pháp tuyến dọc theo dòng quét, và vector pháp tuyến này đƣợc sử dụng trong phƣơng trình tô bóng (1.23)

để xác định đƣợc cƣờng độ ánh sáng tại một điểm trên bề mặt. Bằng cách sử dụng

vector pháp tuyến phƣơng pháp nội suy Phong có cách xấp xỉ tƣơng tự nhƣ bề mặt

curved do đó cho bề mặt có độ sáng trơn hơn so với phƣơng pháp của Gauraud.

Cũng nhƣ Gauraud bƣớc đầu tiên của phƣơng pháp nội suy này cũng phải tính

vector pháp tuyến tại mỗi đỉnh. Sau đó tại mỗi điểm thay vì nội suy trực tiếp cƣờng độ ánh sáng tại điểm đó, ta đi tính vector pháp tuyến tại điểm đó bằng cách nội suy (dễ dàng tính tƣơng tự nhƣ các công thức (2.9)->(2.12)), sau đó ta mới tính cƣờng độ ánh sáng tại điểm này dựa vào các công thức (1.23)->(2.8)vector pháp tuyến tính đƣợc theo phƣơng pháp của Gauraud.

Hình 2.6. Các hình cầu có cùng số đa giác nhƣng sử dụng các phƣơng pháp tô bóng khác nhau

Với Hình 2.6, rõ ràng kết quả của phƣơng pháp tô bóng Phong cho kết quả tốt hơn hai phƣơng pháp tô bóng “Phẳng”, và “Gauraud” khi thể hiện các bề mặt có độ cong – trơn. Với hình cầu nhƣ trong hình trên ta thấy rằng phƣơng pháp “Phong” có thể thể hiện đƣợc đúng bản chất của hình cầu mà không cần sử dụng nhiều đa giác hơn.

Ngoài các phƣơng pháp tô bóng trên hiện nay ngƣời ta đã đƣa ra nhiều phƣơng pháp khác, đặc biệt là các phƣơng pháp tô bóng sử dụng bản đồ mẫu các giá trị trên bản đồ là sự đặc trƣng cho giá trị của hàm BRDF do đó có thể thể hiện đƣợc các bề mặt phức tạp hơn (những bề mặt có kết cấu không thuần nhất), ví dụ nhƣ: normal mapping, parallax mapping, displacement mapping, bump mapping vv... Việc xây dựng các phƣơng pháp tô bóng phù hợp cho các đặc trƣng của từng loại đối tƣợng cụ thể ứng dụng trong đồ họa thời gian thực đã và đang là một hƣớng nghiên cứu đƣợc sự quan tâm của nhiều nhà khoa học, trong thời gian gần đây [6], [7], [10], [11].

2.1.6. Cài đặt các phương pháp tô bóng trong đồ họa 3D

Phần trên đã đề cập đến một số thuật toán tô bóng vậy làm sao chúng ta có thể cài đặt đƣợc các thuật toán này để sử dụng trong các ứng dụng thời gian thực ?. Hiện nay, hầu hết các bộ tăng tốc đồ họa đều hỗ trợ việc lập trình trên chính thiết bị đó, các ngôn ngữ lập trình phục vụ trong lĩnh vực này đƣợc gọi chung là ShaderingLanguage, có thể kể đến các ngôn ngữ nhƣ: GLSL, HLSL, CG, CL vv… Hầu hết các ngôn ngữ này đều đƣợc xây dựng dựa trên cấu trúc của ngôn ngữ C đƣợc đơn giản, chuyên biệt hóa. Sử dụng sự hỗ trợ này của các thiết bị ta có thể xây dựng đƣợc những chƣơng trình thể hiện các hiệu ứng bề mặt khác nhau trong ứng dụng thời gian thực.

Đề hiểu rõ hơn về việc lập trình cho các thiết bị trƣớc hết ta hãy phân tính mô hình render sử dụng trong GL, và Dirext3D, hai bộ thƣ viện đồ họa phổ biến nhất hiện nay.

Hình 2.7. Mô hình render sử dụng trong GLDirect3D

Trong sơ đồ trên có hai tiến trình có khả năng lập trình đƣợc đó là Vertex ProcesserFragment Processer. Tiến trình Vertex Processer có đầu vào là các thuộc tính một điểm (vertex), bao gồm các thuộc tính nhƣ vị trí trong không gian 3D, mầu sắc, các vị trí các ánh xạ lên texture, hƣớng vector pháp tuyến tại điểm đó vv.. Các tham số của vertex có thể đƣợc ngƣời lập trình tùy biến trong một giới hạn nhất định về số lƣợng, giới hạn này thƣờng lớn hơn 16 tham số mang giá trị thực tùy vào sự hỗ trợ của phần cứng. Ngoài các tham số mô tả thuộc tính vertex còn có các tham số đặc tả các thuộc tính của môi trƣờng ví dụ các thuộc tính ánh sáng, bề mặt, texture, mô hình chiếu sáng, sƣơng mù vv… Đầu ra của quá trình này là tập các thuộc tính đã đƣợc xử lý bởi chƣơng trình Vertex Processer. Với quá trình Fragment Processer đầu vào là các điểm đã đƣợc xử lý sau tiến trình Vertex Processer, và tiếp theo đó nó đƣợc chuyển sang không gian của ảnh kết quả (không gian Raster). Các tham số tƣơng ứng đã đƣợc nội suy tuyến tính theo phƣơng pháp Affine từ các đỉnh của đa giác đƣợc cấu thành từ các vertex. Tƣơng tự nhƣ Vertex Processer quá trình này cũng có đầu vào là một tập hợp biến môi trƣờng. Yêu cầu đầu ra cho quá trình này là các giá trị màu sắc,

depth vv..đã ghi lên các bộ đệm kết quả.

Ví dụ dƣới đây là các đoạn mã thể hiện thuật toán tô bóng Phong viết bằng ngôn ngữ GLSL, trong một trƣờng hợp đơn giản là: có một nguồn sáng Direction Light, không có texture và hiệu ứng khác nhƣ sƣơng mù, khí quyển vv..:

[tiến trình Vertex Processer] void main()

normal = gl_NormalMatrix * gl_Normal;

vec3 vVertex = vec3(gl_ModelViewMatrix * gl_Vertex); lightDir0 = vec3(gl_LightSource[0].position.xyz - vVertex); lightDir1 = vec3(gl_LightSource[1].position.xyz - vVertex); eyeVec = -vVertex; (adsbygoogle = window.adsbygoogle || []).push({});

gl_Position = ftransform(); }

[tiến trình Fragment Processer]

varying vec3 normal, lightDir0, lightDir1, eyeVec; void main (void)

{ vec4 final_color = (gl_FrontLightModelProduct.sceneColor * gl_FrontMaterial.ambient) + (gl_LightSource[0].ambient * gl_FrontMaterial.ambient) + (gl_LightSource[1].ambient * gl_FrontMaterial.ambient); gl_FragColor = final_color; }

Khi sử dụng chƣơng trình tô bóng trên, áp dụng vào một hình torus thì hình ảnh

Một phần của tài liệu Nghiên cứu một số hiệu ứng bóng và ánh sáng trong xây dựng các ứng dụng thực tại ảo (Trang 35)