lock&_lock Ответов: 1

Помогите с современной функцией вызова opengl для создания текстуры ?


Привет, я пытаюсь работать с мультитекстурой, используя почву. Я думаю, что это ошибка в том, как я называю текстуру. Теперь у меня есть 2 текстуры с 2 разными источниками изображения (текстура 1 и текстура 2), они выглядят так :

Текстура :
glActiveTexture(GL_TEXTURE0); 
glBindTexture(GL_TEXTURE_2D, textures[0]); 
(...) 

image1 = SOIL_load_image("res/img1.png",&width,&height,0,SOIL_LOAD_RGBA); 
//"res/img2.png" for image2 
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, width, height,0, GL_RGBA, GL_UNSIGNED_BYTE, image1); 
SOIL_free_image_data(image1); 

изображение 1 для текстуры 1 и изображение 2 для текстуры 2.

Это работает, и я могу вызвать их, меняя текстуру. Теперь я пытаюсь изменить Источник Изображения для текстуры 1 и текстуры 2 как одно и то же изображение (img0).

Я создал функцию changed(), используя входное изображение (img0), затем я сделаю некоторую модификацию пикселей с помощью img0 и сохраню результаты как t1 и t2 (оба беззнаковых символа). Я хочу использовать t1 в качестве источника для texture1 и t2 в качестве источника для texture2, чтобы я мог позвонить и переключиться между ними позже. (код довольно длинный, пожалуйста, дайте мне знать, если вы хотите, чтобы я включил их).

Что я уже пробовал:

Я попытался вызвать эту функцию следующим образом :

 //create texture===================================================== 
GLuint textures[2]; 
glGenTextures(2, textures);   

image = SOIL_load_image("res/img0.png", &width, &height, 0, SOIL_LOAD_RGBA); 
if (image == NULL) exit(0); 
image1 = NULL; //(image1 = t1 later in changed() func.)
image2 = NULL; //(image2 = t2 later in changed() func.)
changed();   

//Texture 1 
glActiveTexture(GL_TEXTURE0); 
glBindTexture(GL_TEXTURE_2D, textures[0]); 
(...)  
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, width, height, 0, GL_RGBA, GL_UNSIGNED_BYTE, image1); 
SOIL_free_image_data(image1); 

//then Texture 2 with image2

Но это не работает, никакой ошибки и никакого изображения, нарисованного на сцене. Я проверил, изменив значение прозрачного цветового буфера, и цветовой буфер работает.Так что это проблема с вызовом функции и передачей моего изображения. Есть предложения ?

[ОБНОВЛЕНИЕ]

Я добавил код обработки ошибок для проверки, например :
while (!(err = glGetError())) { 		
            cout << "some error message" << err << endl; 	
        }

И оказалось, что ошибка происходит после того, как я загрузил исходный код изображения :
image = SOIL_load_image("res/img0.png", &width, &height, 0, SOIL_LOAD_RGBA);

Как правильно загрузить изображение, используя почву в качестве источника для функции ?
Это тот же самый способ, которым я сделал это с GLUT, и он работает, отличается ли он от GLFW ?

[ОБНОВЛЕНИЕ СНОВА]

Я заменил обработку ошибок этим, и программа все еще работает. Не выход, так что определенно изображение есть.
if (image == NULL) {
		cout << "Error loading image source." << err << endl;
		exit(0);
	}

Я также попытался распечатать ширину и высоту изображения, и я получил правильный результат на консоли.
cout << width << " x " << height;

Но изображение не показывается. Мне нужно только, чтобы это изображение было входом моей функции, и позже моя функция будет генерировать результат изображения 2, я буду использовать его как текстуру 1 и текстуру 2. - Помочь ?

1 Ответов

Рейтинг:
0

KarstenK

Когда вы хотите переключаться между изображениями, то было бы проще иметь флаг, который можно использовать. Любая деятельность по загрузке или перезагрузке плохо сказывается на производительности.

Придерживайтесь мантры: стартап. загружайте и изменяйте только один раз все статические данные.


lock&amp;_lock

Привет, я уже могу переключаться между текстурами.
Проблема в другом, я хочу использовать одно и то же изображение для создания разных источников для каждой текстуры.