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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 29.08.2015, 12:08   #1
Alexan-Dwer
Форумчанин
 
Аватар для Alexan-Dwer
 
Регистрация: 20.04.2009
Сообщений: 136
По умолчанию OpenGL Искажается текстура

Создаю текстуры в OpenGL (раньше загружал их из bmp файлов, сейчас, для примера, уже просто заливаю их цветом):
Код:
//
Textures: array of GLuint;

procedure LoadTexture(const TextureID: Byte; var Texture: GLuint);
var
//
w, h: Cardinal;
//
Data: PByteArray;
begin
//
if TextureID = 0 then
//
  begin
//
w:=512; h:=512;
  end
                 else
//
  begin
//
w:=128; h:=64;
  end;

//
GetMem(Data, 3 * w * h);

//
if TextureID = 0 then
//
FillChar(Data^, w * h * 3, 204)
                 else
//
FillChar(Data^, w * h * 3, 102);

//
glBindTexture(GL_TEXTURE_2D, Texture);

//
glTexParameteri(GL_TEXTURE_2D,
//
GL_TEXTURE_MAG_FILTER, GL_NEAREST);

//
glTexParameteri(GL_TEXTURE_2D,
//
GL_TEXTURE_MIN_FILTER, GL_LINEAR);

//
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB8,
//
w, h, 0, GL_RGB, GL_UNSIGNED_BYTE, Data);

//
FreeMem(Data, w * h * 3);
//
Data:=nil;
end;

procedure glInit;
begin
//
glEnable(GL_TEXTURE_2D);

//
SetLength(Textures, 2);
//
glGenTextures(1, @Textures[0]);
//
LoadTexture(0, Textures[0]);
//
glGenTextures(1, @Textures[1]);
//
LoadTexture(1, Textures[1]);

//
glClearColor(1, 1, 1, 0);
//
glShadeModel(GL_SMOOTH);
//
glClearDepth(1);
//
glDisable(GL_DEPTH_TEST);
//
glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST);

//
glViewport(0, 0, 800, 600);
//
glMatrixMode(GL_PROJECTION);
//
glLoadIdentity;
//
glOrtho(0, 800, 600, 0, 0, 1);
//
glMatrixMode(GL_MODELVIEW);
//
glLoadIdentity;
end;
и вывожу их на экран:
Код:
procedure glDraw;
begin
//
glClearColor(1, 1, 1, 0);

//
glClear(GL_DEPTH_BUFFER_BIT or GL_COLOR_BUFFER_BIT);

//
glBindTexture(GL_TEXTURE_2D, Textures[0]);

//
glBegin(GL_QUADS);
//
glTexCoord2f(0, 0);
//
glVertex2f(0,   0);
//
glTexCoord2f(1, 0);
//
glVertex2f(512, 0);
//
glTexCoord2f(1, 1);
//
glVertex2f(512, 512);
//
glTexCoord2f(0, 1);
//
glVertex2f(0,   512);
//
glEnd;

//
glBindTexture(GL_TEXTURE_2D, Textures[1]);
//
glBegin(GL_QUADS);
//
glTexCoord2f(0, 0);
//
glVertex2f(128,   64);
//
glTexCoord2f(1, 0);
//
glVertex2f(256, 64);
//
glTexCoord2f(1, 1);
//
glVertex2f(256, 128);
//
glTexCoord2f(0, 1);
//
glVertex2f(128, 128);
//
glEnd;
end;
Но почему-то, после glClear или glBindTexture у текстуры может произойти обнуление байтов картинки (Data Pixels). Выглядит это так: обнулились байты первой текстуры или обнулились байты второй текстуры. Но иногда этого не происходит, и все выглядит нормально.

Использовал glGetTexImage для проверки, текстуры загружаются нормально, но после glClear или glBindTexture первые байты какой-то текстуры могут обнулиться. Почему так может быть, и с чем это связано?
Alexan-Dwer вне форума Ответить с цитированием
Старый 29.08.2015, 14:13   #2
f.hump
C/C++, Asm
Участник клуба
 
Аватар для f.hump
 
Регистрация: 02.03.2010
Сообщений: 1,323
По умолчанию

поставь еще

Код:
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAX_LEVEL, 0);
f.hump вне форума Ответить с цитированием
Старый 29.08.2015, 14:27   #3
Alexan-Dwer
Форумчанин
 
Аватар для Alexan-Dwer
 
Регистрация: 20.04.2009
Сообщений: 136
По умолчанию

У меня не определена константа GL_TEXTURE_MAX_LEVE, нашел что она равна 33085, это так?

В любом случае, даже с
Код:
glTexParameteri(GL_TEXTURE_2D, 33085, 0)
ничего не изменилось.

Проблема в том, что обнуление происходит всегда по-разному, а порой его может и не быть, хотя код не изменяется вообще...
Alexan-Dwer вне форума Ответить с цитированием
Старый 29.08.2015, 14:49   #4
f.hump
C/C++, Asm
Участник клуба
 
