2016-06-17 15 views
5

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?

+0

"* 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? –

+0

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

Trả lời

1

Nếu bạn biên dịch SPIR-V cho Vulkan có một "VULKAN" Xác định thiết lập trong shaders của bạn (xem GL_KHR_VULKAN_glsl), do đó bạn có thể làm một cái gì đó như thế này:

#ifdef VULKAN 
    layout(push_constant) uniform pushConstants { 
     vec4 (offset = 12) pos; 
    } pushConstBlock; 
#else 
    // GLES stuff 
#endif 
+0

Cảm ơn câu trả lời. Tôi không cố gắng biên dịch shader cho GLES, tôi đang cố gắng biên dịch shader cho vulkan bằng phương ngữ 310 ES + GL_KHR_vulkan_glsl. Tôi đã thêm một vài ví dụ cho câu hỏi của tôi để hy vọng làm cho vấn đề rõ ràng hơn. Những gì tôi đang cố gắng để làm việc với 430 + GL_KHR_vulkan_glsl, nhưng không phải với 310 ES + GL_KHR_vulkan_glsl. – Columbo

3

tôi sẽ xem xét việc này một lỗi trong trình biên dịch GLSL.

Điều gì đang xảy ra ở đây. Có một số điều giúp biên soạn GLSL cho Vulkan thêm vào ngôn ngữ, dưới dạng defined by KHR_vulkan_glsl. Ví dụ: push_constant bố cục được thêm rõ ràng vào cú pháp GLSL.

Tuy nhiên, có một số điều mà nó không thêm vào ngôn ngữ. Quan trọng đối với trường hợp sử dụng của bạn là khả năng áp dụng bù đắp cho các thành viên của các khối thống nhất. Có, KHR_vulkan_glsl sử dụng thông tin khi tạo bố cục khối của trình đổ bóng. Nhưng ngữ pháp cho phép bạn nói layout(offset=#) được xác định bởi GLSL, chứ không phải bởi KHR_vulkan_glsl.

Và ngữ pháp đó không phải là một phần của bất kỳ phiên bản nào của GLSL-ES. Nó cũng không được cung cấp bởi bất kỳ phần mở rộng ES nào mà tôi biết. Vì vậy, bạn không thể sử dụng nó.Tôi có thể nói rằng trình biên dịch tham chiếu nên, khi biên dịch một shader cho Vulkan, hoặc không biên dịch bất kỳ phiên bản dựa trên GLSL-ES nào, hoặc âm thầm bỏ qua bất kỳ khai báo phiên bản và tiện ích nào và chỉ giả sử GLSL 4.50 trên máy tính để bàn.

Đối với những gì bạn có thể làm về nó ... không có gì. Ngắn của giải pháp đó hack vào trình biên dịch cho mình, giải pháp chính của bạn là viết mã của bạn chống lại các phiên bản của OpenGL máy tính để bàn. Giống như 4,50.

+0

Tôi có thể hiểu sai câu trả lời của bạn, nhưng dường như bạn đang nói rằng đó chỉ là lỗi mà GLSL-ES 310 được cho phép ở trình biên dịch tham chiếu. Tuy nhiên, GL_KHR_vulkan_glsl chỉ định rằng nó có thể được áp dụng cho GLSL-ES 310 (trong phần phụ thuộc). Mặc dù không có cách nào để đạt được bố cục bù trừ, GLSL-ES 310 có vẻ là một công dân hạng hai, vì vậy tôi có thể sẽ làm theo lời khuyên của bạn và chuyển sang phiên bản dành cho máy tính để bàn. – Columbo

+0

@Columbo: Tôi sẽ xem xét một lỗi trong "đặc điểm kỹ thuật". VKSL nên là một ngôn ngữ, một số loại mở rộng giả có thể hoặc có thể không hỗ trợ tất cả các tính năng của nó. –

+0

Có, có thể đó là bước sai cho GL_KHR_vulkan_glsl để cố gắng hỗ trợ quá nhiều phiên bản GLSL. Chắc chắn đối với tôi nó sẽ tốt hơn nếu GL_KHR_vulkan_glsl chưa bao giờ hỗ trợ GLSL-ES. Sau đó, tôi sẽ không dành thời gian nhận được rất nhiều shaders làm việc trong một phương ngữ trước khi phát hiện tôi đã ủng hộ con ngựa sai. Tuy nhiên, có lẽ không quá nhiều nỗ lực để làm lại chúng. Đối với bất kỳ người nào cố gắng quyết định ngôn ngữ nào dựa trên mã shader của họ, tôi khuyên bạn nên chọn GLSL trên máy tính để bàn. – Columbo

Các vấn đề liên quan