Rasterization, nội suy và chiếu sáng

Tọa độ barycentric

Cho tam giác có các đỉnh \(\bm{p}_0, \bm{p}_1, \bm{p}_2\). Mọi điểm trong mặt phẳng tam giác có thể viết

\[\bm{p} = \lambda_0 \bm{p}_0 + \lambda_1 \bm{p}_1 + \lambda_2 \bm{p}_2, \qquad \lambda_0 + \lambda_1 + \lambda_2 = 1.\]

Điểm nằm trong tam giác kín khi \(\lambda_i \geqslant 0\) với mọi \(i\). Các hệ số \(\lambda_i\) là tọa độ barycentric và cũng chính là trọng số nội suy thuộc tính theo đỉnh.

Trong hai chiều, đặt edge function

\[E_{ab}(\bm{p}) = (p_x - a_x)(b_y - a_y) - (p_y - a_y)(b_x - a_x).\]

Sau khi thống nhất winding, dấu của ba giá trị

\[E_{p_0 p_1}(\bm{p}), \quad E_{p_1 p_2}(\bm{p}), \quad E_{p_2 p_0}(\bm{p})\]

cho biết sample có nằm trong tam giác hay không. Edge function là affine theo \(x, y\), vì vậy có thể cập nhật tăng dần khi quét qua các pixel thay vì tính lại từ đầu.

Rasterization

Rasterizer không chỉ “vẽ đường viền” mà xác định tập sample được primitive phủ. Quy trình cơ bản:

  1. tính bounding box của tam giác trong screen space;

  2. giới hạn bounding box vào viewport;

  3. đánh giá ba edge function tại tâm mỗi sample;

  4. áp dụng quy tắc biên nhất quán, chẳng hạn top-left rule, để hai tam giác chung cạnh không tạo khe hoặc tô trùng;

  5. sinh fragment và tọa độ barycentric cho các sample hợp lệ.

Multisample anti-aliasing đánh giá coverage tại nhiều sample trong mỗi pixel. Màu cuối là kết quả resolve các sample, giúp làm mượt biên hình học.

Nội suy thuộc tính

Một đại lượng affine \(a\) như độ sâu sau projection có thể nội suy bằng

\[a = \lambda_0 a_0 + \lambda_1 a_1 + \lambda_2 a_2.\]

Tuy nhiên texture coordinate, vị trí camera-space và các varying khác không affine sau phép chia phối cảnh. Nếu clip coordinate của đỉnh \(i\) có thành phần \(w_i\), nội suy đúng là

\[a(\bm{p}) = \frac{\displaystyle \sum_{i = 0}^2 \lambda_i \dfrac{a_i}{w_i}} {\displaystyle \sum_{i = 0}^2 \lambda_i \dfrac{1}{w_i}}.\]

Đây là perspective-correct interpolation. Nội suy tuyến tính trực tiếp tọa độ texture trong screen space làm texture trượt hoặc méo trên bề mặt nghiêng.

Depth buffer

Depth buffer lưu độ sâu gần nhất tại mỗi sample. Fragment mới chỉ được giữ nếu vượt qua depth test. Đây là cách giải visibility theo từng pixel với chi phí gần tuyến tính theo số fragment, trái với thuật toán đường khuất hình học ở Phép chiếu đa diện và khử đường khuất.

Độ sâu sau projection không phân bố tuyến tính theo khoảng cách camera; phần lớn độ chính xác tập trung gần near plane. Các biện pháp cải thiện gồm:

  • tăng near distance thay vì chỉ tăng far distance;

  • dùng depth format có độ chính xác cao hơn;

  • dùng reversed-Z với phép so sánh đảo và floating-point depth khi pipeline hỗ trợ;

  • tránh hai bề mặt gần đồng phẳng gây z-fighting.

Màu và không gian màu

Màu RGB tuyến tính là vectơ

\[\bm{c} = (r, g, b), \qquad 0 \leqslant r, g, b \leqslant 1.\]

Phép modulation thực hiện theo từng thành phần:

\[\bm{c}_1 \odot \bm{c}_2 = (r_1 r_2, g_1 g_2, b_1 b_2).\]

Các phép chiếu sáng phải thực hiện trong linear color space. Giá trị sRGB lưu trong texture hoặc framebuffer đã qua hàm truyền phi tuyến; phải decode trước khi cộng, nhân hoặc nội suy ánh sáng và encode lại khi xuất.

Alpha và blending

