Vulkanジオメトリシェーダで浮動小数点比較を実行すると、奇妙なクラッシュが発生します。次のようにシェーダコードは次のとおりです。Vulkanジオメトリシェーダで予期しないクラッシュが発生する
#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全体がフリーズして(画面が一時的に黒くなる)、プログラムが終了すると、プログラムがクラッシュしたときに役立つエラーはスローされません。
TDRを実行してドライバをリセットした場合、原因が分かりにくいです。私の最初の疑惑は、ドライバーのSPIR-Vのリフレクションバグでしたが、シェーダーが実際に働いているのであれば、あなたが比較している値を変更すれば、私はそれが当てはまるとは思えません。 バージョン警告btw。無視することができます。 シェーダについて変更したいことの1つは、頂点が生成されていなくても常にEndPrimitiveを呼び出すことです。 それでもクラッシュした場合、レポケースを実行して、コードがクラッシュするIHVに渡すことができます。 –
また、GLSL 4.50を求めました。これには、あなたが求める拡張機能の両方が含まれます。だから...なぜ彼らに頼んでいるのですか? –
このバージョンの修正版(texCoord + tran。matrixの代わりにカラー)が私のために機能するようです。だから**おそらく** glslangValidator(1.0.37 SDK)とシェーダコードに間違っているものはありません。別のドライバを試してください。 – krOoze