3 điểm bởi GN⁺ 2024-06-07 | 1 bình luận | Chia sẻ qua WhatsApp

Mục lục

  • Lời mở đầu
  • Học lập trình đồ họa
  • Đừng sa đà vào những vấn đề vụn vặt
  • Vì sao là Vulkan?
  • Học Vulkan
  • Tổng quan engine và phân tích khung hình
  • Lời khuyên chung
    • Các thư viện Vulkan được khuyến nghị
    • Trừu tượng hóa GfxDevice
    • Xử lý shader
    • Push constant, descriptor set và bindless descriptor
    • Mẫu pipeline
    • Sử dụng Programmable Vertex Pulling (PVP) + Buffer Device Address (BDA)
    • Bindless descriptor
    • Xử lý dữ liệu động phải upload mỗi frame
    • Destructor, hàng đợi xóa và dọn dẹp
    • Đồng bộ hóa
  • Thêm các ghi chú triển khai
    • Vẽ nhiều sprite
    • Compute skinning
    • Tách biệt game / renderer
    • Tải scene và entity prefab
    • MSAA
    • UI
    • Dear ImGui và vấn đề sRGB
    • Các điểm khác
  • Những gì thu được khi chuyển sang Vulkan
  • Công việc tiếp theo

Lời mở đầu

  • Đây là tài liệu ghi lại trải nghiệm học Vulkan và viết một engine game nhỏ.
  • Đã làm việc trong 3 tháng mà không có kiến thức trước về Vulkan.
  • Đã tạo một game 3D nhỏ và tách các phần có thể tái sử dụng thành engine.

Học lập trình đồ họa

  • Với người mới bắt đầu lập trình đồ họa, nên học từ OpenGL trước.
  • Việc dùng OpenGL để hiển thị mô hình có texture lên màn hình và học ánh sáng đơn giản cùng shadow mapping là rất hữu ích.
  • Các tài nguyên được khuyến nghị để học OpenGL:
    • learnopengl.com
    • Sách Anton’s OpenGL 4 Tutorials
    • Các bài giảng của Thorsten Thormählen (khuyến nghị 6 video đầu)

Đừng sa đà vào những vấn đề vụn vặt

  • Cần cẩn thận để không bị ám ảnh bởi những vấn đề nhỏ nhặt.
  • Luôn tự hỏi: "Có thực sự cần không?", "Nó có trở thành nút thắt cổ chai không?"
  • Những tính năng chưa cần thiết có thể được bổ sung sau.
  • Nên bắt đầu từ một game đơn giản và cẩn thận để không tạo ra một engine quá phức tạp.

Vì sao là Vulkan?

  • Vulkan phù hợp với những người muốn dùng các tính năng GPU hiện đại và ưa chuộng công nghệ mã nguồn mở cùng các tiêu chuẩn mở.
  • OpenGL là đủ cho các game nhỏ, nhưng khó tận dụng các tính năng GPU hiện đại và bị hạn chế trên macOS.
  • WebGPU dễ học hơn Vulkan và có thể chạy game trong trình duyệt.

Học Vulkan

  • Việc học Vulkan ban đầu có vẻ khó, nhưng Khronos đã giúp việc học dễ hơn bằng cách đơn giản hóa các phần phức tạp và cung cấp các thư viện hữu ích.
  • Các tài nguyên được khuyến nghị để học Vulkan:
    • vkguide
    • Chuỗi bài giảng Vulkan của TU Wien
    • Sách 3D Graphics Rendering Cookbook
    • Sách Mastering Graphics Programming with Vulkan

Tổng quan engine và phân tích khung hình

  • Tên engine là EDBR (Elias Daler’s Bikeshed Engine), ban đầu được bắt đầu như một dự án học Vulkan.
  • Engine chủ yếu phù hợp với các game nhỏ theo dạng level.
  • Quy trình render mỗi frame:
    • Skinning: xử lý skinning mô hình bằng compute shader
    • Shadow mapping: dùng texture độ sâu 4096x4096
    • Geometry và shading: dùng mô hình PBR
    • Resolve độ sâu: xử lý thủ công qua fragment shader
    • Hiệu ứng hậu kỳ: áp dụng depth fog, tone mapping và bloom
    • UI: vẽ UI chỉ với một draw call

Lời khuyên chung

Các thư viện Vulkan được khuyến nghị

  • vk-bootstrap: đơn giản hóa mã khởi tạo Vulkan
  • Vulkan Memory Allocator (VMA): quản lý cấp phát bộ nhớ
  • volk: đơn giản hóa việc nạp các hàm mở rộng

