c++ - Vulkan 几何着色器意外崩溃

标签 c++ glsl vulkan

在 Vulkan 几何着色器中进行 float 比较时,我遇到了奇怪的崩溃。着色器代码如下:

#version 450
#extension GL_ARB_separate_shader_objects : enable
#extension GL_ARB_shading_language_420pack : enable

layout (triangles) in;
layout (triangle_strip,  max_vertices=3) out;

layout(binding = 0) uniform UniformBufferObject {
    mat4 modelView;
    mat4 staticModelView;
} ubo;

in vec2 texCoordGeom[];

layout(location = 0) out vec2 texCoord;

void main() {
    float dist0 = length(gl_in[0].gl_Position.xyz - gl_in[1].gl_Position.xyz);
    float dist1 = length(gl_in[1].gl_Position.xyz - gl_in[2].gl_Position.xyz);
    float dist2 = length(gl_in[0].gl_Position.xyz - gl_in[2].gl_Position.xyz);

    float maxDist = max(dist0, max(dist1, dist2));

    if(maxDist < 0.01) {
        gl_Position = ubo.modelView * gl_in[0].gl_Position;
        texCoord = texCoordGeom[0];
        EmitVertex();

        gl_Position = ubo.modelView * gl_in[1].gl_Position;
        texCoord = texCoordGeom[1];
        EmitVertex();

        gl_Position = ubo.modelView * gl_in[2].gl_Position;
        texCoord = texCoordGeom[2];
        EmitVertex();
        EndPrimitive();
    }
}

它似乎在条件崩溃:

if(maxDist < 0.01)

当我删除这个条件时,代码运行没有问题。如果我将阈值从 0.01 更改为更大的值(例如 0.1 或 1),代码将再次正常运行。

请注意,我正在使用 VulkanSDK 中的 glslangValidator.exe 来编译着色器代码。除了警告之外,不会抛出任何验证错误:

警告,版本 450 尚未完成;存在大多数特定于版本的功能,但缺少一些。

另请注意,当程序因整个 GPU 卡住(屏幕暂时变黑)而崩溃并退出程序时,不会抛出任何有用的错误。

最佳答案

对于 future 的读者来说,这似乎是一个驱动程序问题。由于更新到最新的驱动程序(Radeon Driver Packaging Version 16.50.2011-161219a-309792E) 以及最新的 LunarG Vulkan SDK (1.0.37.0) 问题已自行解决。请注意,我正在运行 AMD Radeon R9 380 系列。

关于c++ - Vulkan 几何着色器意外崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41392181/

相关文章:

c++ - opengl 中的着色器应该做多少工作?

c++ - 这个在GPU上运行的光线追踪功能,GPU安全吗?

visual-studio - 使用 Premake 5 和 Visual Studio 2015 将 GLSL 编译为 SPIR-V

c++ - X11 上的 Vulkan : vkGetPhysicalDeviceSurfaceCapabilitiesKHR error

opengl - 在 Vulkan/Opengl 的视口(viewport)外绘图

c++ - 我应该从 Boost::filesystem::copy 得到什么错误代码

c++ - return *this 在 C++ 中安全吗?

c++ - 使用或匹配正则表达式

c++ - 队列 : QueueFamilyIndex is not unique within pCreateInfo->pQueueCreateInfos array 的验证层错误

c++ - 为什么我们需要 crossCheckMatching 作为功能?