Russian Qt Forum
Ноябрь 22, 2024, 03:58 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Не могу осилить usampler2d  (Прочитано 10286 раз)
Авварон
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3260


Просмотр профиля
« : Октябрь 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 Offline

Сообщений: 11445


Просмотр профиля
« Ответ #1 : Октябрь 04, 2018, 06:13 »

А что "Igors", долбление справочников никто не отменял  Улыбающийся Переведите все константы в оригиналы и см TextureImage2D. Вижу хотите иметь в шейдере не нормализованную текстуру, ну вроде GL_RGBA8UI (TextureFormat::RGBA8U) верно. А вот GL_RGBA_INTEGER (PixelFormat::RGBA_Integer) подозрительно. я бы попробовал простецкое GL_RGBA. Ну и провериться glGetError не помешает (зачистить перед вызовом)
Записан
Авварон
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3260


Просмотр профиля
« Ответ #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 Offline

Сообщений: 11445


Просмотр профиля
« Ответ #3 : Октябрь 05, 2018, 08:51 »

Код:
    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 Offline

Сообщений: 3260


Просмотр профиля
« Ответ #4 : Октябрь 05, 2018, 15:24 »

Код:
    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 Offline

Сообщений: 11445


Просмотр профиля
« Ответ #5 : Октябрь 06, 2018, 10:44 »

Верно я понимаю, если я хочу выводит текстуру 1в1 то лучше NEAREST?
Да, верно, но тогда и размер выводимого должен быть = размеру текстуры. А если хотите использовать карту как хранилище текстур, то можно обойтись и без рендера, ф-ции выгрузки текстуры в RAM есть.

Еще общие сведения. Разные пиксели полученного изображения соответствуют разным площадям в мире. Напр пиксель у линии горизонта свободно может покрывать квадратный километр сцены, а др пиксель, под носом у камеры, лишь миллиметры. Соответственно в первый пиксель попадет, напр, площадь текстуры 100Х100 пикселей. Если просто дернуть из текстуры ближайший - получим звон/рванину, a осреднять 100Х100 накладно. В OpenGL это решается MIP'ами (часто в сочетании с anisotropic). Поэтому неясно зачем строить MIP'ы если хотите текстуру 1:1
Записан
Авварон
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3260


Просмотр профиля
« Ответ #6 : Октябрь 06, 2018, 13:09 »

Поэтому неясно зачем строить MIP'ы если хотите текстуру 1:1

Хорошее замечание, возможно, она не совсем 1в1 и я где-то накосячил с преобразованиями.
Но без мипов она не рисуется вовсе - вижу черный квадрат.
За наводку спасибо, покурю преобразования.
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.056 секунд. Запросов: 23.