Здравствуйте, в общем пытаюсь в OpenGL 4.0 с помощью текстурного массива GL_TEXTURE_2D_ARRAY наложить разные текстуры.
По одиночки с помощью GL_TEXTURE_2D загрузить и наложить текстуры уже получалось, но используя GL_TEXTURE_2D_ARRAY с теми же параметрами полигоны окрашиваются в черный цвет и ничего не накладывается.
Помогите определить в чем проблема.
FZjcX0Z1xIA - копия - копия (2).jpg
Код загрузки текстур в программу с помощью DevIL (OpenIL)
Код:
//Функция загрузки текстуры
void LoadTexture(wchar_t *filename, TextureImage *texture) {
ilGenImages(1, &texture->textureID);
ilBindImage(texture->textureID);
ilLoadImage(filename);
int err = ilGetError(); //Проверка на ошибку
if (err != IL_NO_ERROR) {
//Много кода ........
}
//Параметры текстуры
texture->width = ilGetInteger(IL_IMAGE_WIDTH); // Ширина
texture->height = ilGetInteger(IL_IMAGE_HEIGHT);// Высота
texture->byte_one_pixel = ilGetInteger(IL_IMAGE_BYTES_PER_PIXEL); //Количетсво байт на один пиксель
//Загрузка данных в текстуру
texture->imageData = ilGetData(); //данные
ilEnable(IL_CONV_PAL);
texture->typeData = ilGetInteger(IL_IMAGE_FORMAT);//Тип данных
}
Код загрузки изображений в текстурный массив
Код:
//Тест загрузки нескольких текстур
void LoadTexture_in_OpenGL() {
int GL_Error = glGetError();
if (GL_Error != GL_NO_ERROR) {
fprintf(stderr, "Error 010: ");
}
wchar_t FileName1[] = L"textures/Test1.jpg";
wchar_t FileName2[] = L"textures/test2.jpg";
LoadTexture(FileName1, &Textures_Mass[0]);
LoadTexture(FileName2, &Textures_Mass[1]);
glGenTextures(1, &TextureID); //создаем ID описатель текстуры.. лиш для одной текстуры (это будет 2D Array)
glBindTexture(GL_TEXTURE_2D_ARRAY, TextureID); //Говорим использовать этот описатель текстуры
GLuint depth_texture_array = 3; //Задаем количество слоев в нашей текстуре.. под 20 будуших текстур
glTexStorage3D(GL_TEXTURE_2D_ARRAY, GL_RGB8, 0,Textures_Mass[0].width, Textures_Mass[0].height, depth_texture_array); //создана "пустышка" неизменяемой текстуры
//добавление 1-ой текстуры в текстурный массив, 0-вым слоем
glTexSubImage3D(GL_TEXTURE_2D_ARRAY,0, 0, 0, 0, Textures_Mass[0].width, Textures_Mass[0].height, 1, GL_RGB, GL_UNSIGNED_BYTE, Textures_Mass[0].imageData);
//добавление 2-ой текстуры в текстурный массив, 1-вым слоем
glTexSubImage3D(GL_TEXTURE_2D_ARRAY, 0, 0, 0, 1, Textures_Mass[1].width, Textures_Mass[1].height, 1, GL_RGB, GL_UNSIGNED_BYTE, Textures_Mass[1].imageData);
glTexParameteri(GL_TEXTURE_2D_ARRAY, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D_ARRAY, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
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_WRAP_R, GL_REPEAT);
if (GL_Error != GL_NO_ERROR) {
fprintf(stderr, "Error: ");
}
}
//...
// много кода не связанных с текстурами
//...
GLuint location2 = glGetUniformLocation(Shaders_Very_Low.program, "Textur_Array");
glUniform1i(location2, 0);
Шейдеры
Код:
const GLchar* VertShaderCode_VeryLow = R"END(
#version 430
layout (location = 0) in vec3 VertexPosition;
layout (location = 1) in vec3 VertexColor;
layout (location = 2) in vec3 VertexTexCoord;
layout (location = 3) in int VertexTexID;
out vec3 Color;
out vec3 TexCoord;
out int TexID;
uniform mat4 MVPMatrix;
void main()
{
TexCoord = VertexTexCoord;
TexID = VertexTexID;
Color = VertexColor;
gl_Position = MVPMatrix * vec4(VertexPosition, 1.0);
gl_PointSize = 40; //Не проверенно
}
)END";
//Frag Shader Very Low
const GLchar* FragShaderCode_VeryLow = R"END(
#version 430
in vec3 TexCoord;
in vec3 Color;
in int TexID;
//uniform sampler2D Tex1;
uniform sampler2DArray Textur_Array;
out vec4 FragColor;
void main()
{
//FragColor = texture2D(Tex1, TexCoord.st);
FragColor = texture(Textur_Array, TexCoord);
}
)END";
Использование текстурного массива я нахожу очень удобным, нежели для каждой текстуры использовать GL_TEXTURE_2D, по этому хотелось бы понять в чем ошибка и использовать массив в дальнейшем.