У меня проблема с сэмплером в Vulkan: не имеет значения, создаю ли я сэмплер с VK_FILTER_NEAREST
или VK_FILTER_LINEAR
для фильтра увеличения или минимизации, моя текстура будет сэмплирована, как если бы я создал ее с помощью VK_FILTER_LINEAR
;
Это метод, в котором я создаю свой сэмплер:
void Gui::Texture_2D::createVkSampler(const VkFilter & _magFilter,
const VkFilter & _minFilter,
const VkSamplerMipmapMode & _mipMapFilter,
const unsigned char & _maxAnisotropy) {
VkSamplerCreateInfo samplerInfo = {};
samplerInfo.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
samplerInfo.magFilter = _magFilter; // VK_FILTER_NEAREST
samplerInfo.minFilter = _minFilter; // VK_FILTER_NEAREST
samplerInfo.addressModeU = VK_SAMPLER_ADDRESS_MODE_REPEAT;
samplerInfo.addressModeV = VK_SAMPLER_ADDRESS_MODE_REPEAT;
samplerInfo.addressModeW = VK_SAMPLER_ADDRESS_MODE_REPEAT;
samplerInfo.anisotropyEnable = _maxAnisotropy == 0 ? VK_FALSE : VK_TRUE; // 0
samplerInfo.maxAnisotropy = _maxAnisotropy; // 0
samplerInfo.borderColor = VK_BORDER_COLOR_INT_OPAQUE_BLACK;
samplerInfo.unnormalizedCoordinates = VK_FALSE;
samplerInfo.compareEnable = VK_FALSE;
samplerInfo.compareOp = VK_COMPARE_OP_ALWAYS;
samplerInfo.mipmapMode = _mipMapFilter; // VK_SAMPLER_MIPMAP_MODE_NEAREST
samplerInfo.mipLodBias = 0.0f;
samplerInfo.minLod = 0.0f;
samplerInfo.maxLod = static_cast<float>(image.getMipLevels());
if (vkCreateSampler(logicalDevice, &samplerInfo, nullptr, &sampler) != VK_SUCCESS)
throw std::runtime_error("Texture sampler creation failed!");
}
... но текстура отображается так, как будто я передал VK_FILTER_LINEAR
и VK_SAMPLER_MIPMAP_MODE_LINEAR
, и ядействительно не знаю что не так.
У кого-нибудь есть идея?Спасибо.
Подробнее :
Это текстура изображения (простая 8x8 .png с каждым углом 4x4 другого цвета):
Это результат с использованием VK_FILTER_NEAREST
и VK_SAMPLER_MIPMAP_MODE_NEAREST
:
Это файл .obj куба с Normals иКоординаты текстуры:
# Blender v2.79 (sub 0) OBJ File: ''
# www.blender.org
mtllib untitled.mtl
o Cube
v 1.000000 -1.000000 -1.000000
v 1.000000 -1.000000 1.000000
v -1.000000 -1.000000 1.000000
v -1.000000 -1.000000 -1.000000
v 1.000000 1.000000 -1.000000
v 1.000000 1.000000 1.000000
v -1.000000 1.000000 1.000000
v -1.000000 1.000000 -1.000000
vt 0.000000 0.000000
vt 1.000000 0.000000
vt 1.000000 1.000000
vt 0.000000 1.000000
vt 0.000000 0.000000
vt 1.000000 0.000000
vt 1.000000 1.000000
vt 0.000000 1.000000
vt 1.000000 0.000000
vt 1.000000 1.000000
vt 0.000000 1.000000
vt 0.000000 0.000000
vt 1.000000 0.000000
vt 0.000000 1.000000
vt 0.000000 0.000000
vt 1.000000 0.000000
vt 1.000000 1.000000
vt 1.000000 0.000000
vt 1.000000 1.000000
vt 0.000000 1.000000
vn 0.0000 -1.0000 0.0000
vn 0.0000 1.0000 0.0000
vn 1.0000 0.0000 0.0000
vn -0.0000 -0.0000 1.0000
vn -1.0000 -0.0000 -0.0000
vn 0.0000 0.0000 -1.0000
usemtl Material
s off
f 1/1/1 2/2/1 3/3/1 4/4/1
f 5/5/2 8/6/2 7/7/2 6/8/2
f 1/1/3 5/9/3 6/10/3 2/11/3
f 2/12/4 6/13/4 7/7/4 3/14/4
f 3/15/5 7/16/5 8/17/5 4/4/5
f 5/5/6 1/18/6 4/19/6 8/20/6
Я бы ожидал поведение, подобное Minecraft, но я получаю этот размытый стиль, который я должен получить с VK_FILTER_LINEAR
.
Спасибо.
Обновление
Я запустил программу на другом ПК, и текстура выбрана правильно, я думаю, что есть ошибка / сбой / проблема с моим GPU, я попытаюсь обновить мои драйверы.
Обновление 2
Я обновил драйверы своего графического процессора, и теперь я использую последнюю версию Vulkan SDK (1.1.101.0), но все еще ничего;Анализ сэмплера в RenderDoc не вызывает проблем, я использую правильный фильтр;Удаление / не использование mipmaps не помогает;Ни одной ошибки на уровне валидации.
Я начинаю думать, что мой GPU по-прежнему не очень хорошо поддерживает Vulkan (Intel HD Graphics 620), поэтому, думаю, мне придется принять его и продолжать, знаяпо крайней мере, это будет работать на других ПК.