我正在尝试使用 glslang 将 glsl 着色器代码编译为 SPIR-V 二进制文件。glslang 项目可以在这里找到:
https://github.com/KhronosGroup/glslang
它可以通过在命令行中手动运行 glslangValidator.exe 来很好地工作。但我想使用 C++ 接口。
我已经按照 github 页面上的描述构建了项目,现在我正在努力解决如何实际使用该界面的问题。
我宁愿不在我的解决方案中实际包含任何项目(我正在使用 Visual Studio),而是链接使用它所需的 .lib 和标头。我只是找不到我需要链接哪些。github页面只提到ShaderLang.h和StandAlone.cpp,这是不够的。
有人可以解释如何设置一个可以使用 glslang 的项目吗?我只需要它来将 glsl 着色器代码编译为 SPIR-V 二进制文件(带有有关着色器编译的调试信息)。我认为对于已经做过或有更多经验的人来说,这将是一个非常简单的问题。
我正在尝试将在子通道0中创建的颜色附件用作子通道1中的输入附件。但是,存在我无法克服的问题。
我目前的问题是以下问题,我尝试使用通行证开始时清除附件0,VK_ATTACHMENT_LOAD_OP_CLEAR
但给出错误。
Cannot clear attachment 0 with invalid first layout VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL.
Run Code Online (Sandbox Code Playgroud)
在我看来这很奇怪,附件0 VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL
直到子传递1作为输入附件才获得布局,而清除应该在布局静止时就已经发生VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL
(AFAIK)。
现在,我尝试在验证错误后继续运行,并且附件0 确实被清除,这使我更加不确定。我显然可以忽略验证错误,但是可能会发生一些奇怪的事情,以后可能会引起问题,因此我对解决问题的信心不足。
这是将给出错误的最少代码:
VkAttachmentDescription attachments[1] {};
attachments[0].format = VK_FORMAT_R16G16B16A16_SFLOAT;
attachments[0].samples = VK_SAMPLE_COUNT_1_BIT;
attachments[0].loadOp = VK_ATTACHMENT_LOAD_OP_CLEAR;
attachments[0].storeOp = VK_ATTACHMENT_STORE_OP_STORE;
attachments[0].stencilLoadOp = VK_ATTACHMENT_LOAD_OP_DONT_CARE;
attachments[0].stencilStoreOp = VK_ATTACHMENT_STORE_OP_DONT_CARE;
attachments[0].initialLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
attachments[0].finalLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
VkAttachmentReference pass_0_ColorAttachments[1];
pass_0_ColorAttachments[0].attachment = 0;
pass_0_ColorAttachments[0].layout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
VkAttachmentReference pass_1_InputAttachments[1];
pass_1_InputAttachments[0].attachment = 0;
pass_1_InputAttachments[0].layout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
VkSubpassDescription subpasses[2] {};
subpasses[0].colorAttachmentCount = 1;
subpasses[0].pColorAttachments = pass_0_ColorAttachments;
subpasses[0].pipelineBindPoint = VK_PIPELINE_BIND_POINT_GRAPHICS;
subpasses[1].inputAttachmentCount = 1; …
Run Code Online (Sandbox Code Playgroud) 我需要添加许多具有大量成员的类的成员。这种对保存统计数据的两个对象的成员进行求和的方法是否会被定义为行为?有没有更安全、简洁的方法来做同样的事情?
template<typename Class, typename T>
void add_typed_range(Class& l, const Class& r, T Class::* from, T Class::* to)
{
auto* it_l = &(l.*from);
const auto* to_it_l = &(l.*to);
auto* it_r = &(r.*from);
const auto* to_it_r = &(r.*to);
for (; it_l <= to_it_l; ++it_l, ++it_r)
{
*it_l += *it_r;
}
}
struct A
{
double a, b, c, d, e, f, g;
int l, m, n, o, p;
A& operator+=(const A& r)
{
add_typed_range(*this, r, &A::a, &A::g);
add_typed_range(*this, r, &A::l, &A::p);
return …
Run Code Online (Sandbox Code Playgroud)