Как нарисовать куб в OpenGL 3.3 с разными текстурами по бокам [закрыто]C++

Программы на C++. Форум разработчиков
Ответить Пред. темаСлед. тема
Anonymous
 Как нарисовать куб в OpenGL 3.3 с разными текстурами по бокам [закрыто]

Сообщение Anonymous »

Я пытаюсь создать своего рода клон Minecraft на C++ и OpenGL 3.3 и в настоящее время работаю над рендерингом блоков (например, блоков травы в Minecraft, которые состоят из разных текстур с каждой стороны), но у меня возникают проблемы с текстурированием.
Мне удалось нарисовать блоки, но текстуры применяются только к одной стороне, а другие стороны просто черные.
Вот как это выглядит
Я пробовал использовать массив текстур, но не до конца понимаю, как с ним работать.
Вот как я его создаю:

Код: Выделить всё

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);
}
В main.cpp это выглядит так:

Код: Выделить всё

    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 и т. д.), которое я получаю из своего массива вершин.
texIndex здесь — это просто число от 0 до 5 (например, передняя грань — 0, задняя грань — 1, левая грань — 2 и т. д.). p>
Что я делаю не так? Возможно есть другой способ отрендерить блок с разными текстурами по бокам? Если да, то какой из них лучше, наиболее оптимизирован и требует минимального количества вызовов отрисовки?

Подробнее здесь: https://stackoverflow.com/questions/786 ... -the-sides
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «C++»