Russian Qt Forum
Март 28, 2024, 12:26
Добро пожаловать,
Гость
. Пожалуйста,
войдите
или
зарегистрируйтесь
.
Вам не пришло
письмо с кодом активации?
1 час
1 день
1 неделя
1 месяц
Навсегда
Войти
Начало
Форум
WIKI (Вики)
FAQ
Помощь
Поиск
Войти
Регистрация
Russian Qt Forum
>
Forum
>
Qt
>
OpenGL
>
Не могу осилить usampler2d
Страниц: [
1
]
Вниз
« предыдущая тема
следующая тема »
Печать
Автор
Тема: Не могу осилить usampler2d (Прочитано 9336 раз)
Авварон
Джедай : наставник для всех
Offline
Сообщений: 3257
Не могу осилить usampler2d
«
:
Октябрь 04, 2018, 00:26 »
В тред призывается
Igors
.
Вот я делаю текстуру:
Код:
QImage image(256, 256, QImage::Format::Format_RGBA8888);
image.fill(QColor(255, 127, 63, 255));
m_texture = std::make_unique<QOpenGLTexture>(QOpenGLTexture::Target::Target2D);
m_texture->setFormat(QOpenGLTexture::TextureFormat::RGBA8U);
m_texture->setSize(256, 256);
m_texture->setMipLevels(8);
m_texture->allocateStorage();
m_texture->setData(QOpenGLTexture::PixelFormat::RGBA_Integer, QOpenGLTexture::PixelType::UInt8, image.constBits());
Вот делаю простой шейдер:
Код:
#version 330 core
in vec2 TexCoord;
out vec4 color;
uniform usampler2D ourTexture1;
void main()
{
uvec4 d = texture(ourTexture1, TexCoord);
color = vec4(d.r / 255.0f, d.g / 255.0f, d.b / 255.0f, 1.0);
}
Результат - черный квадрат.
Если использовать sampler2D, сочетание QOpenGLTexture::TextureFormat::RGBA8_Unorm / QOpenGLTexture::PixelFormat::RGBA и не нормализовать руками, то работает, как и ожидалось.
ЧЯДНТ?
Записан
Igors
Джедай : наставник для всех
Offline
Сообщений: 11445
Re: Не могу осилить usampler2d
«
Ответ #1 :
Октябрь 04, 2018, 06:13 »
А что "Igors", долбление справочников никто не отменял
Переведите все константы в оригиналы и см
TextureImage2D
. Вижу хотите иметь в шейдере не нормализованную текстуру, ну вроде GL_RGBA8UI (TextureFormat::RGBA8U) верно. А вот GL_RGBA_INTEGER (PixelFormat::RGBA_Integer) подозрительно. я бы попробовал простецкое GL_RGBA. Ну и провериться glGetError не помешает (зачистить перед вызовом)
Записан
Авварон
Джедай : наставник для всех
Offline
Сообщений: 3257
Re: Не могу осилить usampler2d
«
Ответ #2 :
Октябрь 04, 2018, 12:06 »
А чо долбление справочников, я уже кучу дней потратил на это.
Нашел в сети примеры наконец, построчно начал копировать.
Оказалось, дефолтные значения констант для генерации мипмап не подходят. Очень интуитивно.
Так заработало:
Код:
m_funcs->glGenTextures(1, &m_textureId);
m_funcs->glPixelStorei(GL_UNPACK_ALIGNMENT, 4);
m_funcs->glBindTexture(GL_TEXTURE_2D, m_textureId);
m_funcs->glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST_MIPMAP_NEAREST); // вот это нужно!
m_funcs->glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); // и это!
m_funcs->glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8UI, 256, 256, 0, GL_RGBA_INTEGER, GL_UNSIGNED_BYTE, m_image.imageData({0, 0}).data());
m_funcs->glGenerateMipmap(GL_TEXTURE_2D);
m_funcs->glBindTexture(GL_TEXTURE_2D, 0);
«
Последнее редактирование: Октябрь 04, 2018, 12:09 от Авварон
»
Записан
Igors
Джедай : наставник для всех
Offline
Сообщений: 11445
Re: Не могу осилить usampler2d
«
Ответ #3 :
Октябрь 05, 2018, 08:51 »
Цитата: Авварон от Октябрь 04, 2018, 12:06
Код:
m_funcs->glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST_MIPMAP_NEAREST); // вот это нужно!
m_funcs->glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); // и это!
Обычно чтобы рендерить текстурированные объекты сцены ставят LINEAR (последнее слово), а NEAREST используют для специфических задач (напр получить выхлоп "пиксель в пиксель"). Какой там по умолчанию - хз, проще самому задать. Расскажите чего хотите добиться, а так все сведется к справочнику (спецификации)
Записан
Авварон
Джедай : наставник для всех
Offline
Сообщений: 3257
Re: Не могу осилить usampler2d
«
Ответ #4 :
Октябрь 05, 2018, 15:24 »
Цитата: Igors от Октябрь 05, 2018, 08:51
Цитата: Авварон от Октябрь 04, 2018, 12:06
Код:
m_funcs->glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST_MIPMAP_NEAREST); // вот это нужно!
m_funcs->glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); // и это!
Обычно чтобы рендерить текстурированные объекты сцены ставят LINEAR (последнее слово), а NEAREST используют для специфических задач (напр получить выхлоп "пиксель в пиксель"). Какой там по умолчанию - хз, проще самому задать. Расскажите чего хотите добиться, а так все сведется к справочнику (спецификации)
Да мне сперва просто нарисовать было бы, чтобы разбораться. Но спасибо за информацию.
Верно я понимаю, если я хочу выводит текстуру 1в1 то лучше NEAREST?
Записан
Igors
Джедай : наставник для всех
Offline
Сообщений: 11445
Re: Не могу осилить usampler2d
«
Ответ #5 :
Октябрь 06, 2018, 10:44 »
Цитата: Авварон от Октябрь 05, 2018, 15:24
Верно я понимаю, если я хочу выводит текстуру 1в1 то лучше NEAREST?
Да, верно, но тогда и размер выводимого должен быть = размеру текстуры. А если хотите использовать карту как хранилище текстур, то можно обойтись и без рендера, ф-ции выгрузки текстуры в RAM есть.
Еще общие сведения. Разные пиксели полученного изображения соответствуют разным площадям в мире. Напр пиксель у линии горизонта свободно может покрывать квадратный километр сцены, а др пиксель, под носом у камеры, лишь миллиметры. Соответственно в первый пиксель попадет, напр, площадь текстуры 100Х100 пикселей. Если просто дернуть из текстуры ближайший - получим звон/рванину, a осреднять 100Х100 накладно. В OpenGL это решается MIP'ами (часто в сочетании с anisotropic). Поэтому неясно зачем строить MIP'ы если хотите текстуру 1:1
Записан
Авварон
Джедай : наставник для всех
Offline
Сообщений: 3257
Re: Не могу осилить usampler2d
«
Ответ #6 :
Октябрь 06, 2018, 13:09 »
Цитата: Igors от Октябрь 06, 2018, 10:44
Поэтому неясно зачем строить MIP'ы если хотите текстуру 1:1
Хорошее замечание, возможно, она не совсем 1в1 и я где-то накосячил с преобразованиями.
Но без мипов она не рисуется вовсе - вижу черный квадрат.
За наводку спасибо, покурю преобразования.
Записан
Страниц: [
1
]
Вверх
Печать
« предыдущая тема
следующая тема »
Перейти в:
Пожалуйста, выберите назначение:
-----------------------------
Qt
-----------------------------
=> Вопросы новичков
=> Уроки и статьи
=> Установка, сборка, отладка, тестирование
=> Общие вопросы
=> Пользовательский интерфейс (GUI)
=> Qt Quick
=> Model-View (MV)
=> Базы данных
=> Работа с сетью
=> Многопоточное программирование, процессы
=> Мультимедиа
=> 2D и 3D графика
=> OpenGL
=> Печать
=> Интернационализация, локализация
=> QSS
=> XML
=> Qt Script, QtWebKit
=> ActiveX
=> Qt Embedded
=> Дополнительные компоненты
=> Кладовая готовых решений
=> Вклад сообщества в Qt
=> Qt-инструментарий
-----------------------------
Программирование
-----------------------------
=> Общий
=> С/C++
=> Python
=> Алгоритмы
=> Базы данных
=> Разработка игр
-----------------------------
Компиляторы и платформы
-----------------------------
=> Linux
=> Windows
=> Mac OS X
=> Компиляторы
===> Visual C++
-----------------------------
Разное
-----------------------------
=> Новости
===> Новости Qt сообщества
===> Новости IT сферы
=> Говорилка
=> Юмор
=> Объявления
Загружается...