njin
Engine 2D gọn nhẹ để tự tay làm game theo ý mình. Vibe coding cũng ổn luôn
Loading...
Searching...
No Matches
Ánh sáng 2D

Đèn điểm, đèn nón, đèn hướng, ánh sáng nền, bóng đổ từ vật chắn, normal map, đèn theo vật lý. Tiếp...

Classes

struct  njin::light_2d
 Một nguồn sáng 2D. Tiếp...
struct  njin::light_occluder
 Vật chắn sáng: một hình chắn ánh sáng và đổ bóng. Tiếp...
struct  njin::light_occluder_sprite
 Vật chắn theo hình sprite: viền của các pixel đủ đục trong frame đang hiện của sprite trên cùng entity, nên bóng đúng hình cái cây, con quái, và đổi theo từng frame animation, lật ngang, xoay và co giãn. Tiếp...
struct  njin::light_occluder_pixels
 Vật chắn từng pixel: những pixel đủ đục của ảnh sprite (hoặc của mask) chắn sáng và đổ bóng đúng từng pixel, không cần dựng hình. Tiếp...
struct  njin::lighting_desc
 Cài đặt chung của ánh sáng. Đặt bằng lighting_set(). Tiếp...

Enumerations

enum  njin::light_kind : i32 { njin::light_point , njin::light_spot , njin::light_directional }
 Loại đèn. Tiếp...
enum  njin::light_falloff : i32 { njin::falloff_physical , njin::falloff_linear , njin::falloff_smooth , njin::falloff_none }
 Đường cong tối dần theo khoảng cách của đèn điểm và đèn nón. Tiếp...
enum  njin::light_tonemap : i32 { njin::tonemap_shoulder , njin::tonemap_reinhard , njin::tonemap_aces }
 Cách nén ánh sáng HDR về màn hình. Đều chạy sau độ phơi sáng (lighting_desc::exposure). Tiếp...

Các hàm

light_occluder njin::light_occluder_box (vec2 size, vec2 origin={0.5f, 0.5f})
 Vật chắn hình chữ nhật.
light_occluder njin::light_occluder_ellipse (vec2 radii, vec2 center={0.0f, 0.0f}, i32 segments=16)
 Vật chắn hình elip (đa giác đều đủ nhiều cạnh).
light_occluder njin::light_occluder_circle (f32 radius, vec2 center={0.0f, 0.0f}, i32 segments=16)
 Vật chắn hình tròn.
light_occluder njin::light_occluder_capsule (vec2 a, vec2 b, f32 radius, i32 arc_segments=6)
 Vật chắn hình viên thuốc (capsule): đoạn thẳng từ a đến b phình ra radius.
light_occluder njin::light_occluder_line (std::vector< vec2 > points)
 Vật chắn là một đường gấp khúc mỏng, chắn cả hai phía: tường, hàng rào, mép vách.
std::vector< light_occluder > njin::light_occluders_from_tiles (const tilemap &map, const std::function< bool(i32 tile)> &solid, f32 simplify=0.0f)
 Viền các ô đặc của một tilemap thành các vật chắn, để tường và vách chặn sáng.
void njin::lighting_set (context &ctx, const lighting_desc &desc)
 Đặt cài đặt ánh sáng.
lighting_desc njin::lighting_get (const context &ctx)
 Cài đặt ánh sáng đang dùng.
rgba njin::light_color_kelvin (f32 kelvin)
 Màu của một vật đen phát sáng ở nhiệt độ cho trước.

Mô tả chi tiết

Đèn điểm, đèn nón, đèn hướng, ánh sáng nền, bóng đổ từ vật chắn, normal map, đèn theo vật lý.

Thông tin về Enumeration Type

◆ light_kind

Loại đèn.

Enumerator
light_point 

Đèn điểm: tỏa đều mọi hướng từ transform.pos, tối dần theo khoảng cách.

light_spot 

Đèn nón (đèn pin, đèn sân khấu): chỉ sáng trong một góc quanh hướng angle.

light_directional 

Đèn hướng (mặt trời, trăng): sáng đều cả cảnh, từ một hướng, không có vị trí.

◆ light_falloff

Đường cong tối dần theo khoảng cách của đèn điểm và đèn nón.

Enumerator
falloff_physical 

Theo vật lý: độ sáng giảm theo nghịch đảo bình phương khoảng cách, 1 / (1 + (d / size)^2), rồi cắt mượt về 0 ở radius để đèn có vùng sáng hữu hạn.

size là kích thước nguồn sáng: đúng bằng khoảng cách mà độ sáng còn một nửa. Lõi đèn sáng gắt, rìa tối nhanh, như đèn thật.

falloff_linear 

Giảm tuyến tính từ tâm đến radius. Dễ đoán nhất.

falloff_smooth 

Giảm mượt, phẳng ở tâm, tắt hẳn ở radius. Kiểu quầng sáng cổ điển.

falloff_none 

Sáng đều trong radius rồi tắt hẳn ở rìa. Hợp với vùng sáng cố định.

◆ light_tonemap

Cách nén ánh sáng HDR về màn hình. Đều chạy sau độ phơi sáng (lighting_desc::exposure).

