2016-05-05 16 views
6

Tôi có một vertex shader với một khối push-liên tục chứa một float:Sử dụng khác nhau push-hằng số trong shader khác nhau giai đoạn

layout(push_constant) uniform pushConstants { 
    float test1; 
} u_pushConstants; 

Và một Shader mảnh với một khối push-liên tục với một giá trị float khác nhau:

layout(push_constant) uniform pushConstants { 
    float test2; 
} u_pushConstants; 

test1test2 có nghĩa vụ phải thể khác nhau.

Các dãy đẩy liên tục cho việc bố trí đường ống được định nghĩa như thế này:

std::array<vk::PushConstantRange,2> ranges = { 
    vk::PushConstantRange{ 
     vk::ShaderStageFlagBits::eVertex, 
     0, 
     sizeof(float) 
    }, 
    vk::PushConstantRange{ 
     vk::ShaderStageFlagBits::eFragment, 
     sizeof(float), // Push-constant range offset (Start after vertex push constants) 
     sizeof(float) 
    } 
}; 

Các hằng số thực tế sau đó được đẩy trong khi hiển thị như thế này:

std::array<float,1> constants = {123.f}; 
commandBufferDraw.pushConstants(
    pipelineLayout, 
    vk::ShaderStageFlagBits::eVertex, 
    0, 
    sizeof(float), 
    constants.data() 
); 
std::array<float,1> constants = {456.f}; 
commandBufferDraw.pushConstants(
    pipelineLayout, 
    vk::ShaderStageFlagBits::eFragment, 
    sizeof(float), // Offset in bytes 
    sizeof(float), 
    constants.data() 
); 

Tuy nhiên, khi kiểm tra các giá trị bên trong các shader, cả hai đều có giá trị 123. Dường như các offset được bỏ qua hoàn toàn. Tôi có sử dụng chúng không chính xác không?

Trả lời

8

Trong bố cục đường ống, bạn đã tuyên bố rằng trình đổ bóng đỉnh của bạn sẽ truy cập phạm vi dữ liệu từ [0, 4] byte trong phạm vi liên tục đẩy. Bạn đã nói rằng trình đổ bóng phân đoạn của bạn sẽ truy cập phạm vi dữ liệu từ [4, 8] trong phạm vi liên tục đẩy.

Nhưng trình đổ bóng của bạn kể một câu chuyện khác.

layout(push_constant) uniform pushConstants { 
    float test2; 
} u_pushConstants; 

Định nghĩa này rất rõ ràng cho biết phạm vi liên tục đẩy bắt đầu sử dụng [0, 4). Nhưng bạn nói với Vulkan nó sử dụng [4, 8). Vulkan nên tin tưởng gì: trình đổ bóng của bạn hoặc bố cục đường ống của bạn?

Quy tắc chung cần lưu ý là: trình đổ bóng của bạn có nghĩa là ý nghĩa của nó. Các thông số được tạo cho quá trình tạo đường ống không thể thay đổi ý nghĩa của mã của bạn.

Nếu bạn có ý định có shader đoạn thực sự sử dụng [4, 8), sau đó đổ bóng mảnh phải thực sự sử dụng nó:

layout(push_constant) uniform fragmentPushConstants { 
    layout(offset = 4) float test2; 
} u_pushConstants; 

Kể từ khi nó có một nét khác biệt so với phiên bản VS, nó cũng nên có một tên khối khác. Bố cục offset chỉ định độ lệch của biến được đề cập. Đó là nội dung chuẩn từ GLSL và compiling for Vulkan không thay đổi điều đó.

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