mirror of
https://github.com/korenkonder/ReDIVA.git
synced 2026-10-01 19:28:02 +03:00
Vulkan: Fixed GL_NEAREST and GL_LINEAR not applying correctly on min
This commit is contained in:
@@ -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;
|
||||
|
||||
|
||||
@@ -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();
|
||||
|
||||
|
||||
@@ -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;
|
||||
|
||||
Reference in New Issue
Block a user