我正在使用Sascha Willems的纹理教程,它没有任何问题。然后我将纹理从2D纹理更改为无符号16位的3D纹理。
我设置了正确的深度,然后更改这些值:
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
但是我从纹理(volumeTexture,textPos).r得到的所有值现在都是零。 我想要做的是上传UINT16图像,但从片段着色器中将其作为float进行采样。
如果我打开RenderDoc,纹理看起来很好。
pastie.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;
答案 0 :(得分:2)
这就是我在opengl中所做的:
OpenGL' pixel transfer functionality需要接受不愉快或缓慢的事情。 Vulkan没有。
您在OpenGL中所做的是强制驱动程序将每个像素从16位无符号normalized fixed-point value转换为16-bit IEEE-754 floating-point value。几乎可以肯定,这种转换是在CPU上完成的。
Vulkan没有训练轮,而Vulkan司机也不会为你做你的工作。 Vulkan有格式,规范确切地说明了它们的含义。如果您的数据与您最终想要使用的格式不匹配,那么您就可以进行转换了。
答案 1 :(得分:1)
您能否添加更多信息?通过“从纹理读取”,您的意思是在片段着色器中进行采样吗?你从验证层得到任何错误吗?您的实现是否支持R16_UINT的采样?
如果RenderDoc显示您的纹理,但它在您的应用程序中不“可见”,您也可能错过正确的图像布局转换,至少在需要它们的硬件上。这还包括正确的子资源范围。
请查看https://www.khronos.org/registry/vulkan/specs/1.0/xhtml/vkspec.html#resources-image-views
提供的表格确保您的图像和视图参数适合3D纹理。