Форум: "Игры";
Текущий архив: 2005.01.02;
Скачать: [xml.tar.bz2];
ВнизПеревод массива в текстуру Найти похожие ветки
← →
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;
Скачать: [xml.tar.bz2];
Память: 0.45 MB
Время: 0.034 c