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
Shader

Nạp shader, đặt uniform (kể cả mảng), gắn ảnh phụ, bật và tắt shader khi vẽ. Tiếp...

Các hàm

shader_handle njin::shader_load (context &ctx, const char *vspath, const char *fspath)
 Nạp và biên dịch một shader.
void njin::shader_unload (context &ctx, shader_handle handle)
 Giải phóng shader.
void njin::shader_begin (const context &ctx, shader_handle handle)
 Bật shader cho mọi thứ vẽ sau đó, cho đến shader_end().
void njin::shader_end (const context &ctx)
 Tắt shader đã bật bằng shader_begin().
void njin::shader_set_i32 (context &ctx, shader_handle handle, const char *name, i32 value)
 Đặt uniform kiểu int.
void njin::shader_set_f32 (context &ctx, shader_handle handle, const char *name, f32 value)
 Đặt uniform kiểu float.
void njin::shader_set_vec2 (context &ctx, shader_handle handle, const char *name, vec2 value)
 Đặt uniform kiểu vec2.
void njin::shader_set_vec3 (context &ctx, shader_handle handle, const char *name, vec3 value)
 Đặt uniform kiểu vec3.
void njin::shader_set_vec4 (context &ctx, shader_handle handle, const char *name, vec4 value)
 Đặt uniform kiểu vec4.
void njin::shader_set_vec4_array (context &ctx, shader_handle handle, const char *name, const vec4 *values, u32 count)
 Đặt uniform kiểu mảng vec4, ví dụ uniform vec4 lights[8];.
void njin::shader_set_texture (context &ctx, shader_handle handle, const char *name, texture_handle texture)
 Gắn một texture vào uniform sampler2D của shader, ngoài texture0.
void njin::shader_set_texture (context &ctx, shader_handle handle, const char *name, render_texture_handle texture)
 Như bản trên, với một render texture.

Mô tả chi tiết

Nạp shader, đặt uniform (kể cả mảng), gắn ảnh phụ, bật và tắt shader khi vẽ.

Thông tin về hàm

◆ shader_load()

shader_handle njin::shader_load ( context & ctx,
const char * vspath,
const char * fspath )

Nạp và biên dịch một shader.

Một trong hai đường dẫn có thể là nullptr để giữ stage mặc định của raylib. Handle không hợp lệ hoặc đã unload bị mọi hàm shader bỏ qua.

Các tham số
ctxContext của engine.
vspathĐường dẫn vertex shader, hoặc nullptr.
fspathĐường dẫn fragment shader, hoặc nullptr.
Giá trị trả về
Handle của shader, hoặc handle có id 0 nếu file thiếu hoặc biên dịch lỗi.

◆ shader_unload()

void njin::shader_unload ( context & ctx,
shader_handle handle )

Giải phóng shader.

Handle không hợp lệ bị bỏ qua.

Các tham số
ctxContext của engine.
handleShader cần giải phóng.

◆ shader_begin()

void njin::shader_begin ( const context & ctx,
shader_handle handle )

Bật shader cho mọi thứ vẽ sau đó, cho đến shader_end().

Phải gọi giữa lúc bắt đầu và kết thúc vẽ của frame. Đặt uniform trước khi gọi hàm này.

Các tham số
ctxContext của engine.
handleShader cần bật.

◆ shader_end()

void njin::shader_end ( const context & ctx)

Tắt shader đã bật bằng shader_begin().

Các tham số
ctxContext của engine.

◆ shader_set_i32()

void njin::shader_set_i32 ( context & ctx,
shader_handle handle,
const char * name,
i32 value )

Đặt uniform kiểu int.

Uniform không tồn tại chỉ được ghi cảnh báo một lần rồi bị bỏ qua.

Các tham số
ctxContext của engine.
handleShader cần đặt.
nameTên uniform trong shader.
valueGiá trị.

◆ shader_set_f32()

void njin::shader_set_f32 ( context & ctx,
shader_handle handle,
const char * name,
f32 value )

Đặt uniform kiểu float.

Xem shader_set_i32() về uniform không tồn tại.

