Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

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

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

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 07.05.2018, 02:16   #1
Delano
 
Регистрация: 10.12.2017
Сообщений: 4
По умолчанию Использование 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 в 02:22.
Delano вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


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