4

我正在使用 Sascha Willems 的纹理教程,它没有任何问题。然后我将纹理从 2D 纹理更改为 3D 纹理无符号 16 位。

我设置了正确的深度,然后更改了这些值:

VK_FORMAT_BC3_UNORM_BLOCK -> VK_FORMAT_R16_UINT
VK_IMAGE_TYPE_2D -> VK_IMAGE_TYPE_3D
and just one component ->   view.components = { VK_COMPONENT_SWIZZLE_R };

在着色器中:

sampler2D -> sampler3D

但是我从 texture(volumeTexture, textPos).r 得到的所有值现在都为零。我想要做的是上传一个 UINT16 图像,但从片段着色器将其采样为浮点数。

如果我打开 RenderDoc,纹理看起来不错。

paste.org/private/i7dqw7pm0snkbf40eyywg

这是我在opengl中所做的:

  const auto& glType           = GL_SHORT;
  const auto& glFormat         = GL_LUMINANCE;
  const auto& glInternalFormat = GL_LUMINANCE16F_ARB;
  const auto& glClampMode      = GL_CLAMP_TO_EDGE;
4

2 回答 2

3

这是我在opengl中所做的:

OpenGL 的像素传输功能需要接受不愉快或缓慢的事情。Vulkan 没有。

您在 OpenGL 中所做的是强制驱动程序将每个像素从 16 位无符号标准化定点值转换为16 位 IEEE-754 浮点值。几乎可以肯定,这种转换是在 CPU 上完成的。

Vulkan 没有辅助轮,Vulkan 驱动程序不会为您工作。Vulkan 有格式,规范准确地说明了它们的含义。如果您的数据与您最终要使用的格式不匹配,则由您进行转换。

于 2016-05-25T15:01:35.093 回答
2

您能否添加更多信息?“从纹理读取”是指在片段着色器中采样吗?您是否从验证层收到任何错误?您的实现是否支持从 R16_UINT 采样?

如果 RenderDoc 显示您的纹理,但它在您的应用程序中不“可见”,您也可能会错过正确的图像布局转换,至少在需要它们的硬件上是这样。这还包括正确的子资源范围。

请查看https://www.khronos.org/registry/vulkan/specs/1.0/xhtml/vkspec.html#resources-image-views提供的表格

并确保您的图像和视图参数适合 3D 纹理。

于 2016-05-25T11:18:49.133 回答