Cẩm nang tra cứu các biến và hàm nội tại trong Unity Shader

Hàm và Biến hệ thống cơ bản

Trong quá trình phát triển Shader, Unity cung cấp sẵn một bộ các hàm và biến hỗ trợ giúp tối ưu hóa hiệu suất và đảm bảo tính tương thích đa nền tảng.

Hàm/Biến Mô tả chi tiết
UNITY_INITIALIZE_OUTPUT(type, name) Khởi tạo giá trị mặc định cho cấu trúc dữ liệu đầu ra. Cần thiết để vượt qua trình biên dịch HLSL ở một số nền tảng khắt khe khi có dữ liệu chưa khởi tạo.
TRANSFORM_TEX(uv, _TexName) Thực hiện tính toán Tiling và Offset cho tọa độ UV dựa trên thuộc tính của Texture trong Inspector.
UnityWorldSpaceLightDir(worldPos) Tính toán vector hướng từ vị trí đỉnh trong không gian thế giới đến nguồn sáng.

Thông số Camera và Màn hình

1. Built-in Render Pipeline

Biến Kiểu dữ liệu Mô tả
_WorldSpaceCameraPos float3 Tọa độ vị trí của Camera chính trong không gian thế giới.
UnityWorldSpaceViewDir(worldPos) float3 Vector hướng từ điểm đang xét đến vị trí Camera.
_ScreenParams float4 Thông số màn hình (x: width, y: height, z: 1 + 1/width, w: 1 + 1/height).

2. Universal Render Pipeline (URP)

Trong URP, các biến thường được đóng gói để tối ưu hơn cho thiết bị di động:

  • _ZBufferParams: Tham số dùng để giải mã giá trị từ Depth Buffer, chứa thông tin Near và Far clip planes.
  • _CameraDepthTexture: Texture chứa thông tin độ sâu (cần kích hoạt Depth Texture trong Pipeline Asset).
  • _ScaledScreenParams: Tương tự như ScreenParams nhưng đã tính đến tỉ lệ Render Scale.

Dữ liệu Thời gian (Time)

Biến _Time là công cụ chính để tạo các hiệu ứng chuyển động hoặc biến đổi theo thời gian thực.

Biến Thành phần (x, y, z, w)
_Time t/20, t, t*2, t*3 (với t là thời gian tính bằng giây)
_SinTime sin(t/8), sin(t/4), sin(t/2), sin(t)
unity_DeltaTime dt, 1/dt, smoothDt, 1/smoothDt

Ma trận biến đổi không gian

Ma trận cơ bản (Built-in)

  • UNITY_MATRIX_MVP: Chuyển đổi trực tiếp từ Model sang Projection Space.
  • unity_ObjectToWorld: Chuyển đổi từ Local sang World Space.
  • unity_WorldToObject: Chuyển ngược từ World về Local Space.

Hàm biến đổi trong URP

URP khuyến khích sử dụng các hàm thay vì gọi trực tiếp ma trận để đảm bảo tính bao đóng:

// Chuyển vị trí từ Local sang World
float3 positionWS = TransformObjectToWorld(input.positionOS);

// Chuyển vị trí sang không gian cắt (Clip Space)
float4 positionCS = TransformWorldToHClip(positionWS);

// Biến đổi pháp tuyến (Normal) sang World Space
float3 normalWS = TransformObjectToWorldNormal(input.normalOS);

Phép toán mô hình chiếu sáng (Lighting Models)

Mô hình Lambert (漫反射)

Tính toán tán xạ ánh sáng trên bề mặt nhám:

// Công thức cơ bản
float diffuseTerm = saturate(dot(normalDir, lightDir));
float3 finalDiffuse = _LightColor0.rgb * _Albedo.rgb * diffuseTerm;

Mô hình Blinn-Phong (高光)

Sử dụng vector nửa góc (Half-vector) để tính toán phản chiếu nhạy bén hơn:

float3 viewDir = normalize(_WorldSpaceCameraPos - worldPos);
float3 halfVec = normalize(lightDir + viewDir);
float specTerm = pow(saturate(dot(normalDir, halfVec)), _Glossiness);
float3 finalSpecular = _LightColor0.rgb * _SpecColor.rgb * specTerm;

Shader Tags và Render Queue

Thứ tự hiển thị (Render Queue)

Xác định trình tự vẽ của các đối tượng trên màn hình:

Queue Tag Giá trị Ứng dụng
"Queue"="Background" 1000 Vẽ đầu tiên, thường dùng cho Skybox.
"Queue"="Geometry" 2000 Mặc định cho các vật thể đặc (Opaque).
"Queue"="AlphaTest" 2450 Dành cho vật thể dùng kỹ thuật cắt bỏ pixel (Cutout).
"Queue"="Transparent" 3000 Vẽ từ sau ra trước cho vật thể bán trong suốt.

Chế độ chiếu sáng (LightMode)

  • UniversalForward: Chế độ chính trong URP, xử lý toàn bộ ánh sáng trong một Pass.
  • ShadowCaster: Pass đặc biệt dùng để render vật thể vào Shadow Map.
  • DepthOnly: Chỉ ghi dữ liệu độ sâu, thường dùng cho các hiệu ứng hậu kỳ (Post-processing).

GPU Instancing

Kỹ thuật giúp vẽ nhiều bản sao của cùng một Mesh với các thuộc tính vật liệu khác nhau trong một Draw Call duy nhất.

  1. Thêm #pragma multi_compile_instancing.
  2. Sử dụng cấu trúc UNITY_VERTEX_INPUT_INSTANCE_ID trong dữ liệu đầu vào.
  3. Bao bọc các thuộc tính tùy chỉnh trong block UNITY_INSTANCING_BUFFER_START(Props).
  4. Truy cập thuộc tính bằng UNITY_ACCESS_INSTANCED_PROP.

Thẻ: Unity ShaderLab HLSL URP graphics-programming

Đăng vào ngày 26 tháng 7 lúc 19:48