Enumerator
tonemap_shoulder 

Giữ nguyên các tông dưới 0.6, chỉ ép mượt phần sáng hơn về 1.

Màu pixel art ở chỗ vừa sáng không bị đổi, nên dễ dùng nhất. Mặc định.

tonemap_reinhard 

x / (1 + x): đơn giản, mềm, nhưng làm cả cảnh nhạt và tối đi.

tonemap_aces 

ACES filmic (xấp xỉ của Narkowicz): tương phản điện ảnh, bão hòa vừa. Nên đặt exposure cao hơn.

Thông tin về hàm

◆ light_occluder_box()

light_occluder njin::light_occluder_box ( vec2 size,
vec2 origin = {0.5f, 0.5f} )
inline

Vật chắn hình chữ nhật.

Các tham số
sizeKích thước (rộng, cao).
originĐiểm neo tính theo tỉ lệ kích thước, như sprite::origin: {0.5, 1} là giữa đáy, hợp với gốc cây.
Giá trị trả về
Vật chắn hình chữ nhật.

◆ light_occluder_ellipse()

light_occluder njin::light_occluder_ellipse ( vec2 radii,
vec2 center = {0.0f, 0.0f},
i32 segments = 16 )
inline

Vật chắn hình elip (đa giác đều đủ nhiều cạnh).

Hình tròn khi hai bán kính bằng nhau.

Các tham số
radiiBán kính theo hai trục.
centerTâm, tính từ điểm neo của entity.
segmentsSố cạnh, từ 3. Nhiều cạnh thì tròn hơn nhưng đèn tốn hơn.
Giá trị trả về
Vật chắn.

◆ light_occluder_circle()

light_occluder njin::light_occluder_circle ( f32 radius,
vec2 center = {0.0f, 0.0f},
i32 segments = 16 )
inline

Vật chắn hình tròn.

Các tham số
radiusBán kính.
centerTâm, tính từ điểm neo của entity.
segmentsSố cạnh, từ 3.
Giá trị trả về
Vật chắn.

◆ light_occluder_capsule()

light_occluder njin::light_occluder_capsule ( vec2 a,
vec2 b,
f32 radius,
i32 arc_segments = 6 )
inline

Vật chắn hình viên thuốc (capsule): đoạn thẳng từ a đến b phình ra radius.

Hợp với người đứng, thân cây, cột: dài mà tròn hai đầu.

Các tham số
aTâm đầu thứ nhất, tính từ điểm neo của entity.
bTâm đầu thứ hai.
radiusBán kính.
arc_segmentsSố cạnh mỗi nửa vòng tròn ở hai đầu.
Giá trị trả về
Vật chắn.

◆ light_occluder_line()

light_occluder njin::light_occluder_line ( std::vector< vec2 > points)
inline

Vật chắn là một đường gấp khúc mỏng, chắn cả hai phía: tường, hàng rào, mép vách.

Các tham số
pointsCác điểm theo thứ tự, ít nhất 2.
Giá trị trả về
Vật chắn mở.

◆ light_occluders_from_tiles()

std::vector< light_occluder > njin::light_occluders_from_tiles ( const tilemap & map,
const std::function< bool(i32 tile)> & solid,
f32 simplify = 0.0f )

Viền các ô đặc của một tilemap thành các vật chắn, để tường và vách chặn sáng.

Chỉ những cạnh giữa ô đặc và ô không đặc mới thành viền, và các cạnh thẳng hàng được nối lại, nên một khối tường lớn chỉ có vài cạnh. Kết quả tính từ gốc của tilemap: gắn mỗi vật chắn vào một entity có transform của tilemap. Tính lại khi tilemap đổi (đào tường, mở cửa).

Các tham số
mapTilemap.
solidCho biết ô (số thứ tự trong tileset, không kèm bit lật) có chắn sáng không.
simplifyLàm trơn, tính bằng ô; 0 là giữ nguyên.
Giá trị trả về
Các vật chắn đóng (một vòng cho mỗi khối liền và mỗi lỗ trong khối).

◆ lighting_set()

void njin::lighting_set ( context & ctx,
const lighting_desc & desc )

Đặt cài đặt ánh sáng.

Đổi mỗi frame được (ví dụ ambient theo giờ trong ngày).

Các tham số
ctxContext của engine.
descCài đặt mới.

◆ lighting_get()

lighting_desc njin::lighting_get ( const context & ctx)

Cài đặt ánh sáng đang dùng.

Sửa bản sao rồi lighting_set() lại.

Các tham số
ctxContext của engine.
Giá trị trả về
Cài đặt hiện tại.

◆ light_color_kelvin()

rgba njin::light_color_kelvin ( f32 kelvin)

Màu của một vật đen phát sáng ở nhiệt độ cho trước.

Dùng để đặt light_2d::color hoặc để tô màu ambient (bình minh 3500, trưa 6500, trăng lạnh 9000). Xấp xỉ trong khoảng 1000 đến 40000 kelvin.

Các tham số
kelvinNhiệt độ màu.
Giá trị trả về
Màu (alpha là 1), đã chuẩn hóa để kênh sáng nhất bằng 1.