Cú pháp cơ bản của GLSL trong OpenGL ES

Kiểu dữ liệu cơ bản: bool, int, uint, float, double
Kiểu vector:

Trong ngôn ngữ GLSL (OpenGL Shading Language), có nhiều kiểu vector khác nhau để biểu diễn các số lượng thành phần và dữ liệu khác nhau. Dưới đây là một số kiểu vector phổ biến trong GLSL:

  1. Kiểu vector số thực:
  • vec2: Vector chứa hai thành phần số thực.
  • vec3: Vector chứa ba thành phần số thực.
  • vec4: Vector chứa bốn thành phần số thực.
  1. Kiểu vector số nguyên:
  • ivec2: Vector chứa hai thành phần số nguyên.
  • ivec3: Vector chứa ba thành phần số nguyên.
  • ivec4: Vector chứa bốn thành phần số nguyên.
  1. Kiểu vector Boolean:
  • bvec2: Vector chứa hai giá trị Boolean.
  • bvec3: Vector chứa ba giá trị Boolean.
  • bvec4: Vector chứa bốn giá trị Boolean.
  1. Kiểu vector số thực độ chính xác kép:
  • dvec2: Vector chứa hai thành phần số thực độ chính xác kép.
  • dvec3: Vector chứa ba thành phần số thực độ chính xác kép.
  • dvec4: Vector chứa bốn thành phần số thực độ chính xác kép.

Các kiểu vector này được sử dụng để xử lý các loại dữ liệu khác nhau như vị trí, hướng, màu sắc, tọa độ texture, v.v. Tùy theo nhu cầu để chọn kiểu vector phù hợp, nhằm biểu diễn và thao tác dữ liệu hiệu quả.

Ví dụ sử dụng kiểu vector số thực:
vec2 toaDo2D = vec2(0.0, 1.0);
vec3 mauSac = toaDo2D.xxy;      // mauSac = (0.0, 0.0, 1.0)
vec4 viTri = vec4(mauSac.zyx, 0.1); // viTri = (1.0, 0.0, 0.0, 0.1)
vec4 duLieu = vec4(toaDo2D, 0.1, 0.2); // duLieu = (0.0, 1.0, 0.1, 0.2)
Kiểu ma trận:
  1. Kiểu ma trận số thực:
  • mat2: Ma trận 2x2 số thực.
  • mat3: Ma trận 3x3 số thực.
  • mat4: Ma trận 4x4 số thực.

Ví dụ:

mat2 chuyenVi = mat2(1.0, 2.0, 3.0, 4.0);
// Tạo một ma trận 2x2, (1.0, 2.0) là cột đầu tiên, (3.0, 4.0) là cột thứ hai.
Kiểu texture:
  1. Kiểu texture 2D:
  • sampler2D: Kiểu dùng để lấy mẫu giá trị màu từ texture 2D.
  • sampler2DShadow: Kiểu dùng để lấy mẫu texture độ sâu.
  1. Kiểu texture 3D:
  • sampler3D: Kiểu dùng để lấy mẫu giá trị màu từ texture 3D.
  1. Kiểu texture lập phương:
  • samplerCube: Kiểu dùng để lấy mẫu giá trị màu từ texture lập phương.

Ví dụ:

uniform sampler2D mauTexture; // Khai báo một bộ lấy mẫu texture 2D

Cấu trúc: Tương tự như cấu trúc trong ngôn ngữ C. Mảng: Tương tự như mảng trong ngôn ngữ C, nhưng trong GLSL chỉ có thể sử dụng mảng một chiều.

Trên đây là ví dụ về việc khai báo một bộ lấy mẫu màu từ texture 2D. Trong thực tế, kiểu texture được sử dụng rộng rãi trong đồ họa để render texture, hiệu ứng đổ bóng, tạo vật liệu phức tạp, v.v.

Hạn định biến

Các hạn định biến phổ biến:

  1. uniform:
  • Biến uniform có tầm nhìn toàn cục trong suốt chương trình shader, và được truyền từ CPU sang GPU. Thường dùng để truyền các giá trị hằng số, texture hoặc tham số ánh sáng, v.v.
  1. attribute:
  • Biến attribute chỉ có thể sử dụng trong vertex shader, dùng để biểu diễn dữ liệu đặc trưng của mỗi đỉnh như vị trí đỉnh, màu sắc, v.v.
  1. varying:
  • Biến varying dùng để truyền dữ liệu giữa vertex shader và fragment shader. Biến này được gán giá trị trong vertex shader và nhận giá trị trong fragment shader.
  1. const:
  • Hạn định const dùng để khai báo một hằng số không thể thay đổi tại thời điểm biên dịch.
  1. inout:
  • Hạn định inout dùng để truyền dữ liệu giữa các giai đoạn shader. in dùng cho dữ liệu đầu vào, out dùng cho dữ liệu đầu ra.
  1. layout:
  • Hạn định layout dùng để chỉ định thông tin bố cục của biến như căn chỉnh bộ nhớ, chỉ số buffer đối tượng đỉnh, v.v. Ví dụ:
// Khai báo biến ma trận uniform
uniform mat4 maTranModelViewProjection;

// Khai báo biến attribute vị trí đỉnh
attribute vec3 viTriDinh;

// Khai báo biến varying màu sắc, dùng để truyền dữ liệu màu giữa vertex shader và fragment shader
varying vec4 mauSacFragment;

