Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > разработка игр, графический дизайн и моделирование > Gamedev - cоздание игр: Unity, OpenGL, DirectX
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 24.07.2016, 19:19   #1
koker_007
Пользователь
 
Аватар для koker_007
 
Регистрация: 30.03.2015
Сообщений: 35
Восклицание OpenGL - Проблема использования текстурного массива

Здравствуйте, в общем пытаюсь в 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, по этому хотелось бы понять в чем ошибка и использовать массив в дальнейшем.
ученик самоучка
koker_007 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Функция без использования массива TAHK56 Visual C++ 1 04.06.2012 14:55
Палиндром без использования массива Pingvinenok_Lolo Помощь студентам 17 13.11.2011 02:27
Пример использования многомерного массива Ципихович Эндрю JavaScript, Ajax 3 15.10.2011 15:31
Выполнить программку без использования симв. массива (Си) Defa4ka Помощь студентам 1 26.10.2009 02:11