Мне удалось нарисовать блоки, но текстуры применяются только к одной стороне, а другие стороны просто черные.
Вот как это выглядит
Я пробовал использовать массив текстур, но не до конца понимаю, как с ним работать.
Вот как я его создаю:
Код: Выделить всё
TextureArray::TextureArray(std::vector images)
{
int img_width, img_height, color_channels_number;
std::vector images_data;
stbi_set_flip_vertically_on_load(true);
for (const std::string& path : images)
{
unsigned char* bytes = stbi_load(path.c_str(), &img_width, &img_height, &color_channels_number, 4);
if (bytes != nullptr)
{
images_data.push_back(bytes);
}
}
glGenTextures(1, &id);
glBindTexture(GL_TEXTURE_2D_ARRAY, id);
glTexImage3D(GL_TEXTURE_2D_ARRAY, 0, GL_RGBA8, 512, 512, images_data.size(), 0, GL_RGBA, GL_UNSIGNED_BYTE, nullptr);
for (int i = 0; i < 1; i++)
{
if (images_data[i])
{
glTexSubImage3D(GL_TEXTURE_2D_ARRAY, 0, 0, 0, i, 512, 512, 1, GL_RGBA, GL_UNSIGNED_BYTE, images_data[i]);
}
}
glTexParameteri(GL_TEXTURE_2D_ARRAY, GL_TEXTURE_WRAP_S, GL_REPEAT);
glTexParameteri(GL_TEXTURE_2D_ARRAY, GL_TEXTURE_WRAP_T, GL_REPEAT);
glTexParameteri(GL_TEXTURE_2D_ARRAY, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D_ARRAY, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
for (unsigned char* data : images_data)
{
stbi_image_free(data);
}
glBindTexture(GL_TEXTURE_2D_ARRAY, 0);
}
Код: Выделить всё
std::vector image_paths =
{
"block-top.jpg", "block-top.jpg", "block-top.jpg",
"block-top.jpg", "block-top.jpg", "block-top.jpg"
};
TextureArray texture_array(image_paths);
glActiveTexture(GL_TEXTURE0);
glBindTexture(GL_TEXTURE_2D_ARRAY, texture_array.id);
glUseProgram(shader_program.id);
glUniform1i(glGetUniformLocation(shader_program.id, "texArray"), 0);
Код: Выделить всё
#version 330 core
in vec3 color;
in vec2 texCoord;
flat in float texIndex;
out vec4 FragColor;
uniform sampler2D tex0;
uniform sampler2DArray texArray;
void main()
{
FragColor = texture(texArray, vec3(texCoord, texIndex));
}
texIndex здесь — это просто число от 0 до 5 (например, передняя грань — 0, задняя грань — 1, левая грань — 2 и т. д.), которое я получаю из своего массива вершин.
texIndex здесь — это просто число от 0 до 5 (например, передняя грань — 0, задняя грань — 1, левая грань — 2 и т. д.). p>
Что я делаю не так? Возможно есть другой способ отрендерить блок с разными текстурами по бокам? Если да, то какой из них лучше, наиболее оптимизирован и требует минимального количества вызовов отрисовки?
Подробнее здесь: https://stackoverflow.com/questions/786 ... -the-sides