Аватар для f.hump
 
Регистрация: 02.03.2010
Сообщений: 1,323
По умолчанию

че-то не заметил сразу, что квады у тебя на одной высоте, видеокарта может отрисовывать часть второго раньше первого. поставь glVertex3f и разную высоту.
f.hump вне форума Ответить с цитированием
Старый 29.08.2015, 15:07   #5
Alexan-Dwer
Форумчанин
 
Аватар для Alexan-Dwer
 
Регистрация: 20.04.2009
Сообщений: 136
По умолчанию

f.hump, тоже думал об этом раньше, не помогло...

Проблема в том, что если считать байты текстуры через glGetTexImage, то при загрузке текстуры они нормальные., а вот после вызова glClear или glBindTexture, у какой-то текстуры они могут обнулиться.

Запустил EXE файл, все нормально, закрыл и запустил заново, и вот уже у какой-то текстуры байты обнулились... Причем каждый раз обнуляется разное количество байт. А порой этого не происходит вообще. Чудеса?
Alexan-Dwer вне форума Ответить с цитированием
Старый 29.08.2015, 15:18   #6
f.hump
C/C++, Asm
Участник клуба
 
Аватар для f.hump
 
Регистрация: 02.03.2010
Сообщений: 1,323
По умолчанию

Цитата:
тоже думал об этом раньше, не помогло...
ну, если оставить glDisable(GL_DEPTH_TEST), то высота погоды не делает.
f.hump вне форума Ответить с цитированием
Старый 29.08.2015, 15:45   #7
Alexan-Dwer
Форумчанин
 
Аватар для Alexan-Dwer
 
Регистрация: 20.04.2009
Сообщений: 136
По умолчанию

Код:
glEnable(GL_DEPTH_TEST);
...
glOrtho(0, 800, 600, 0, -1, 1);
...
//
glBegin(GL_QUADS);
//
glTexCoord2f(0, 0);
//
glVertex3f(0,   0, 0);
//
glTexCoord2f(1, 0);
//
glVertex3f(512, 0, 0);
//
glTexCoord2f(1, 1);
//
glVertex3f(512, 512, 0);
//
glTexCoord2f(0, 1);
//
glVertex3f(0,   512, 0);
//
glEnd; 
...
//
glBegin(GL_QUADS);
//
glTexCoord2f(0, 0);
//
glVertex3f(128,   64, 0.5);
//
glTexCoord2f(1, 0);
//
glVertex3f(256, 64, 0.5);
//
glTexCoord2f(1, 1);
//
glVertex3f(256, 128, 0.5);
//
glTexCoord2f(0, 1);
//
glVertex3f(128, 128, 0.5);
//
glEnd;
Результат тот же, что и на скриншотах.

Как можно отловить, из-за чего обнуляются байты текстуры?
Alexan-Dwer вне форума Ответить с цитированием
Старый 29.08.2015, 15:57   #8
f.hump
C/C++, Asm
Участник клуба
 
Аватар для f.hump
 
Регистрация: 02.03.2010
Сообщений: 1,323
По умолчанию

мысли закончились.

glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB8,
//
w, h, 0, GL_RGB, GL_UNSIGNED_BYTE, Data);


формат должен быть просто GL_RGB
Цитата:
OpenGL only allows "R", "RG", "RGB", or "RGBA"; other combinations are not allowed as internal image formats.
f.hump вне форума Ответить с цитированием
Старый 29.08.2015, 16:09   #9
Alexan-Dwer
Форумчанин
 
Аватар для Alexan-Dwer
 
Регистрация: 20.04.2009
Сообщений: 136
По умолчанию

f.hump, пробовал я и GL_RGB и GL_RGBA, все тоже.

Может скинуть весь проект?
Alexan-Dwer вне форума Ответить с цитированием
Старый 29.08.2015, 16:16   #10
f.hump
C/C++, Asm
Участник клуба
 
Аватар для f.hump
 
Регистрация: 02.03.2010
Сообщений: 1,323
По умолчанию

не, не надо, мысли завели в тупик.

единственное, что еще могу предложить, так это поставить glFinish сразу после glTexImage2D.
f.hump вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Не загружается текстура в OpenGL Kremlin Gamedev - cоздание игр: Unity, OpenGL, DirectX 0 19.11.2012 14:05
OpenGl текстура saggy Мультимедиа в Delphi 8 25.05.2012 22:59
Текстура OpenGL по условию. DooMik Мультимедиа в Delphi 12 05.04.2012 14:05
Разная текстура для каждой грани куба OpenGL DIgorevich Мультимедиа в Delphi 4 16.12.2011 12:17
Текстура на 2D объект OpenGL saggy Мультимедиа в Delphi 0 30.06.2010 13:52