[Shader] Part 3.1: Bonus Q.A

Với những người mới, họ ham tìm hiểu, chắc chắn sẽ có rất rất nhiều câu hỏi được đặt ra. Tôi không hiểu cái này, chưa hiểu rõ cái kia, tại sao lại đặt biến như thế này…

Vậy nên tôi rành riêng ra một part nhỏ để đưa ra những câu hỏi mà lúc đầu tôi vẫn luôn băn khoăn.

Các bạn cũng có thể tự mình đặt câu hỏi, tôi sẽ trả lời hết trong tầm hiểu biết của tôi.


Khai báo biến tận 2 lần?

Như trong #part 3, tôi có khai báo một biến trong Properties

_Color (“My Color”, Color) = (1, 1, 1, 1)

<tên biến> (“<tên hiển thị>“, <kiểu dữ liệu>) = <giá trị mặc định>

Nhưng bản chất việc khai báo ở Properties chỉ để hiển thị ra ngoài Inspector của Material (giống như một biến public trong c# vậy). Đây là cấu trúc của shaderlab.

uniform fixed4 _Color;

uniform <kiểu dữ liệu> <tên biến> ;

Ta phải khai báo ở trong CGPROGRAM, để có thể sử dụng nó như một biến cục bộ trong CG code.


POSITION, SV_POSITION là cái gì?

Đó là những Semantic, bản chất của nó là gì? (theo Unitymsdn)

Semantic cho chúng ta biết loại dữ liệu chúng ta sử dụng cho đối tượng được khai báo là gì. 
Và nó sẽ báo với máy tính mục đích sử dụng của đối tượng đó.

POSITION: position của vertex trong local space (model space)
SV_POSITION: position của vertex sau khi được đưa tới projection space (screen space)

Reference Articlelink


float4 là gì? … (x, y, z, w?)

Chúng ta có thể quen thuộc với Vector2, Vector3 với 3 đại lượng x, y, z … nhưng còn float4? đại lượng w?

float4 có thể dùng làm kiểu dữ liệu thể hiện vector (vị trí, hướng) hoặc texture coordinates (tọa độ texture), light configuration (cấu hình nguồn sáng). Hay là color channel (4 kênh màu r, g, b, a)…

Với color channel thì khá là dễ hiểu rồi, còn các cái còn lại thì sao? Ta sẽ nói về light configuration, texture coordinates sau…

Tôi đã mất hàng giờ đồng hồ để google về nó … Và rồi vẫn phải hỏi tiền bối đi trước… Lão search trong vòng 1 phút … omg im so noob !!!

Đại lượng w của vector:

Hm… trong hệ tọa độ thuần nhất (homogeneous coordinates), đại lượng thứ 4 (w) được sinh ra để thực hiện các phép biến hình (transformation), phép quay (rotation), phép vị tự (scaling), …

  • Nếu w = 1, đại diện cho vị trí (position) trong không gian
  • Nếu w = 0, đại diện cho hướng (direction) – direction vector

Vậy nếu w khác 0 và 1 thì sao?

projector_xyw

Khi thay đổi x, y, z ta sẽ thay đổi tọa độ (vị trí) của bức ảnh. Vậy còn w ?

w là khoảng cách từ projector tới screen

Hay trong trường hợp bức ảnh trên, nó là khoảng cách từ projector tới bức ảnh. Khi ta thay đổi w, tọa độ của bức ảnh sẽ không bị ảnh hưởng. Mà chỉ ảnh hưởng đến size (scale).

Có thể dễ dàng nhận ra, nếu thay đổi w ngắn lại – bức ảnh sẽ to ra, nếu w dài ra – bức ảnh sẽ nhỏ lại.

Ta sẽ xem một ví dụ khác, với đối tượng là một point (x, y) = (15, 21) với w = 3

( x, y, z, w ) sẽ tương đương ( x/w, y/w, z/w ) trong 3D space với w = 1

Ta thực hiện kéo w về bằng 1, point (x, y, w) = (15, 21, 3) sẽ tương đương point (x, y) = (5, 7)

Reference Article – link1link2


UNITY_MATRIX_MVP ?

Trong hầu hết các vertex/fragment shader, đều phải có dòng code sau:

——-o.pos = mul(UNITY_MATRIX_MVP, i.vertex);

Bản chất của dòng code này là đưa đối tượng từ object space -> screen space.

Vậy nó hoạt động ra sao? Làm sao để đưa đối tượng từ object space -> screen space?

Nào cùng nhìn ảnh dưới đây, cho dễ tưởng tượng:

ogl_vertex_life

Đối tượng lúc mới khởi tạo, sẽ nằm trong object space. Khi ta dùng hàm mul() nhân với UNITY_MATRIX_MVP, bản chất là nhân lần lượt với Model matrix, View matrix, Projection matrix.

Sau khi qua Projection matrix, đối tượng của chúng ta sẽ nằm ở screen space.

Reference Articlelink


Các hệ tọa độ 3D (3D coordinates system)

  1. object space (aka. local space, model space)
  2. world space
  3. camera space (aka. view space, eye space)
  4. screen space (aka. projection space, clip space)
Advertisements

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s

Blog at WordPress.com.

Up ↑

%d bloggers like this: