Câu hỏi của tôi tương tự như this one nhưng một phần của câu trả lời (hữu ích) không tương thích với việc biên dịch GLSL cho vulkan dựa trên OpenGL ES ESSL 3.10.Biên dịch GLSL được viết cho các phiên bản OpenGL ES thành Vulkan
Để sử dụng một phần riêng biệt của bộ nhớ liên tục đẩy trong đổ bóng đỉnh và đổ bóng phân đoạn, giải pháp được đề xuất là sử dụng bố trí (offset = #) trước thành viên đầu tiên của cấu trúc liên tục đẩy.
Cố gắng thực hiện điều này trong mã GLSL ES 310 dẫn đến lỗi "'offset trên thành viên khối': không được hỗ trợ với cấu hình này: es".
Có cách nào được hỗ trợ để khai báo khoản bù trừ tương thích với es không?
Cách giải quyết duy nhất mà tôi tìm thấy là khai báo một loạt các biến giả trong trình đổ bóng phân đoạn. Khi tôi làm như vậy, tôi nhận được các lỗi lớp xác nhận nếu tôi không khai báo đầy đủ vùng đệm liên tục của bộ đệm đổ bóng trong VkPipelineLayoutCreateInfo. Sau khi sửa lỗi đó, tôi nhận được các cảnh báo lớp xác thực về "vkCreatePipelineLayout() gọi có các hằng số đẩy với các dải chồng chéo".
Rõ ràng là tôi có thể bỏ qua cảnh báo, nhưng nếu có giải pháp gọn gàng hơn, thì điều đó sẽ thích hợp hơn nhiều.
Ví dụ đơn giản, điều này biên dịch thành công với VulkanSDK \ 1.0.13.0 \ Bin \ glslangValidator.exe:
#version 430
#extension GL_ARB_enhanced_layouts: enable
layout(std140, push_constant) uniform PushConstants
{
layout(offset=64) mat4 matWorldViewProj;
} ubuf;
layout(location = 0) in vec4 i_Position;
void main() {
gl_Position = ubuf.matWorldViewProj * i_Position;
}
Trong khi điều này không:
#version 310 es
#extension GL_ARB_enhanced_layouts: enable
layout(std140, push_constant) uniform PushConstants
{
layout(offset=64) mat4 matWorldViewProj;
} ubuf;
layout(location = 0) in vec4 i_Position;
void main() {
gl_Position = ubuf.matWorldViewProj * i_Position;
}
Chuyển đổi tất cả các mã 310 ES đổ bóng của tôi để 430 sẽ giải quyết vấn đề của tôi, nhưng điều đó sẽ không lý tưởng. GL_ARB_enhanced_layouts không áp dụng cho mã 310 ES, vì vậy câu hỏi của tôi không phải là lý do tại sao nó không hoạt động, nhưng thay vào đó, tôi có bất kỳ tùy chọn nào trong ES để đạt được cùng một mục tiêu không?
"* Chuyển đổi tất cả mã shader 310 ES của tôi thành 430 sẽ giải quyết được vấn đề của tôi, nhưng điều đó sẽ không lý tưởng. *" Trình đổ bóng của bạn được viết bởi * Vulkan * chứ không phải OpenGL ES. Vậy tại sao nó không "lý tưởng" mà bạn phải thay đổi chúng để nó hoạt động? Tại sao bạn gắn liền với shaders của bạn bằng cách sử dụng ES phiên bản 3.10? –
Khi câu hỏi này tiếp tục thỉnh thoảng có được những quan điểm và upvotes, tôi nghĩ tôi sẽ theo dõi. Tôi đang nhắm mục tiêu thiết bị di động, bao gồm thiết bị OpenGLES2 và Metal và muốn sử dụng SPIR-V để biên dịch chéo một bộ đổ bóng đơn cho tất cả các nền tảng mục tiêu của tôi. Tôi bị mắc kẹt với 310 ES + GL_KHR_vulkan_glsl, và glslang bị tấn công và SPIRV-Cross để cho phép cả hai bố trí bù đắp (cho Vulkan) và lowp (cho GLES2). Glslang và SPIRV-Cross đều là nguồn mở và tương đối dễ sửa đổi để đáp ứng nhu cầu của tôi - YMMV. – Columbo