C++Builder
  Начало   Форум   Помощь Войти Регистрация  
Страниц: [1]   Вниз
  Печать  
Автор Тема: Переполнение стека  (Прочитано 1408 раз)
DimaKor
Участник


Сказали спасибо: +1/-0
Offline

Сообщений: 22


Переполнение стека
« : 24 Июль 2015, 17:13:42 »

Загружаю текстуры по образу и подобию примера из Rad Studio

Код:
void GLdraw::SetupTextures()
{
texbmp = new Graphics::TBitmap;

try
{
texbmp->LoadFromResourceName((int)HInstance, "grid256");
}
catch(EResNotFound *Error)
{
ShowMessage(Error->Message +
".\nThe resource file was not found or its "
"name is incorrect.");
}
catch(...)
{
ShowMessage("The picture cannot be displayed...");
}

GLubyte bits[256][256][4];
for(int i = 0; i {
for(int j = 0; j {
bits[i][j][0]= (GLbyte)GetRValue(texbmp->Canvas->Pixels[i][j]);
bits[i][j][1]= (GLbyte)GetGValue(texbmp->Canvas->Pixels[i][j]);
bits[i][j][2]= (GLbyte)GetBValue(texbmp->Canvas->Pixels[i][j]);
bits[i][j][3]= (GLbyte)255;
}
}

glPixelStorei(GL_UNPACK_ALIGNMENT, 4);
glGenTextures(1, &texture1);
glBindTexture(GL_TEXTURE_2D, texture1);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 256, 256, 0, GL_RGBA, GL_UNSIGNED_BYTE, bits);
glEnable(GL_TEXTURE_2D);
}

Все работает, пока размер текстуры не превышает 256х256. Как только пытаюсь загрузить больше, например 512х512, программа вылетает с сообщением о переполнении стека на создании массива

Код:
GLubyte bits[512][512][4];

У билдера какие-то ограничения на размер массивов или что?
Записан
S0mbre
Глобальный модератор


Сказали спасибо: +1113/-22
Offline

Сообщений: 2132

S0mbre


Re: Переполнение стека
« Ответ #1 : 25 Июль 2015, 21:23:55 »

Какой билдер? По идее выделить 1 МБ памяти не должно быть проблемой...
Записан
POV
Участник


Сказали спасибо: +107/-7
Offline

Сообщений: 640


Re: Переполнение стека
« Ответ #2 : 25 Июль 2015, 23:14:05 »

Ты пытаешься загрузить 512х512? И циферки соответствующие в коде не менял? Там же явным образом размерности указаны.
Записан
DimaKor
Участник


Сказали спасибо: +1/-0
Offline

Сообщений: 22


Re: Переполнение стека
« Ответ #3 : 27 Июль 2015, 10:20:33 »

Цитата: POV от 25 Июль 2015, 23:14:05
Ты пытаешься загрузить 512х512? И циферки соответствующие в коде не менял? Там же явным образом размерности указаны.

Менял конечно. Похоже дело в статическом задании массива, с этим какие-то проблемы. Если заменить

Код:
GLubyte bits[512][512][4];

на

Код:
GLubyte*** bits;

// Allocate memory
bits = new GLubyte**[512];
for(int i = 0; i {
bits[i] = new GLubyte* [512];

for (int j = 0; j {
   bits[i][j] = new GLubyte[4];
}
    }


// De-Allocate memory
for(int i = 0; i {
for(int j = 0; j {
delete [] bits[i][j];
}

delete [] bits[i];
}
delete [] bits;

Никаких ошибок не возникает. Правда текстуры отображаются неправильно, где-то в индексах наверное путаница
Записан
DimaKor
Участник


Сказали спасибо: +1/-0
Offline

Сообщений: 22


« Ответ #4 : 27 Июль 2015, 12:04:44 »

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

Код:
GLuint texture1;
GLubyte *data; ........

void __fastcall GLdraw::SetupTextures()
{
Graphics::TBitmap *bitmap = new Graphics::TBitmap();
bitmap = new Graphics::TBitmap;
bitmap->LoadFromResourceName((int)HInstance, "grid");

int sizeX = bitmap->Width;
int sizeY = bitmap->Height;
data=(GLubyte*)malloc(sizeX*sizeY*3*sizeof(GLubyte));

for(int i = 0; i {
for(int j = 0; j {
*(data+(i*sizeY+j)*3)= (GLubyte)GetRValue(bitmap->Canvas->Pixels[j][sizeY-i-1]);
*(data+(i*sizeY+j)*3+1)= (GLubyte)GetGValue(bitmap->Canvas->Pixels[j][sizeY-i-1]);
*(data+(i*sizeY+j)*3+2)= (GLubyte)GetBValue(bitmap->Canvas->Pixels[j][sizeY-i-1]);
}
}
bitmap->Graphics::~TBitmap();

glBindTexture(GL_TEXTURE_2D, texture1);
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR);
glTexImage2D(GL_TEXTURE_2D, 0, 3, sizeX, sizeY, 0, GL_RGB, GL_UNSIGNED_BYTE, data);

glEnable(GL_TEXTURE_2D);
}
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  




....

Powered by SMF 1.1.21 | SMF © 2025, Simple Machines
Страница сгенерирована за 0.053 секунд. Запросов: 19.