1

プロジェクトで OpenGL で使用するイメージをロードするために SOIL を使用することにしました。イメージをロードし、GLuint textureid と 2 つの int の幅と高さを保持する構造体である GLTexture を返すこのメソッドがあります。

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 経由で取得することは可能ですか?

4

1 に答える 1

2

によって生成されたテクスチャ IDSOIL_load_OGL_textureは、

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

行 (glGenTextures は新しいテクスチャを作成し、ID を &(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;
于 2015-08-14T22:34:14.987 に答える