2015-08-14 3 views
1

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

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?

ответ

1

текстура ID генерируется 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; 
+0

А, я вижу. Теперь код работает. Когда я загружаю изображение в формате PNG размером 33x32 пикселя, он говорит, что ширина равна 64px, а высота 32px, что не совсем правильно ... – MysticSheik

+0

Я не знаю ПОЧВЫ, но похоже, что это увеличит изображение до следующая мощность двух размеров. Может быть, это можно изменить? – BDL

+0

@MysticSheik: Это правильно, поскольку сжатые изображения DXT нуждаются в размерах, основанных на силах-двух (другие типы текстур в GL2 + нет). Если вы удалили этот флаг ('SOIL_FLAG_COMPRESS_TO_DXT'), очень вероятно, что SOIL передаст данные, не перемасштабируя его. –

Смежные вопросы