Vulkan error: must write gl_Position
Vulkan error: must write gl_Position
您好!
我已遵循有关 Vulkan 的教程:https://vulkan-tutorial.com。但问题是,当我启动我的应用程序时,出现了这个错误:
Validation layer: Vertex info
-----------
(0) : error C5145: must write to gl_Position
Failed to create graphics pipeline
当图形管道也被创建时会发生这种情况。
我只找到了 OpenGL 的答案,但没有找到 Vulkan 的答案。
我试图重写读取文件的代码,但什么也没有。
这里的代码VkShader.cpp(包含Shader Module)
IOManager::FIOManagerFile shaderCode = IOManager::ReadBinaryFile(filename);
vk::ShaderModuleCreateInfo createInfo = vk::ShaderModuleCreateInfo()
.setCodeSize(shaderCode.Size)
.setPCode(reinterpret_cast<const uint32*>(shaderCode.Contents));
if (context->GetDevice().createShaderModule(&createInfo, nullptr, &ShaderModule) != vk::Result::eSuccess)
{
throw std::runtime_error("Failed to create shader module for shader " + filename);
}
和IOManager.h
struct FIOManagerFile
{
size_t Size;
char* Contents;
};
static inline FIOManagerFile ReadBinaryFile(const std::string& filename)
{
std::ifstream file(filename, std::ios::ate | std::ios::in | std::ios::binary);
if (file.is_open())
{
size_t fileSize = (size_t)file.tellg();
char *buffer = new char[fileSize];
file.seekg(0, std::ios::beg);
file.read(buffer, fileSize);
file.close();
FIOManagerFile f;
f.Size = fileSize;
f.Contents = buffer;
return f;
}
else
{
throw std::runtime_error("Failed to open file " + filename);
}
}
祝你有愉快的一天。
文件 IO 代码不太可能与此错误有关。听起来您没有将顶点着色器附加到管道,或者您为顶点着色器编译的 GLSL 不正确。
将 GLSL 编译为 Spir-V 时,您的顶点着色器输入文件应具有扩展名 .vert
,或者您需要在命令行中指定您正在编译顶点着色器。在构建图形管道时,您至少需要添加两个着色器模块,一个顶点着色器和一个片段着色器,每个着色器都使用 vk::PipelineShaderStageCreateInfo
来包装您正在创建的着色器模块。
您是否忘记了在着色器中为 gl_position
赋值?你的顶点着色器应该有一些像这样的行:
void main() {
gl_Position = mvp * vec4(inPosition, 1.0);
}
如果不是这样,你能post你的顶点着色器代码吗?
您好!
我已遵循有关 Vulkan 的教程:https://vulkan-tutorial.com。但问题是,当我启动我的应用程序时,出现了这个错误:
Validation layer: Vertex info
-----------
(0) : error C5145: must write to gl_Position
Failed to create graphics pipeline
当图形管道也被创建时会发生这种情况。 我只找到了 OpenGL 的答案,但没有找到 Vulkan 的答案。 我试图重写读取文件的代码,但什么也没有。 这里的代码VkShader.cpp(包含Shader Module)
IOManager::FIOManagerFile shaderCode = IOManager::ReadBinaryFile(filename);
vk::ShaderModuleCreateInfo createInfo = vk::ShaderModuleCreateInfo()
.setCodeSize(shaderCode.Size)
.setPCode(reinterpret_cast<const uint32*>(shaderCode.Contents));
if (context->GetDevice().createShaderModule(&createInfo, nullptr, &ShaderModule) != vk::Result::eSuccess)
{
throw std::runtime_error("Failed to create shader module for shader " + filename);
}
和IOManager.h
struct FIOManagerFile
{
size_t Size;
char* Contents;
};
static inline FIOManagerFile ReadBinaryFile(const std::string& filename)
{
std::ifstream file(filename, std::ios::ate | std::ios::in | std::ios::binary);
if (file.is_open())
{
size_t fileSize = (size_t)file.tellg();
char *buffer = new char[fileSize];
file.seekg(0, std::ios::beg);
file.read(buffer, fileSize);
file.close();
FIOManagerFile f;
f.Size = fileSize;
f.Contents = buffer;
return f;
}
else
{
throw std::runtime_error("Failed to open file " + filename);
}
}
祝你有愉快的一天。
文件 IO 代码不太可能与此错误有关。听起来您没有将顶点着色器附加到管道,或者您为顶点着色器编译的 GLSL 不正确。
将 GLSL 编译为 Spir-V 时,您的顶点着色器输入文件应具有扩展名 .vert
,或者您需要在命令行中指定您正在编译顶点着色器。在构建图形管道时,您至少需要添加两个着色器模块,一个顶点着色器和一个片段着色器,每个着色器都使用 vk::PipelineShaderStageCreateInfo
来包装您正在创建的着色器模块。
您是否忘记了在着色器中为 gl_position
赋值?你的顶点着色器应该有一些像这样的行:
void main() {
gl_Position = mvp * vec4(inPosition, 1.0);
}
如果不是这样,你能post你的顶点着色器代码吗?