Vulkan: Fixed GL_NEAREST and GL_LINEAR not applying correctly on min

This commit is contained in:
korenkonder
2026-01-27 19:29:41 +03:00
parent 6037138909
commit 3be69a568b
3 changed files with 18 additions and 6 deletions
+3 -3
View File
@@ -11,7 +11,7 @@ namespace Vulkan {
Sampler::Sampler(VkDevice device, VkSamplerCreateFlags flags, VkFilter mag_filter,
VkFilter min_filter, VkSamplerMipmapMode mipmap_mode, float_t mip_lod_bias,
VkSamplerAddressMode address_mode_u, VkSamplerAddressMode address_mode_v,
VkSamplerAddressMode address_mode_w, float_t min_lod, float_t max_lod,
VkSamplerAddressMode address_mode_w, bool no_mipmap, float_t min_lod, float_t max_lod,
float_t max_anisotropy, VkBorderColor border_color) {
VkSamplerCreateInfo sampler_create_info = {};
sampler_create_info.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
@@ -28,8 +28,8 @@ namespace Vulkan {
sampler_create_info.maxAnisotropy = min_def(max_anisotropy, 16.0f);
sampler_create_info.compareEnable = VK_FALSE;
sampler_create_info.compareOp = VK_COMPARE_OP_LESS_OR_EQUAL;
sampler_create_info.minLod = min_lod;
sampler_create_info.maxLod = max_lod;
sampler_create_info.minLod = no_mipmap ? clamp_def(min_lod, 0.0f, 0.25f) : min_lod;
sampler_create_info.maxLod = no_mipmap ? clamp_def(max_lod, 0.0f, 0.25f) : max_lod;
sampler_create_info.borderColor = border_color;
sampler_create_info.unnormalizedCoordinates = VK_FALSE;
+1 -1
View File
@@ -17,7 +17,7 @@ namespace Vulkan {
Sampler(VkDevice device, VkSamplerCreateFlags flags, VkFilter mag_filter,
VkFilter min_filter, VkSamplerMipmapMode mipmap_mode, float_t mip_lod_bias,
VkSamplerAddressMode address_mode_u, VkSamplerAddressMode address_mode_v,
VkSamplerAddressMode address_mode_w, float_t min_lod, float_t max_lod,
VkSamplerAddressMode address_mode_w, bool no_mipmap, float_t min_lod, float_t max_lod,
float_t max_anisotropy, VkBorderColor border_color);
~Sampler();
+14 -2
View File
@@ -633,17 +633,26 @@ namespace Vulkan {
return elem->second;
VkFilter vk_mag_filter = sampler_data.mag_filter != GL_NEAREST ? VK_FILTER_LINEAR : VK_FILTER_NEAREST;
bool no_mipmap = false;
VkFilter vk_min_filter;
VkSamplerMipmapMode vk_mipmap_mode;
switch (sampler_data.min_filter) {
case GL_NEAREST:
no_mipmap = true;
vk_min_filter = VK_FILTER_NEAREST;
vk_mipmap_mode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
break;
case GL_NEAREST_MIPMAP_NEAREST:
vk_min_filter = VK_FILTER_NEAREST;
vk_mipmap_mode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
break;
case GL_LINEAR:
case GL_LINEAR_MIPMAP_NEAREST:
default:
no_mipmap = true;
vk_min_filter = VK_FILTER_LINEAR;
vk_mipmap_mode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
break;
case GL_LINEAR_MIPMAP_NEAREST:
vk_min_filter = VK_FILTER_LINEAR;
vk_mipmap_mode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
break;
@@ -657,6 +666,9 @@ namespace Vulkan {
break;
}
float_t min_lod = max_def(sampler_data.min_lod, 0.0f);
float_t max_lod = max_def(sampler_data.max_lod, min_lod);
VkBorderColor vk_border_color;
if (sampler_data.border_color == 0.0f)
vk_border_color = VK_BORDER_COLOR_FLOAT_TRANSPARENT_BLACK;
@@ -672,7 +684,7 @@ namespace Vulkan {
get_sampler_address_mode(sampler_data.wrap_s),
get_sampler_address_mode(sampler_data.wrap_t),
get_sampler_address_mode(sampler_data.wrap_r),
sampler_data.min_lod, sampler_data.max_lod,
no_mipmap, min_lod, max_lod,
sampler_data.max_anisotropy, vk_border_color));
samplers.insert({ sampler_hash, sampler });
return sampler;