Форум программистов
 
Контакты: о проблемах с регистрацией, почтой и по другим вопросам пишите сюда - alarforum@yandex.ru, проверяйте папку спам! Обязательно пройдите активизацию e-mail.

Вернуться   Форум программистов > разработка игр, графический дизайн и моделирование > 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


00:11.


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

RusProfile.ru


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