从 Vulkan 中的 R16_UINT-3D 纹理在片段着色器中采样值
Sampling values in fragment shader from a R16_UINT-3D texture in Vulkan
我正在使用 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,纹理看起来不错。
馅饼。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;
你能再补充一些信息吗? "read from texture" 是指在片段着色器中采样吗?你从验证层得到任何错误吗?您的实施是否支持从 R16_UINT 中抽样?
如果 RenderDoc 显示您的纹理但它不在您的应用程序中 "visible" 您也可能会错过正确的图像布局转换,至少在需要它们的硬件上是这样。这也包括正确的子资源范围。
请查看 https://www.khronos.org/registry/vulkan/specs/1.0/xhtml/vkspec.html#resources-image-views
中提供的 table
并确保您的图像和视图参数适合 3D 纹理。
This is what I did in opengl:
OpenGL 的 pixel transfer functionality 需要接受不愉快或缓慢的事情。 Vulkan 没有。
您在 OpenGL 中所做的是强制驱动程序将每个像素从 16 位无符号 normalized fixed-point value to a 16-bit IEEE-754 floating-point value 转换。几乎可以肯定,此转换是在 CPU.
上完成的
Vulkan 没有辅助轮,Vulkan 驱动程序不会为您完成工作。 Vulkan 有格式,规范明确说明了它们的含义。如果您的数据与您最终想要使用的格式不匹配,那么您需要进行转换。
我正在使用 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,纹理看起来不错。
馅饼。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;
你能再补充一些信息吗? "read from texture" 是指在片段着色器中采样吗?你从验证层得到任何错误吗?您的实施是否支持从 R16_UINT 中抽样?
如果 RenderDoc 显示您的纹理但它不在您的应用程序中 "visible" 您也可能会错过正确的图像布局转换,至少在需要它们的硬件上是这样。这也包括正确的子资源范围。
请查看 https://www.khronos.org/registry/vulkan/specs/1.0/xhtml/vkspec.html#resources-image-views
中提供的 table并确保您的图像和视图参数适合 3D 纹理。
This is what I did in opengl:
OpenGL 的 pixel transfer functionality 需要接受不愉快或缓慢的事情。 Vulkan 没有。
您在 OpenGL 中所做的是强制驱动程序将每个像素从 16 位无符号 normalized fixed-point value to a 16-bit IEEE-754 floating-point value 转换。几乎可以肯定,此转换是在 CPU.
上完成的Vulkan 没有辅助轮,Vulkan 驱动程序不会为您完成工作。 Vulkan 有格式,规范明确说明了它们的含义。如果您的数据与您最终想要使用的格式不匹配,那么您需要进行转换。