Vulkan — API đa nền tảng và kết xuất là gì

Tác giả: IT Sectr Đã đăng: 2026-05-03 Thời gian đọc: 9 phút

Vulkan là API đa nền tảng cho đồ họa và tính toán trên GPU, được phát triển bởi tập đoàn Khronos Group. Vulkan cung cấp khả năng kiểm soát cấp thấp đối với phần cứng, tạo lệnh đa luồng và hiệu suất có thể dự đoán trước. Theo Khronos Group (2026), Vulkan được hỗ trợ trên 98% thiết bị Android hiện đại.

Những điểm chính

  • Vulkan — API GPU đa nền tảng với khả năng kiểm soát cấp thấp đối với phần cứng
  • VkDeviceVkQueue cho phép gửi lệnh đa luồng tới GPU
  • SPIR-V — định dạng shader nhị phân phổ quát được biên dịch từ GLSL và HLSL
  • Vulkan Memory Allocator quản lý việc cấp phát bộ nhớ GPU rõ ràng
  • Vulkan Ray Tracing (VK_KHR_ray_tracing) hỗ trợ dò tia bằng phần cứng

Vulkan là gì?

Vulkan là API cấp thấp, đa nền tảng để làm việc với các bộ xử lý đồ họa, được Khronos Group phát hành lần đầu vào năm 2016. Vulkan kế thừa OpenGL, cung cấp chi phí CPU thấp hơn đáng kể, hiệu suất có thể dự đoán trước và khả năng tạo lệnh đa luồng.

Không giống như OpenGL, nơi trình điều khiển thực hiện xác thực và đồng bộ hóa trên CPU, Vulkan đặt quản lý tài nguyên vào tay nhà phát triển. Cấp phát bộ nhớ, đồng bộ hóa qua semaphore và barrier, tạo pipeline — tất cả đều được kiểm soát rõ ràng. Cách tiếp cận này mang lại cải thiện hiệu suất lên tới 50% trong các kịch bản giới hạn CPU.

Vulkan được hỗ trợ trên Windows, Linux, Android, iOS (qua MoltenVK), macOS (MoltenVK), Nintendo Switch và máy chơi game. Theo Khronos Group (2026), API chạy trên các thiết bị có GPU từ NVIDIA, AMD, Intel, Qualcomm (Adreno), ARM (Mali) và Apple (qua lớp Metal). Vulkan 1.4 (2026) đã thêm hỗ trợ cho Mesh Shaders và Video Encode API.

Lịch sử của Vulkan

Ban đầu, Vulkan được phát triển dưới tên mã “glNext” — người kế nhiệm OpenGL. Vulkan 1.0 (2016) cung cấp API cơ bản với quản lý bộ nhớ rõ ràng, shader SPIR-V và hàng đợi đa luồng. Vulkan 1.1 (2018) thêm Subgroup Operations và hỗ trợ kiểu 16-bit. Vulkan 1.2 (2020) giới thiệu Buffer Device Address và Timeline Semaphores.

Vulkan 1.3 (2022) chuẩn hóa Dynamic Rendering và Graphics Pipeline Library. Vulkan 1.4 (2026) bắt buộc hỗ trợ Mesh Shaders và thêm Video Encode/Decode API để mã hóa phần cứng H.264/HEVC/AV1. Theo Khronos (2026), Vulkan 1.4 được hỗ trợ trên tất cả GPU NVIDIA RTX 50xx, AMD RX 9000 và Intel Arc B-series mới.

Kiến trúc Vulkan: thiết bị và hàng đợi

Kiến trúc Vulkan được xây dựng trên lớp trừu tượng hóa phần cứng (lớp HW). Ứng dụng tương tác với thiết bị vật lý (VkPhysicalDevice) thông qua thiết bị logic (VkDevice). Các lệnh được gửi đến hàng đợi (VkQueue), mỗi hàng đợi thuộc về một họ hàng đợi cụ thể (graphics, compute, transfer).

VkInstance, VkDevice và VkQueue

