Hướng dẫn sử dụng Shader trong Cocos2d-x (P2)

Tram Ho

Ở phần này mình sẽ tiếp tục đưa ra một vài công thức để làm hiệu ứng cho image bằng shader. Các bạn có thể đọc phần 1 tại đây

E04: Grayscale

Đây là một vài vd đơn giản khác:

Full Code file .vsh:

Full code file .fsh:

Các thuột tính và loại biến mình có giải thích ở phần 1 rồi, các bạn có thể quay lại bài trước của mình để tham khảo.

Vd này đơn thuần chỉ giới thiệu thêm công thức trộn màu mà thôi:

E05: Chromatic

Hiệu ứng CHROMATIC ABERRATIONS – (QUANG SAI) là gì?

Quang sai hay chính xác hơn là sắc sai – Chromatic Aberration trên ống kính là hiện tượng ánh sáng trắng sau khi đi qua thấu kính bị sai lệch biến thành 1 chùm sáng với phân bố từ đỏ đến tím.

Nếu đọc định nghĩa xong mà các bạn méo hiểu thì thì okay thôi, vì mình cũng vậy =))).
Theo cảm nhận của mình thì hiệu ứng này là méo màu, mình hay thấy mấy cái hiệu ứng này trong mấy cái game kinh dị ấy

Full Code file .vsh:

Full code file .fsh:

Ở đây mình sẽ thực hiện 2 bước.

B1: mình sẽ tạo ra một bức ảnh biến dạng từ bức ảnh cũ (có thể dựa vào sin, cos, hoặc chỉnh offset bức ảnh đều ok).

Lưu ý, nếu các bạn chưa hình dung bức ảnh méo mó bằng công thức trên như thế nào thì các bạn có thể chỉnh lại code như sau: texture2D(CC_Texture0, uv + vec2(wave*sin(1.0*t + uv.y*5.0), 0.0)); ---->> texture2D(CC_Texture0, vec2(wave*sin(1.0*t + uv.y*5.0), 0.0));

B2: Mình trộn màu bức ảnh gốc và bức ảnh méo mó.

B3: Ta-ra, chúng ta đã có được hiệu ứng Chromatic, T__T.

Vd mình đưa ở đây chỉ là cơ bản nên không được như hình ở trên, để làm được như ở trên mình cần thêm 1 NoiseTexture nữa.

Mình sẽ hướng dẫn các bạn xử dụng thêm các Texture để làm ra nhiều hiệu ứng khác sau, hiện tại thì mình chỉ đang đi các phần trộn cơ bản nhất trong bài viết này.

Exercises

Thử nghiệm thêm nhiều cách biến dạng khác.

Thử kết hợp nhiều công thức trộn màu khác.

E06: Shadow

Lưu ý là bạn không thể đổ bóng ra bên ngoài của sprite nên hãy chắc chắn là nó có đủ vùng trống trong bức ảnh cho bất kì hiệu ứng nào mà bạn muốn thêm nhé lên nhé.

ở đây biến shadowOffset dùng để chỉnh độ lệch của bóng, các bạn có thể thử thay đổi giá trị của biến này để test thử nhé. Bây giờ mình sẽ nói ý tưởng chính hiệu ứng này. Các bạn để ý func sau:

ở đây mình sẽ nhận 2 param là 2 màu: over là màu của bức ảnh truyền vào và under là màu của bóng truyền vào.

  • Nếu bức ảnh tại vị trí này có màu (tức là alpha = 1) thì nó sẽ sẽ trả về màu của bức ảnh hiện tại.
  • Nếu bức ảnh này tại vị trí này không có màu tức over = (0, 0, 0, 0) thì nó sẽ trả ra màu của bóng (ở đây là under).

Okay, như vậy mình sẽ tóm tắt ý tưởng của func này như sau:

B1) chúng ta sẽ dựa vào alpha của bức ảnh và dựa vào shadowOffset để tạo ra 1 lớp bóng.

B2) chúng ta sẽ xét: nếu vị trí này của bức ảnh là có màu thì sẽ trả về màu.

Nếu vị trí này ko có màu (alpha = 0) và vùng này nằm trong vùng đổ bóng thì trả về bóng.

Nếu ko nằm trong cả 2 thì trả về không màu. (tại vì over và under đều là 0 màu nên biểu thức over + (1.0 - over.a)*under cũng trả về 0 màu).

Exercises:

Hãy thử vẽ một lớp màu thay vì bóng bên dưới.

Mình xin tạm dừng phần này ở đây,, chúng ta sẽ quay lại với hiệu ứng khác ở phần tiếp

Chia sẻ bài viết ngay

Nguồn bài viết : Viblo