ПОЧВА — Получение размеров изображения

Я решил использовать SOIL для загрузки изображений для использования с OpenGL в моем проекте. У меня есть этот метод, который загружает изображение и возвращает GLTexture, которая представляет собой структуру, содержащую текстурный идентификатор GLuint и два целых числа ширины и высоты:

GLTexture loadTexture(const char *filePath) {
GLTexture texture = {};
int width;
int height;
unsigned char *data;

//Load Image File Directly into an OpenGL Texture
texture.id = SOIL_load_OGL_texture
    (
    filePath,
    SOIL_LOAD_AUTO,
    SOIL_CREATE_NEW_ID,
    SOIL_FLAG_MIPMAPS | SOIL_FLAG_INVERT_Y | SOIL_FLAG_NTSC_SAFE_RGB | SOIL_FLAG_COMPRESS_TO_DXT
    );

//Error Checking (Load Process)
if (texture.id == 0) {
    fatalError("SOIL Loading Error!");
}

//Generate and Bind Texture
glGenTextures(1, &(texture.id));
glBindTexture(GL_TEXTURE_2D, texture.id);

//Get Width, Height and Data of Image
glGetTexLevelParameteriv(GL_TEXTURE_2D, 0, GL_TEXTURE_WIDTH, &width);
glGetTexLevelParameteriv(GL_TEXTURE_2D, 0, GL_TEXTURE_HEIGHT, &height);
glGetTexImage(GL_TEXTURE_2D, 0, GL_RGBA, GL_UNSIGNED_BYTE, &data);

glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, width, height, 0, GL_RGBA, GL_UNSIGNED_BYTE, &data);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR);
glGenerateMipmap(GL_TEXTURE_2D);

//Unbind Texture
glBindTexture(GL_TEXTURE_2D, 0);

//Return Texture
texture.width = width;
texture.height = height;
return texture;

}

Насколько я знаю, glGetTexLevelParameteriv() должна возвращать ширину текстуры, которая привязана к ширине и высоте, но всякий раз, когда я загружаю изображение, она возвращает 0.

Должен ли я заполнять ширину и высоту в качестве параметров метода или их можно получить через OpenGL?


person MysticSheik    schedule 14.08.2015    source источник


Ответы (1)


Идентификатор текстуры, сгенерированный SOIL_load_OGL_texture, переопределяется в

glGenTextures(1, &(texture.id));

строка (glGenTextures создает новую текстуру и сохраняет идентификатор в &(texture.id)). Все последующие операции работают с вновь созданной текстурой. Поскольку эта новая текстура пуста, ширина и высота равны 0.

Я не уверен, чего вы хотите здесь добиться, но если вы хотите загрузить только текстуру, то этот код может работать:

texture.id = SOIL_load_OGL_texture    (...);

//Error Checking (Load Process)
if (texture.id == 0) {
    fatalError("SOIL Loading Error!");
}

//Just bind and do not create a new texture
glBindTexture(GL_TEXTURE_2D, texture.id);

glGetTexLevelParameteriv(GL_TEXTURE_2D, 0, GL_TEXTURE_WIDTH, &width);
glGetTexLevelParameteriv(GL_TEXTURE_2D, 0, GL_TEXTURE_HEIGHT, &height);

glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR);
glGenerateMipmap(GL_TEXTURE_2D);

//Unbind Texture
glBindTexture(GL_TEXTURE_2D, 0);

//Return Texture
texture.width = width;
texture.height = height;
return texture;
person BDL    schedule 14.08.2015
comment
Ах я вижу. Код вроде работает сейчас. Когда я загружаю PNG-изображение размером 33x32 пикселей, оно говорит, что ширина составляет 64 пикселя, а высота — 32 пикселя, что не совсем правильно... - person MysticSheik; 15.08.2015
comment
Я не знаю SOIL, но похоже, что это увеличит изображение до следующей степени двойки. Может быть, можно превратить это из? - person BDL; 15.08.2015
comment
@MysticSheik: Это правильно, поскольку изображениям, сжатым DXT, нужны размеры, основанные на степени двойки (другие типы текстур в GL2+ этого не делают). Если вы уберете этот флаг (SOIL_FLAG_COMPRESS_TO_DXT), очень вероятно, что SOIL будет передавать данные без их масштабирования. - person Andon M. Coleman; 15.08.2015
comment
Спасибо! Да, оказалось, что ПОЧВА масштабировала изображение до степени двойки. - person MysticSheik; 15.08.2015