Màu RGBA thêm thành phần \(\alpha\) mô tả opacity. Với alpha thẳng, phép source-over tổng quát là

\[\alpha_{out} = \alpha_s + (1 - \alpha_s)\alpha_d,\]
\[\bm{c}_{out} = \frac{ \alpha_s \bm{c}_s + (1 - \alpha_s)\alpha_d \bm{c}_d }{\alpha_{out}}\]

khi \(\alpha_{out} > 0\). Nếu destination đục, \(\alpha_d = 1\), công thức màu rút gọn thành \(\alpha_s \bm{c}_s + (1 - \alpha_s) \bm{c}_d\).

Với premultiplied alpha, đặt \(\bm{c}' = \alpha \bm{c}\); khi đó

\[\bm{c}'_{out} = \bm{c}'_s + (1 - \alpha_s) \bm{c}'_d.\]

Dạng này giúp phép tổng hợp ổn định hơn ở biên texture. Vật trong suốt thường cần sắp xếp từ xa tới gần nếu dùng blending thông thường, vì phép tổng hợp không giao hoán.

Texture và lấy mẫu

Tọa độ texture \((u, v)\) ánh xạ một điểm bề mặt vào ảnh. Nearest sampling chọn texel gần nhất; bilinear sampling nội suy bốn texel lân cận. Khi texture bị thu nhỏ mạnh, một pixel phủ nhiều texel và cần mipmap để lọc gần đúng trên footprint lớn hơn.

Đạo hàm screen-space của \(u, v\) ước lượng mức mipmap. Anisotropic filtering cải thiện trường hợp footprint kéo dài mạnh, thường xảy ra khi nhìn bề mặt dưới góc xiên.

Mô hình chiếu sáng cục bộ

Đặt:

  • \(\widehat{\bm{n}}\) là pháp tuyến bề mặt;

  • \(\widehat{\bm{l}}\) là hướng từ điểm tới nguồn sáng;

  • \(\widehat{\bm{v}}\) là hướng từ điểm tới camera;

  • \(\widehat{\bm{h}} = \dfrac{\widehat{\bm{l}} + \widehat{\bm{v}}}{\|\widehat{\bm{l}} + \widehat{\bm{v}}\|}\) là half vector.

Thành phần khuếch tán Lambert là

\[\bm{c}_{diff} = \bm{c}_{light} \odot \bm{c}_{albedo} \max(0, \widehat{\bm{n}} \cdot \widehat{\bm{l}}).\]

Một mô hình specular đơn giản kiểu Blinn--Phong dùng

\[\bm{c}_{spec} = \bm{c}_{light}\, k_s \max(0, \widehat{\bm{n}} \cdot \widehat{\bm{h}})^q,\]

trong đó \(q\) càng lớn thì highlight càng hẹp. Ambient term chỉ là xấp xỉ thô cho ánh sáng gián tiếp và không bảo toàn năng lượng.

Với point light ở khoảng cách \(d\), attenuation thường được xấp xỉ bởi

\[A(d) = \frac{1}{k_c + k_l d + k_qd^2}.\]

Trong mô hình vật lý lý tưởng cường độ giảm theo \(1/d^2\); các hệ số tổng quát chủ yếu phục vụ điều khiển nghệ thuật.

Pháp tuyến theo mặt và theo đỉnh

Flat shading dùng một pháp tuyến cho cả mặt. Smooth shading gán pháp tuyến tại đỉnh, thường bằng trung bình có trọng số của pháp tuyến các mặt kề, rồi nội suy và chuẩn hóa lại tại fragment.

Không nên trung bình qua cạnh sắc. Mesh thường tách vertex hoặc dùng smoothing group để một vị trí hình học có nhiều pháp tuyến khác nhau.

Vòng lặp mô phỏng và dựng hình

Một game loop tách update trạng thái khỏi render. Để mô phỏng ổn định, dùng bước thời gian cố định \(h\):

\[t_{acc} \leftarrow t_{acc} + \Delta t, \qquad \text{while } t_{acc} \geqslant h: \quad \operatorname{update}(h), \quad t_{acc} \leftarrow t_{acc} - h.\]

Render có thể nội suy giữa hai trạng thái mô phỏng với \(\alpha = t_{acc}/h\). Cách này tách tốc độ mô phỏng khỏi frame rate, giảm sai khác vật lý giữa máy nhanh và máy chậm. Đây là nguyên lý bền vững hơn vòng lặp cố ép một số frame cố định bằng cách bỏ qua thời gian dư.