// Khai báo hằng số
const float SO_PI = 3.14159;

// Khai báo biến đầu vào, và chỉ định vị trí qua layout
layout(location = 0) in vec3 viTriDinhShader;

// Khai báo biến đầu ra, và chỉ định vị trí qua layout
layout(location = 0) out vec4 mauSacFragmentShader;

Kiểm soát luồng: Kiểm soát luồng tương tự như ngôn ngữ C, có if else, switch case, for, while, do while.

Hàm: Định nghĩa hàm tương tự như ngôn ngữ C, điểm bắt đầu thực thi shader cũng là hàm main().

Biến dựng sẵn thông dụng trong GLSL:

  1. Biến dựng sẵn trong vertex shader:
  • gl_Position: Biến dựng sẵn trong vertex shader biểu diễn vị trí đỉnh.
  • gl_VertexID: Chỉ số của đỉnh hiện tại.
  • gl_PointSize: Điều khiển kích thước điểm.
  1. Biến dựng sẵn trong fragment shader:
  • gl_FragCoord: Biểu diễn tọa độ của fragment hiện tại trong không gian màn hình.
  • gl_FragColor: Biến trong fragment shader dùng để đặt màu sắc đầu ra.
  • gl_FragDepth: Đặt giá trị độ sâu của fragment.
  1. Biến dựng sẵn trong geometry shader:
  • gl_in[]: Mảng biến đầu vào của geometry shader.
  • gl_out[]: Mảng biến đầu ra của geometry shader.
  • gl_PrimitiveID: ID của primitive hiện tại.
  1. Biến uniform:
  • gl_ModelViewProjectionMatrix: Ma trận mô hình-xem-projection.
  • gl_NormalMatrix: Ma pháp tuyến.

Hàm dựng sẵn

Hàm lượng giác

Các hàm lượng giác trong GLSL cung cấp các phép toán toán học cơ bản cho đồ họa:

  • radians(degrees): Chuyển đổi từ độ sang radian.
  • degrees(radians): Chuyển đổi từ radian sang độ.
  • sin(angle): Tính sin của góc.
  • cos(angle): Tính cos của góc.
  • tan(angle): Tính tan của góc.
  • asin(x): Tính arcsin của x.
  • acos(x): Tính arccos của x.
  • atan(y, x): Tính atan của y/x.
  • sinh(x): Tính hyperbolic sin của x.
  • cosh(x): Tính hyperbolic cos của x.
  • tanh(x): Tính hyperbolic tan của x.
Hàm mũ và logarithm

Các hàm này thực hiện các phép toán mũ và logarithm:

  • pow(x, y): Tính x mũ y.
  • exp(x): Tính e mũ x.
  • log(x): Tính logarithm tự nhiên của x.
  • log2(x): Tính logarithm cơ số 2 của x.
  • log10(x): Tính logarithm cơ số 10 của x.
  • sqrt(x): Tính căn bậc hai của x.
  • inversesqrt(x): Tính 1/sqrt(x).
Hàn so sánh và làm tròn

Các hàm này thực hiện các phép toán so sánh và làm tròn:

  • round(x): Làm tròn x đến số nguyên gần nhất.
  • ceil(x): Làm tròn x lên trên đến số nguyên gần nhất.
  • floor(x): Làm tròn x xuống dưới đến số nguyên gần nhất.
  • trunc(x): Cắt phần thập phân của x.
  • mod(x, y): Tính phần dư của x/y.
  • min(x, y): Trả về giá trị nhỏ hơn giữa x và y.
  • max(x, y): Trả về giá trị lớn hơn giữa x và y.
  • clamp(x, min, max): Hạn chế x trong khoảng [min, max].
  • mix(x, y, a): Trộn giữa x và y với hệ số a.
  • step(edge, x): Trả về 0.0 nếu x < edge, ngược lại trả về 1.0.
  • smoothstep(edge0, edge1, x): Tương tự step nhưng có chuyển tiếp mượt mà.
Hàn xử lý vector

Các hàm này thực hiện các phép toán trên vector:

  • dot(u, v): Tính tích vô hướng của hai vector.
  • cross(u, v): Tính tích có hướng của hai vector 3D.
  • normalize(v): Chuẩn hóa vector.
  • length(v): Tính độ dài của vector.
  • distance(p0, p1): Tính khoảng cách giữa hai điểm.
  • faceforward(N, I, Ng): Định hướng vector N dựa trên vector I và Ng.
  • reflect(I, N): Tính vector phản xạ của I theo mặt phẳng có pháp tuyến N.
  • refract(I, N, eta): Tính vector khúc xạ của I theo mặt phẳng có pháp tuyến N với hệ số khúc xạ eta.
Hàn xử lý texture

Các hàm này thực hiện các phép lấy mẫu texture:

  • texture(sampler, coord): Lấy mẫu từ texture với tọa độ coord.
  • textureLod(sampler, coord, lod): Lấy mẫu với cấp độ chi tiết (LOD) cụ thể.
  • textureGrad(sampler, coord, dPdx, dPdy): Lấy mẫu với gradient.
  • textureProj(sampler, coord): Lấy mẫu với projection.

Thẻ: OpenGL glsl shader đồ họa di động lập trình đồ họa

Đăng vào ngày 23 tháng 7 lúc 15:07