VkInstance là đối tượng gốc của Vulkan, lưu trữ thông tin về các lớp xác thực và tiện ích mở rộng. VkPhysicalDevice đại diện cho GPU vật lý và cho phép truy vấn các thuộc tính, vùng nhớ và họ hàng đợi của nó. VkDevice là thiết bị logic với các hàng đợi và tiện ích mở rộng được yêu cầu rõ ràng.

cpp
// Tạo thiết bị logic Vulkan
VkDeviceCreateInfo devInfo {};
devInfo.sType = VK_STRUCTURE_TYPE_DEVICE_CREATE_INFO;
devInfo.queueCreateInfoCount = 1;
 
float queuePriority = 1.0f;
VkDeviceQueueCreateInfo queueInfo {};
queueInfo.sType = VK_STRUCTURE_TYPE_DEVICE_QUEUE_CREATE_INFO;
queueInfo.queueFamilyIndex = 0;
queueInfo.queueCount = 1;
queueInfo.pQueuePriorities = &queuePriority;
devInfo.pQueueCreateInfos = &queueInfo;
 
VkDevice device;
vkCreateDevice(physicalDevice, &devInfo,
    nullptr, &device);
 
VkQueue queue;
vkGetDeviceQueue(device, 0, 0, &queue);

Hàm vkCreateDevice tạo một thiết bị logic với các hàng đợi đã chỉ định. VkQueue là handle hàng đợi để gửi lệnh. Một hàng đợi duy nhất có thể được sử dụng cho đồ họa, tính toán và sao chép nếu các cờ tương ứng được hỗ trợ bởi họ hàng đợi. Ưu tiên hàng đợi (0.0–1.0) ảnh hưởng đến thứ tự thực thi khi có tranh chấp.

VkMemory và VkBuffer — quản lý bộ nhớ

Trong Vulkan, bộ nhớ được cấp phát rõ ràng thông qua VkDeviceMemory. Nhà phát triển truy vấn các loại bộ nhớ (HOST_VISIBLE, DEVICE_LOCAL) từ thiết bị vật lý và cấp phát các khối. Bộ đệm (VkBuffer) và kết cấu (VkImage) không có bộ nhớ riêng — chúng được liên kết với các khối đã cấp phát qua vkBindBufferMemory.

Vulkan Memory Allocator (VMA) là thư viện từ AMD giúp đơn giản hóa việc quản lý bộ nhớ. VMA tự động nhóm các cấp phát nhỏ thành các khối lớn, quản lý chống phân mảnh và chọn loại bộ nhớ phù hợp. Theo AMD (2025), VMA giảm số lượng cấp phát bộ nhớ xuống 50–100 lần so với quản lý thủ công.

VkCommandPool và VkCommandBuffer

VkCommandPool quản lý bộ nhớ cho các bộ đệm lệnh. Bộ đệm (VkCommandBuffer) được ghi trên CPU và gửi đến GPU qua vkQueueSubmit. Vulkan hỗ trợ bộ đệm chính và phụ: bộ đệm chính được gửi trực tiếp, bộ đệm phụ có thể được gọi từ bộ đệm chính để xây dựng lệnh đa luồng.

Việc ghi lệnh bắt đầu bằng vkBeginCommandBuffer và kết thúc bằng vkEndCommandBuffer. Giữa chúng, các lệnh kết xuất được ghi: vkCmdDraw, vkCmdDispatch, vkCmdCopyBuffer và vkCmdPipelineBarrier để đồng bộ hóa. Một bộ đệm lệnh mới được tạo cho mỗi khung hình với pooling qua reset pool.

Kết xuất qua Vulkan: pipeline và lệnh

Kết xuất trong Vulkan được tổ chức thông qua pipeline (VkPipeline). Không giống như OpenGL, nơi trạng thái pipeline được thay đổi toàn cục, Vulkan sử dụng VkPipeline — một pipeline được biên dịch trước bao gồm tất cả các giai đoạn: đầu vào đỉnh, shader, rasterization, depth-stencil và hòa trộn.