Trừu tượng hóa GfxDevice

  • Lớp GfxDevice đóng gói các chức năng Vulkan, xử lý khởi tạo ngữ cảnh Vulkan, tạo và quản lý swapchain, v.v.

Xử lý shader

  • Dùng GLSL để viết shader.
  • Biên dịch trước shader ở bước build để giảm phụ thuộc lúc runtime.

Push constant, descriptor set và bindless descriptor

  • Trong Vulkan, descriptor set được dùng để truyền dữ liệu vào shader.
  • Việc sử dụng bindless descriptor và buffer device address giúp giảm thiểu việc dùng descriptor set.

Mẫu pipeline

  • Dùng các lớp pipeline để tách riêng các giai đoạn vẽ.
  • Thông qua các phương thức init, cleanup, draw để xử lý khởi tạo, dọn dẹp và vẽ cho pipeline.

Sử dụng Programmable Vertex Pulling (PVP) + Buffer Device Address (BDA)

  • Thống nhất về một kiểu vertex và truy cập vertex trực tiếp trong shader.
  • Truyền địa chỉ buffer bằng push constant.

Bindless descriptor

  • Quản lý texture theo kiểu bindless để shader có thể truy cập trực tiếp.
  • Truyền texture ID bằng push constant để thực hiện sampling.

Ý kiến của GN⁺

  • Vulkan cung cấp hiệu năng cao và các tính năng GPU hiện đại, nhưng đường cong học tập ban đầu khá dốc.
  • Nên học OpenGL trước rồi mới chuyển sang Vulkan.
  • Có nhiều tài nguyên khác nhau để học Vulkan, và tận dụng chúng sẽ giúp việc học dễ dàng hơn.
  • Viết một engine game nhỏ bằng Vulkan giúp hiểu sâu hơn về lập trình đồ họa.
  • Nên sử dụng các thư viện hữu ích để giảm bớt độ phức tạp của Vulkan.

1 bình luận

 
GN⁺ 2024-06-07
Ý kiến Hacker News

Tóm tắt bình luận trên Hacker News

  • Hiệu quả của cách tiếp cận tối giản: Một người đang viết client metaverse bằng Rust và gặp các vấn đề phức tạp khi dùng Vulkan, WGPU và Rend3. WGPU khó phát triển vì phải hỗ trợ nhiều nền tảng.

  • Ưu điểm của Vulkan và sự đơn giản của OpenGL: Vulkan có thể tận dụng tối đa các tính năng GPU nâng cao, nhưng OpenGL phù hợp hơn cho các game 2D hoặc low-poly đơn giản. Ngành game AAA tập trung nhiều vào chất lượng đồ họa, nhưng nhiều người chơi lại quan tâm hơn đến gameplay.

  • Chỉ triển khai những tính năng cần thiết: Các lập trình viên junior thường có xu hướng bị ám ảnh bởi công cụ mới nhất và "best practice", nhưng điều quan trọng là tập trung vào những tính năng tối thiểu cần thiết để giải quyết vấn đề thực tế.

  • Độ phức tạp của Vulkan: So với OpenGL, Vulkan khó tối ưu hiệu năng hơn và đòi hỏi nhiều mã cũng như công việc đồng bộ hóa. Với mục đích làm vì sở thích, OpenGL ES3 đơn giản hơn.

  • Vấn đề của các lớp trừu tượng bổ sung: Tài liệu học Vulkan thường đưa thêm các lớp trừu tượng, khiến rất khó tìm được ví dụ cơ bản về quản lý bộ nhớ.

  • Sự khó khăn khi học Vulkan: OpenGL từng dễ học hơn, trong khi Vulkan khiến cả những tác vụ đơn giản cũng trở nên phức tạp. Việc học công nghệ mới tốn rất nhiều thời gian.

  • Học Vulkan để trực quan hóa dữ liệu khoa học: Có người đã học Vulkan để viết một engine trực quan hóa dữ liệu khoa học, và đã mất nhiều thời gian để hiểu các lớp trừu tượng trong quá trình học.

  • Khó khăn trong việc học Vulkan: Rất khó hiểu cách sử dụng Vulkan trong một engine thực tế. Cần thêm nhiều tài liệu để học cách xây dựng các lớp trừu tượng tốt và xác định thứ tự rendering.

  • Sự hỗ trợ từ cộng đồng lập trình đồ họa: Trong quá trình phát triển engine Vulkan, sự hỗ trợ và phản hồi từ cộng đồng đã là trợ giúp rất lớn.