Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2005.01.02;
Скачать: CL | DM;

Вниз

Перевод массива в текстуру   Найти похожие ветки 

 
Just3r   (2004-09-06 22:48) [0]

Пишу игрушку на конкурс по scorched earth, а пишу ее я на OpenGL. Соответственно весь массив игрового поля необходимо переводить в текстуру. Делается это так:
1) есть массив arr : array[1..width, 1..height, 0..2] of byte;
  есть текстура tex : gluInt;
2) создаем пока пустую текстуру
var
 ptr : pointer;
begin
 glGenTextures (1, @tex);
 glBindTexture (GL_TEXTURE_2D, tex);
 glTexEnvi (GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE);

 GetMem(arr, width *  * 3);
 glTexImage2D(GL_TEXTURE_2D, 0, 3, width, height, 0, GL_RGB, GL_UNSIGNED_BYTE, ptr);
 FreeMem(arr, width * height * 3);
 ...

3) теперь каждый кадр обновляем массив arr и переводим его в текстуру tex:
 glBindTexture(GL_TEXTURE_2D, tex);
 glTexImage2D (GL_TEXTURE_2D, 0, 3, Width, Height, 0, GL_RGB, GL_UNSIGNED_BYTE, @arr);

4) рендерим прямоугольник с текстурой
   glBegin (GL_QUADS);
     glTexCoord2f (0, 0); glVertex2i (0, 0);
     glTexCoord2f (1, 0); glVertex2i (0, Height);
     glTexCoord2f (1, 1); glVertex2i (Width, Height);
     glTexCoord2f (0, 1); glVertex2i (Width, 0);
   glEnd();

Теперь текстура выводится с большой странностью, она сжимается в два раза по вертикали. То есть она занимает именно тот размер, который надо (Width, Height), но в этом размере она укладывается два раза, как будто я удвоил текстурные координаты по вертикали. Кто нибудь знает в чем дело? Это дело я могу полечить, написав так:
     glTexCoord2f (0, 0);   glVertex2i (0, 0);
     glTexCoord2f (0.5, 0); glVertex2i (0, Height);
     glTexCoord2f (0.5, 1); glVertex2i (Width, Height);
     glTexCoord2f (0, 1);   glVertex2i (Width, 0);
Но мне все это не дает покоя. В чем же дело?


 
Zer0 ©   (2004-09-07 01:21) [1]

нельзя:
a) сделать текстуру с размерами не кратными степеням двойки
б) на некоторых старых видяхах - не квадатную

---


 
Just3r   (2004-09-07 17:07) [2]

все кратно двойке, видяха не старая


 
XProger ©   (2004-09-08 18:42) [3]


GetMem(arr, width * * 3);
glTexImage2D(GL_TEXTURE_2D, 0, 3, width, height, 0, GL_RGB, GL_UNSIGNED_BYTE, ptr);
FreeMem(arr, width * height * 3);

Дык, ты ж не ptr память выделил!
Попробуй так:

GetMem(ptr, width * height * 3);
glTexImage2D(GL_TEXTURE_2D, 0, 3, width, height, 0, GL_RGB, GL_UNSIGNED_BYTE, ptr);
FreeMem(ptr, width * height * 3);


 
Just3r   (2004-09-08 19:52) [4]

ты внимателен, это хорошо, а вот я не внимателен. у меня и было сделано так, как ты написал, это я здесь ошибся


 
XProger ©   (2004-09-08 20:42) [5]

Хм.
У тебя нет подобного кода:

glMatrixMode(GL_TEXTURE);
glScalef(1, 2, 1);
glMatrixMode(GL_MODEL_VIEW);

:)
или попробуй это:

const
GL_CLAMP_TO_EDGE = $812F;
...
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);

P.S.
Я сомневаюсь в верности своих предложений... ИМХО причина не в этом :)



Страницы: 1 вся ветка

Текущий архив: 2005.01.02;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.059 c
1-1103211571
Frozzen
2004-12-16 18:39
2005.01.02
Перестал работать дебагер!


14-1102569270
NewDelpher
2004-12-09 08:14
2005.01.02
Поле чудес. Соц. опрос :)


14-1102662547
Cosinus
2004-12-10 10:09
2005.01.02
Как разметить диск под FAT32, если он сейчас NTFS? Под ДОС.


1-1103400620
Алексей
2004-12-18 23:10
2005.01.02
буфер обмена


1-1102925519
Алексей Петухов
2004-12-13 11:11
2005.01.02
определить координаты текста WMF