VkPipeline — pipeline kết xuất

VkGraphicsPipelineCreateInfo mô tả pipeline hoàn chỉnh: shader đỉnh và mảnh, cấu trúc liên kết (triangle list, triangle strip), bộ rasterization (fill mode, cull mode), đa mẫu, kiểm tra depth-stencil, hòa trộn và cài đặt viewport. Pipeline được tạo một lần và tái sử dụng — thay đổi trạng thái yêu cầu pipeline mới hoặc trạng thái động.

cpp
// Thiết lập pipeline đồ họa
VkGraphicsPipelineCreateInfo pipelineInfo {};
pipelineInfo.sType =
    VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
pipelineInfo.stageCount = 2;
pipelineInfo.pStages = shaderStages;
pipelineInfo.pVertexInputState =&;
    vertexInputState;
pipelineInfo.pRasterizationState =&;
    rasterState;
 
VkPipeline graphicsPipeline;
vkCreateGraphicsPipelines(device,
    VK_NULL_HANDLE, 1, &pipelineInfo,
    nullptr, &graphicsPipeline);

Trạng thái động (VK_DYNAMIC_STATE_VIEWPORT, VK_DYNAMIC_STATE_SCISSOR) cho phép thay đổi các tham số nhất định mà không cần tạo pipeline mới. Vulkan 1.4 bắt buộc hỗ trợ Dynamic State 3 (VK_EXT_extended_dynamic_state_3) để quản lý hằng số hòa trộn, độ lệch độ sâu và cấu trúc liên kết khi đang chạy, giảm số lượng pipeline trong dự án.

Render Pass và Dynamic Rendering

VkRenderPass mô tả cấu trúc của các lượt kết xuất: tệp đính kèm nào được sử dụng, cách chúng được xóa và tải. Dynamic Rendering (VK_KHR_dynamic_rendering, bắt buộc từ Vulkan 1.4) đơn giản hóa quy trình: render pass được tạo khi đang chạy trong bộ đệm lệnh qua vkCmdBeginRendering, mà không cần đối tượng VkRenderPass trước.

Theo Khronos (2026), Dynamic Rendering giảm mã khởi tạo Vulkan xuống 30–40% và giảm số lượng hoán vị pipeline. Đối với các kỹ thuật kết xuất trì hoãn phức tạp (Deferred Shading), vẫn thuận tiện khi sử dụng VkRenderPass cổ điển với nhiều subpass cho G-buffer và chiếu sáng.

Shader trong Vulkan: SPIR-V và GLSL

SPIR-V là định dạng shader nhị phân phổ quát trong Vulkan, được phát triển bởi Khronos. Shader có thể được viết bằng GLSL, HLSL hoặc ngôn ngữ Zink và được biên dịch thành SPIR-V qua glslangValidator, dxc hoặc Google Shaderc. Vulkan không chấp nhận shader ở dạng mã nguồn — chỉ SPIR-V nhị phân.

GLSL trong Vulkan

GLSL cho Vulkan khác với GLSL tiêu chuẩn của OpenGL. Các khối (layout) được sử dụng với số set và binding rõ ràng, thay vì các biến tích hợp sẵn. Thuộc tính đỉnh được chỉ định qua location, uniform qua uniform blocks hoặc bộ đệm. Push constants (lên tới 128 byte) có sẵn để truyền dữ liệu nhanh mà không cần bộ đệm.

glsl
// Shader đỉnh Vulkan/GLSL
#version 460
 
layout(location = 0) in vec3 inPosition;
layout(location = 1) in vec3 inNormal;
 
layout(binding = 0, set = 0)
uniform UniformBufferObject {
    mat4 modelViewProjection;
} ubo;
 
layout(location = 0) out vec3 outNormal;
 
void main() {
    gl_Position = ubo.modelViewProjection *
        vec4(inPosition, 1.0);
    outNormal = inNormal;
}

