Доброго времени суток. Могли бы вы подсказать каким образом реализовать загрузку массива текстур? Использую загрузчик 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;
}