Các tham số
ctxContext của engine.
handleShader cần đặt.
nameTên uniform trong shader.
valueGiá trị.

◆ shader_set_vec2()

void njin::shader_set_vec2 ( context & ctx,
shader_handle handle,
const char * name,
vec2 value )

Đặt uniform kiểu vec2.

Xem shader_set_i32() về uniform không tồn tại.

Các tham số
ctxContext của engine.
handleShader cần đặt.
nameTên uniform trong shader.
valueGiá trị.

◆ shader_set_vec3()

void njin::shader_set_vec3 ( context & ctx,
shader_handle handle,
const char * name,
vec3 value )

Đặt uniform kiểu vec3.

Xem shader_set_i32() về uniform không tồn tại.

Các tham số
ctxContext của engine.
handleShader cần đặt.
nameTên uniform trong shader.
valueGiá trị.

◆ shader_set_vec4()

void njin::shader_set_vec4 ( context & ctx,
shader_handle handle,
const char * name,
vec4 value )

Đặt uniform kiểu vec4.

Xem shader_set_i32() về uniform không tồn tại.

Các tham số
ctxContext của engine.
handleShader cần đặt.
nameTên uniform trong shader.
valueGiá trị.

◆ shader_set_vec4_array()

void njin::shader_set_vec4_array ( context & ctx,
shader_handle handle,
const char * name,
const vec4 * values,
u32 count )

Đặt uniform kiểu mảng vec4, ví dụ uniform vec4 lights[8];.

count không được lớn hơn kích thước mảng khai báo trong shader. Muốn truyền mảng vec2 hoặc vec3, đóng vào vec4 (hai vec2 một phần tử). Xem shader_set_i32() về uniform không tồn tại.

Các tham số
ctxContext của engine.
handleShader cần đặt.
nameTên mảng trong shader, không kèm [0].
valuesCác phần tử, nằm liền nhau trong bộ nhớ.
countSố phần tử. 0 thì không làm gì.

◆ shader_set_texture() [1/2]

void njin::shader_set_texture ( context & ctx,
shader_handle handle,
const char * name,
texture_handle texture )

Gắn một texture vào uniform sampler2D của shader, ngoài texture0.

Dùng cho ảnh phụ mà shader đọc: bảng màu (LUT), nhiễu, mặt nạ, normal map. Mỗi shader nhận tối đa 4 ảnh phụ; đặt lại cùng tên thì thay ảnh. Ảnh được gắn mỗi khi shader bật (shader_begin(), camera_set_post_shader(), draw_instanced(), và các hình 3D vẽ bằng shader của game), nên gọi hàm này một lần là đủ. Ảnh nạp lại khi hot reload thì shader thấy ảnh mới.

  • Dùng ảnh riêng, từ texture_load(). Ảnh xếp trong atlas bị từ chối, vì shader sẽ thấy cả trang atlas chứ không phải riêng ảnh đó.
  • Ảnh phụ không có bộ lọc riêng cho từng shader: nó lấy mẫu theo texture_set_filter() của chính ảnh.
  • Đường đáng tin cậy nhất: shader hậu kỳ của camera_set_post_shader(), và draw_instanced(). Qua shader_begin() thì ảnh phụ chỉ sống đến lần raylib đẩy batch kế tiếp (đầy 8192 hình, hoặc 256 lần đổi texture, hoặc có draw_instanced() hay đổi render texture xen vào); dùng cho vài lệnh vẽ, không cho hàng nghìn sprite.
    Các tham số
    ctxContext của engine.
    handleShader cần đặt.
    nameTên uniform sampler2D trong shader.
    textureẢnh cần gắn.

◆ shader_set_texture() [2/2]

void njin::shader_set_texture ( context & ctx,
shader_handle handle,
const char * name,
render_texture_handle texture )

Như bản trên, với một render texture.

Đừng gắn render texture đang được vẽ vào (giữa render_texture_begin() và render_texture_end()). Render texture lưu ngược trục dọc: shader cần lật v (1.0 - v) để đọc đúng chiều.

Các tham số
ctxContext của engine.
handleShader cần đặt.
nameTên uniform sampler2D trong shader.
textureRender texture cần gắn.