Các bổ từ layout(set = N, binding = M) là điểm khác biệt chính giữa Vulkan GLSL và OpenGL. Set tương ứng với một tập hợp bộ mô tả (VkDescriptorSet), binding tương ứng với một tài nguyên cụ thể (bộ đệm, kết cấu, bộ lấy mẫu). Việc phân chia thành các set cho phép chuyển đổi hiệu quả các tập hợp tài nguyên giữa các lệnh gọi vẽ mà không cần liên kết từng tài nguyên riêng lẻ.

Bộ mô tả và tập hợp bộ mô tả

VkDescriptorSet là một nhóm tài nguyên (bộ đệm, kết cấu, bộ lấy mẫu) được liên kết với shader. Bố trí bộ mô tả mô tả các loại tài nguyên và số binding của chúng. Các tập hợp bộ mô tả được cập nhật qua vkUpdateDescriptorSets và tái sử dụng giữa các lệnh gọi vẽ. Vulkan 1.4 hỗ trợ VK_EXT_descriptor_buffer để truy cập trực tiếp vào bộ mô tả từ GPU.

Push Constants là cơ chế truyền nhanh khối lượng dữ liệu nhỏ (lên tới 128 byte) đến shader mà không cần tạo bộ mô tả. Push constants được đặt qua vkCmdPushConstants trong bộ đệm lệnh. Theo Khronos (2025), sử dụng push constants thay vì uniform buffers giúp giảm chi phí CPU xuống 10–15% ở tốc độ gọi vẽ hơn 10 nghìn mỗi khung hình.

Vulkan trên các nền tảng khác nhau

Vulkan là API duy nhất hoạt động trên tất cả các nền tảng chính: Windows (qua trình điều khiển ICD chính thức), Linux (RADV, AMDVLK, NVIDIA), Android (Vulkan 1.3+, bắt buộc từ Android 10) và trên thiết bị Apple qua MoltenVK — lớp dịch từ Vulkan sang Metal.

Vulkan trên Android

Trên Android, Vulkan là bắt buộc đối với Android 10 trở lên. Google khuyến nghị Vulkan cho các dự án mới, đặc biệt là game hiệu suất cao và ứng dụng AR qua ARCore. Qualcomm Adreno và ARM Mali cung cấp hỗ trợ đầy đủ Vulkan 1.3 với dò tia bằng phần cứng trên Adreno 8xx và Mali-G720.

Theo Google (2026), 98% thiết bị Android chạy Android 10+ hỗ trợ Vulkan. Để tương thích ngược, ANGLE (Almost Native Graphics Layer Engine) có sẵn, dịch OpenGL ES sang Vulkan. Điều này cho phép chạy các ứng dụng OpenGL cũ trên trình điều khiển Vulkan với cải thiện hiệu suất lên tới 20%.

Trên Android, Vulkan có ưu tiên cao về hiệu quả năng lượng: ứng dụng Vulkan tiêu thụ ít năng lượng hơn 25–40% so với OpenGL ES dưới cùng tải đồ họa trên thiết bị Adreno 7xx+. Điều này làm cho Vulkan trở thành API ưa thích cho game trên thiết bị di động.

Vulkan trên Apple qua MoltenVK

MoltenVK là triển khai Vulkan trên Metal, được phát triển bởi LunarG và Valve. MoltenVK dịch các lệnh gọi Vulkan API sang Metal, hỗ trợ Vulkan 1.2 trên iOS và macOS. Hiệu suất của MoltenVK gần với Metal gốc: chi phí dịch là 5–15% tùy theo kịch bản.

Theo LunarG (2025), MoltenVK được sử dụng trong CrossOver (Wine cho Mac) để chạy game Windows trên macOS. Dota 2, Civilization VI và Baldur's Gate 3 trên macOS chạy qua MoltenVK với hiệu suất 30–60 FPS trên M3/M4. MoltenVK hỗ trợ nâng cấp MetalFX để cải thiện hiệu suất.

Vulkan Ray Tracing

