2016-11-01 3 views
1

Я пытаюсь использовать mipmapping с вулканом. Я понимаю, что я должен использовать vkCmdBlit между каждым слоем для каждого изображения, но перед этим я просто хотел знать, как изменить слой в GLSL.Странное поведение с использованием mipmapping из glsl

Вот что я сделал. Сначала я загружаю и рисую текстуру (используя слой 0), и проблем не было. «Полученное изображение» - это текстура, которую я загружаю, так что это хорошо.

Во-вторых, я использую этот шейдер (так что я хотел использовать второй слой (номер 1)), но «вынесенное изображение» не меняется:

#version 450 

layout(set = 0, binding = 0) uniform sampler2D tex; 

in vec2 texCoords; 

layout(location = 0) out vec4 outColor; 

void main() { 
    outColor = textureLod(tex, texCoords, 1); 
} 

По мне, тонированное изображение должно быть изменено, но совсем нет, это всегда одно и то же изображение, даже если я увеличиваю «1» (номер слоя).

В-третьих, вместо изменения чего-либо в коде glsl я изменяю номер слоя в ImageSubresourceRange, чтобы создать imageView, и «визуализированное изображение» изменилось, поэтому для меня это кажется нормальным, и когда я буду использовать vkCmdBlit, я должен увидеть исходное изображение в нижнем разрешении.

Настоящая проблема заключается в том, что когда я пытаюсь использовать mipmapping (через mipmapping) в GLSL, это вообще не влияет на визуализированное изображение, но на C++ оно делает (и это кажется справедливым).

здесь (все) мой исходный код https://github.com/qnope/Vulkan-Example/tree/master/Mipmap

+0

«По моему мнению, визуализированное изображение должно быть изменено, но не на всех, это всегда одно и то же изображение, даже если я увеличиваю« 1 »(номер слоя). *« Почему? Вы извлекаете из текстуры. Почему бы вам, если вы хотите, повлиять на то, что вы пишете? Обычно вы ожидаете, что параметры, которые вы передаете вызову функции, влияют на то, какая переменная или ячейка памяти хранится в возвращаемом значении функции? –

+0

Поскольку я еще не использовал vkCmdBlit, содержимое памяти, которое я прочитал, должно быть не определено ^^ –

ответ

2

Судя по вашему умолчанию информация создания пробоотборник (https://github.com/qnope/Vulkan-Example/blob/master/Mipmap/VkTools/System/sampler.cpp#L28) вы всегда установить элемент maxLod ваших пробников к нулю, так что ваш лод всегда зажат между 0.0 и 0.0 (minLod/maxLod). Это соответствовало бы описанному вами поведению.

Так что попробуйте установить член maxLod вашей информации о создании пробоотбора на фактическое количество мип-карт в вашей текстуре и изменить уровень ложа в шейдерном shoudl.

+0

Спасибо! Он работал Но я пока не понимаю, почему эти значения должны быть float ^^. Я установил одно значение для maxLod для этого сэмплера, в этом случае я мог бы повторно использовать его для нескольких текстур: p –

+0

Если вы хотите знать, почему min и max lod являются float, посмотрите раздел уровня детализации из спецификации (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/xhtml/vkspec.html#textures-level-of-detail-operation). И использование одного пробоотборника с «просто большим значением для maxLod» не является хорошей идеей из-за нескольких причин, например. если вы попробуете без явного ввода. –

+0

Так что, я бы пошел, как вы Один кортеж Image/ImageView/Sampler :) –