Форум программистов
 
Контакты: о проблемах с регистрацией, почтой и по другим вопросам пишите сюда - alarforum@yandex.ru, проверяйте папку спам! Обязательно пройдите активизацию e-mail.
Внимание! Некоторое время письма не доходят до аккаунтов MAIL RU GROUP, не доходят на все почтовые ящики mail.ru, inbox.ru, bk.ru. Пишите им жалобы, чтобы быстрее восстановили получение писем, регистрируйтесь через яндекс почту и gmail, туда письма с активизацией доходят.

Вернуться   Форум программистов > разработка игр, графический дизайн и моделирование > Gamedev - cоздание игр: Unity, OpenGL, DirectX
Регистрация

Восстановить пароль
Повторная активизация e-mail

Ответ
 
Опции темы
Старый 07.05.2018, 03:16   #1
Delano
 
Регистрация: 10.12.2017
Сообщений: 4
Репутация: 10
По умолчанию Использование sampler2DArray и OpenGL C++

Доброго времени суток. Могли бы вы подсказать каким образом реализовать загрузку массива текстур? Использую загрузчик std_image. Пример моего кода загрузки одной текстуры:

Код:
Код:

unsigned int loadTexture(char const * path)
{
    unsigned int textureID;
    glGenTextures(1, &textureID);

    int width, height, nrComponents;
    unsigned char *data = stbi_load(path, &width, &height, &nrComponents, 0);
    if (data)
    {
        GLenum format;
        if (nrComponents == 1)
            format = GL_RED;
        else if (nrComponents == 3)
            format = GL_RGB;
        else if (nrComponents == 4)
            format = GL_RGBA;

        glBindTexture(GL_TEXTURE_2D, textureID);
        glTexImage2D(GL_TEXTURE_2D, 0, format, width, height, 0, format, GL_UNSIGNED_BYTE, data);
        glGenerateMipmap(GL_TEXTURE_2D);

        glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_LINEAR);
        glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_LINEAR);
        glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST_MIPMAP_LINEAR);
        glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);

        stbi_image_free(data);
    }
    else
    {
        std::cout << "Texture failed to load at path: " << path << std::endl;
        stbi_image_free(data);
    }

    return textureID;
}

В фрагментном шейдере:
Код:

#version 330 core
out vec4 color;
in vec2 UV;
uniform sampler2DArray TextureArray;

void main(){
	vec4 color = texture(TextureArray, vec3(UV, 0)); //UV - тексели, 0 - номер слоя
}

Как я понимаю вместо glTexImage2D надо юзать glTexImage3D и GL_TEXTURE_2D заменить на GL_TEXTURE_2D_ARRAY, а так же каким-то образом указать OpenGL максимальное количество слоёв(LAYERS) или выделить память(?), где-то прочитал, что без этого не загрузятся текстуры, но не уверен так ли это. Пытался всячески реализовать это, но так и не вышло. Буду благодарен за помощь.

Должно быть похоже вроде как на это, полагаю:
Код:

unsigned int loadTextureArray(std::vector<std::string> path)
{
    unsigned int textureID;
    glGenTextures(1, &textureID);

    int width, height, nrComponents;
    for (unsigned int layer=0; layer<path.size(); layer++){
        unsigned char *data = stbi_load(path[layer].c_str(), &width, &height, &nrComponents, 0);
        if (data)
        {
            GLenum format;
            if (nrComponents == 1)
                format = GL_RED;
            else if (nrComponents == 3)
                format = GL_RGB;
            else if (nrComponents == 4)
                format = GL_RGBA;

            glBindTexture(GL_TEXTURE_2D_ARRAY, textureID);
            glTexImage3D(GL_TEXTURE_2D_ARRAY, 0, format, width, height, layer, 0, format, GL_UNSIGNED_BYTE, data);
            glGenerateMipmap(GL_TEXTURE_2D_ARRAY);

            glTexParameteri(GL_TEXTURE_2D_ARRAY, GL_TEXTURE_WRAP_S, GL_LINEAR);
            glTexParameteri(GL_TEXTURE_2D_ARRAY, GL_TEXTURE_WRAP_T, GL_LINEAR);
            glTexParameteri(GL_TEXTURE_2D_ARRAY, GL_TEXTURE_MIN_FILTER, GL_NEAREST_MIPMAP_LINEAR);
            glTexParameteri(GL_TEXTURE_2D_ARRAY, GL_TEXTURE_MAG_FILTER, GL_NEAREST);

            stbi_image_free(data);
        }
        else
        {
            std::cout << "Texture failed to load at path: " << path[layer].c_str() << std::endl;
            stbi_image_free(data);
        }
    }
    return textureID;
}


Последний раз редактировалось Delano; 07.05.2018 в 03:22.
Delano вне форума   Ответить с цитированием
Ответ

Опции темы

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Qt+OpenGL. Qt "не видит" функции OpenGL EnterFix Qt и кроссплатформенное программирование С/С++ 4 29.01.2013 18:59
Использование функции чужого приложения/OpenGL coNsept Общие вопросы C/C++ 7 31.12.2010 17:15
создание диаграммы Ганта(ленточный график) с использование OpenGL mc_patrick Помощь студентам 0 30.10.2010 16:25
OpenGL StudentofSUSU Помощь студентам 2 15.03.2010 20:26
Использование OpenGL. Ошибка. IgorKr Общие вопросы Delphi 2 11.04.2008 23:11


20:32.


Powered by vBulletin® Version 3.8.8 Beta 2
Copyright ©2000 - 2018, Jelsoft Enterprises Ltd.

RusProfile.ru


Справочник российских юридических лиц и организаций.
Проекты отопления, пеллетные котлы, бойлеры, радиаторы
интернет магазин respective.ru