VK_KHR_ray_tracing là tiện ích mở rộng cho dò tia bằng phần cứng trong Vulkan, bắt buộc từ Vulkan 1.4. Được hỗ trợ trên GPU có nhân RT: NVIDIA RTX 20xx/30xx/40xx/50xx, AMD RX 6000+/9000, Intel Arc A/B. Vulkan RT cung cấp VkAccelerationStructure, VkRayTracingPipeline và Shader Binding Table.

Vulkan Ray Tracing hỗ trợ phản chiếu, bóng đổ, che khuất xung quanh và chiếu sáng toàn cầu theo thời gian thực. Theo Khronos (2026), trên NVIDIA RTX 5090, Vulkan Ray Tracing đạt tới 100 Giga rays/s trong các cảnh chất lượng tham chiếu. Đối với nền tảng di động, Vulkan RT mở rộng quy mô qua giảm mờ và khử nhiễu tạm thời.

Câu hỏi thường gặp

Vulkan là gì và nó khác gì so với OpenGL?

Vulkan là API GPU đa nền tảng cấp thấp với quản lý tài nguyên rõ ràng. Không giống OpenGL, nó cung cấp khả năng kiểm soát bộ nhớ, đồng bộ hóa và đa luồng, mang lại cải thiện hiệu suất lên tới 50% trong các kịch bản giới hạn CPU.

Vulkan hoạt động trên những nền tảng nào?

Vulkan hoạt động trên Windows, Linux, Android, Nintendo Switch và trên iOS/macOS qua MoltenVK (dịch sang Metal). Được hỗ trợ trên GPU NVIDIA, AMD, Intel, Qualcomm, ARM và Apple (qua MoltenVK).

SPIR-V trong Vulkan là gì?

SPIR-V là định dạng shader nhị phân phổ quát cho Vulkan. Shader được viết bằng GLSL hoặc HLSL, biên dịch thành SPIR-V và đưa vào Vulkan. Điều này đảm bảo tính độc lập ngôn ngữ shader và hiệu suất biên dịch có thể dự đoán trước.

Vulkan có hỗ trợ dò tia không?

Có, qua VK_KHR_ray_tracing — tiện ích mở rộng bắt buộc từ Vulkan 1.4. Được hỗ trợ trên GPU có nhân RT: NVIDIA RTX, AMD RX 6000+, Intel Arc. Vulkan RT cung cấp cấu trúc tăng tốc BVH, Shader Binding Table và giao điểm tia phần cứng.

Có khó để bắt đầu sử dụng Vulkan không?

Rào cản gia nhập cao hơn OpenGL hoặc DirectX 11 do quản lý bộ nhớ rõ ràng, đồng bộ hóa và pipeline. Khronos cung cấp Vulkan Tutorial, Vulkan Samples và Vulkan Guide. Hình tam giác đầu tiên cần khoảng 500 dòng mã.

Tổng kết

  • Vulkan — API GPU đa nền tảng cấp thấp từ Khronos Group
  • Quản lý rõ ràng bộ nhớ, đồng bộ hóa và hàng đợi giảm chi phí CPU
  • VkPipeline — pipeline được biên dịch trước cho đồ họa và tính toán
  • SPIR-V — định dạng shader nhị phân được biên dịch từ GLSL và HLSL
  • Dynamic Rendering (Vulkan 1.4) đơn giản hóa việc tạo Render Pass mà không cần VkRenderPass
  • MoltenVK cho phép Vulkan trên iOS và macOS qua Metal
  • Vulkan 1.4 thêm Mesh Shaders, Video Encode API và dò tia bắt buộc

Chúng tôi sẽ phát triển ứng dụng di động chìa khóa trao tay

IT Sectr tạo các ứng dụng iOS và Android cho các công ty khởi nghiệp và doanh nghiệp từ năm 2017. Chúng tôi sẽ tư vấn và đề xuất giải pháp tốt nhất cho bạn.

Thảo luận dự án

Đọc thêm