0

glGetTexLevelParameter 関数を使用してテクスチャの幅と高さを取得しようとすると問題が発生します。何を試しても、関数は幅または高さ変数の値を設定しません。エラーを確認しましたが、エラーは発生しません。これが私のコードです(それが役立つ場合はNeHeチュートリアルに基づいています):

int LoadGLTextures()
{
//load image file directly into opengl as new texture
GLint width = 0;
GLint height = 0;
texture[0] = SOIL_load_OGL_texture("NeHe.bmp", SOIL_LOAD_AUTO, SOIL_CREATE_NEW_ID,   SOIL_FLAG_INVERT_Y);       //image must be in same place as lib
if(texture[0] == 0)
{
    return false;
}
glEnable(GL_TEXTURE_2D);
glGenTextures(3, &texture[0]);

glBindTexture(GL_TEXTURE_2D, texture[0]);
glGetTexLevelParameteriv(GL_TEXTURE_2D, 0, GL_TEXTURE_WIDTH, &width);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);  //no filtering bc of GL_NEAREST, looks really bad
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);

const GLubyte* test = gluErrorString(glGetError());
cout << test << endl;
return true;
}

それが役立つ場合は、ビジュアルスタジオ2010も使用しています。texture[0] をロードする呼び出しは、SOIL 画像ライブラリからのものです。

4

3 に答える 3

2

これを分解してみましょう:

この呼び出しは、イメージをロードし、新しいテクスチャ ID を作成して、この ID で指定されたテクスチャ オブジェクトにイメージをロードします。成功した場合、ID が返され、 に保存されtexture[0]ます。

texture[0] = SOIL_load_OGL_texture(
     "NeHe.bmp",
     SOIL_LOAD_AUTO,
     SOIL_CREATE_NEW_ID,
     SOIL_FLAG_INVERT_Y);

ところで:画像ファイルはライブラリと同じディレクトリにあるのではなく、この関数を呼び出した時点のプロセスの現在の作業ディレクトリにあります。作業ディレクトリを変更していない場合、それはプロセスが呼び出されたディレクトリです。

テクスチャが正常にロードされたかどうかを確認する

if(texture[0] == 0)
{
    return false;
}

ここでテクスチャリングを有効にしてもほとんど意味がありません。glEnable呼び出しはレンダリング コードに属します。

glEnable(GL_TEXTURE_2D);

さて、ここで問題です。glGenTextures は新しいテクスチャ ID を生成し、提供された配列に配置します。以前にその配列に格納されていたものはすべて上書きされます。あなたの場合、によって生成され返されたテクスチャ ID そのものSOIL_load_OGL_textureです。これは単なるハンドルであり、決してガベージ コレクションではないことに注意してください。ハンドルを破棄したため、OpenGL でぶら下がっているテクスチャ オブジェクトに直面し、アクセスできなくなりました。

glGenTextures(3, &texture[0]);

次に、新しく作成された ID によって名前が付けられたテクスチャ オブジェクトをバインドします。これは新しい ID であるため、イメージ データが割り当てられていない新しいテクスチャ オブジェクトを効果的に作成しています。

glBindTexture(GL_TEXTURE_2D, texture[0]);

以下のすべての呼び出しは、SOIL によって作成されたものとはまったく異なるテクスチャで動作します。

コードの修正方法: を削除しglGenTexturesます。あなたの場合、それは冗長であるだけでなく、問題の原因です。

于 2012-05-26T20:21:20.073 に答える
1

この行:

texture[0] = SOIL_load_OGL_texture("NeHe.bmp", SOIL_LOAD_AUTO, SOIL_CREATE_NEW_ID,   SOIL_FLAG_INVERT_Y);

テクスチャを作成し、OpenGL テクスチャを に保存しtexture[0]ます。

この行:

glGenTextures(3, &texture[0]);

3 つのテクスチャを作成し、それらをtexture配列に格納して、そこにあったものを上書きします。

問題が見えますか?SOIL からテクスチャを取得し、新しく作成したテクスチャで上書きしてすぐに破棄します。

これは、概念的には次のものと同じです。

int *pInt = new int(5);
pInt = new int(10);
于 2012-05-26T19:55:15.260 に答える
0

うーん、glGenTextures(howmany,where) は glGenBuffers のように機能しませんか? 1 つのポインタに 3 つのテクスチャを割り当てるのはなぜですか?

そうあるべきだと思う

int textures[3];
glGenTextures(3,textures);

このようにして、生成された 3 つのテクスチャ バッファがテクスチャ配列に配置されます。または

int tex1, tex2, tex3;
glGenTextures(1,&tex1);
glGenTextures(1,&tex2);
glGenTextures(1,&tex3);

したがって、3 つの個別のテクスチャ バッファ ポインタがあります。

于 2012-05-26T17:47:44.257 に答える