wgpu 从0.16.0升级到0.18.0,碰到一个着色器崩溃的问题。
下面的是之前0.16.0版本可以正常运行的着色器代码
fn visualization(uv: vec2<f32>, bans: f32) -> vec4<f32> {
var color = mix(vec3<f32>(1.0, 0.0, 0.0), vec3<f32>(1.0, 165.0 / 255.0, 0.0), uv.y);
var frequency = textureSample(audio_texture, base_color_sampler, vec2<f32>(floor(uv.x * bans) / bans, 0.0)).x;
if(uv.y < frequency) {
return vec4<f32>(vec3<f32>(0.0), 1.0);
} else {
var mask = step(0.2, fract(uv.x * bans));
var r = 1.0 + smoothstep(0.0, frequency, uv.y);
return vec4<f32>(r * color * mask, 1.0);
}
}
升级到0.18.0版本后,出现以下崩溃:
Exception has occurred.
Exception 0xc0000005 encountered at address 0x7ffec2fe6f10: Access violation writing location 0x800000014
发现带有"vk_"开头的名字,可能是跟vulkan有关,尝试将wgpu的渲染后端切换成DX12,可以正常运行程序。
另外,再尝试更改了以下着色器代码,换成以下的代码,在使用vulkan作为渲染后端时,发现可以正常运行。
fn visualization(uv: vec2<f32>, bans: f32) -> vec4<f32> {
var color = vec3<f32>(0.0);
var frequency = textureSample(audio_texture, base_color_sampler, vec2<f32>(floor(uv.x * bans) / bans, 0.0)).x;
if(uv.y < frequency) {
return vec4<f32>(color, 1.0);
} else {
var mask = step(0.2, fract(uv.x * bans));
var r = 1.0 + smoothstep(0.0, frequency, uv.y);
color = mix(vec3<f32>(1.0, 0.0, 0.0), vec3<f32>(1.0, 165.0 / 255.0, 0.0), uv.y);
return vec4<f32>(r * color * mask, 1.0);
}
}