8

OpenGLでテクスチャマッピングを理解しようとしていますが、簡単な例を実行できません。

ポリゴンは描画されていますが、テクスチャではなく単色です。また、これまでglDrawPixelsを正常に使用していたため、ビットマップはsprite1[]に正しくロードされています。

glGenTexturesを使用してtex名を取得していますが、texName1が変更されていないことに気付きました。このGLuintは、glGenTexturesを呼び出した後でも、初期化したものです。

GL_TEXTURE_2Dを有効にしました。

コードは次のとおりです。

GLuint texName1 = 0;

glGenTextures(1, &texName1);
glBindTexture(GL_TEXTURE_2D, texName1);
glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
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);
glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
glTexImage2D(GL_TEXTURE_2D, 0, GL_BGRA_EXT, sprite1[18], sprite1[22], 0, GL_BGRA_EXT, GL_UNSIGNED_BYTE, &sprite1[54]);

glColor3f(1, 1, 0);
glBindTexture(GL_TEXTURE_2D, texName1);
glBegin(GL_QUADS);
    glTexCoord2f (0.0, 0.0);
    glVertex3f (0.0, 0.0, -5.0f);
    glTexCoord2f (1.0, 0.0);
    glVertex3f (.5, 0.0, -5.0f);
    glTexCoord2f (1.0, 1.0);
    glVertex3f (.5, .5, -5.0f);
    glTexCoord2f (0.0, 1.0);
    glVertex3f (0.0, .5, -5.0f);
glEnd();

更新:私は途方に暮れています。これが私が試したすべてです:

  1. OGLが初期化される前に、テクスチャを初期化していたことがわかりました。テクスチャはクラスコンストラクタで初期化され(glGenTextures-> glTexImage2D)、フレームごとに呼び出されるメンバー関数で描画されます(glBegin-> glEnd)。genTexturesは現在正しく機能しているようで、名前は1になっています。

  2. GL_RGBA8、GL_BGRA_EXTのすべての可能な組み合わせ(GL_BGRAは私のシステムでは機能しません。_EXTが必要です)、さらにビットマップからアルファチャネルを削除し、GL_RGB、GL_BGR_EXTなどのすべての組み合わせを試しました。運が悪いです。

  3. 手続き的にビットマップを作成し、それを使用してみました

  4. GL_COLOR_MATERIALが有効になっていないことを確認してください。

  5. ビットマップサイズを32x32に変更しました。

  6. glTexEnvfの代わりにglTexEnviを試しました。

4

7 に答える 7

7

2 の累乗でないテクスチャ次元で問題が発生する可能性があるというmentat のメモに加えて、名前を変更しないテクスチャ名の生成について言及しています。

呼び出しが早すぎるように聞こえますglGenTextures()。つまり、OpenGL を初期化する前です。glGenTextures()そうでない場合は、 を呼び出して OpenGL エラー状態をチェックする呼び出しの直後にコードを追加することをお勧めしますglGetError()

于 2009-04-17T07:27:36.390 に答える
4

あなたのコメントでは、ビットマップが 29x20 ピクセルであると言っています。有効なテクスチャを生成するには、OpenGL では (各次元の) 画像サイズが 2 の累乗である必要があります。正方形である必要はありませんが、長方形でもかまいません。GL_ARB_texture_rectangleのようないくつかの OpenGL 拡張機能を使用することで、これを克服できます。

于 2009-04-17T07:08:20.260 に答える
2

同じ問題があり、問題を説明する別の投稿を見つけたので、これをここに置きます。iPhone は GL_BGRA(GL_EXT_BGRA) をサポートしていますが、内部フォーマットとしてではなく、入力フォーマットとしてのみサポートしているようです。そのため、glTexImage2D 呼び出しを GL_RGBA の内部フォーマットを持つように変更すると、機能します。

glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, width, height, 0, GL_BGRA, GL_UNSIGNED_BYTE, &sprite1[54]);

これが、この投稿に出くわした他の誰かに役立つことを願っています.

于 2010-06-28T07:37:26.303 に答える
1

いくつかのランダムなアイデア:

  • GL_COLOR_MATERIALが有効になっている可能性があります
  • 「glTexEnvf」を「glTexEnvi」に変更して、それが役立つかどうかを確認します
  • glGenTexturesの後でtexName1が0の場合、アクティブなOpenGLコンテキストがない可能性があります

エラーチェックでは、glGetErrorsからの最も一般的な結果の読み取り可能な出力を出力する小さな関数を作成し、それを使用してエラーを作成する行を見つけることをお勧めします。もう1つの可能性は、GLIntercept、 BuGLegDEBuggerなどを使用することです

于 2009-04-14T13:46:14.433 に答える
1

問題が見つかりました。への電話はglEnableでしたglEnable(GL_BLEND | GL_TEXTURE_2D)。glGetError を使用して、この呼び出しで GL_INVALID_ENUM を取得していることがわかったので、GL_TEXTURE_2D を独自の有効化関数とビンゴに移動しました。glEnable には論理 OR が許可されていないと思いますか?

于 2009-04-18T22:09:43.640 に答える
1

私の OpenGL は錆びていますが、 で同じ問題が発生したことを覚えていglTexImage2D ます。最後に私はそれを機能させることができましたが、私はいつももっと運が良かった gluBuild2DMipmaps ので、結局

gluBuild2DMipmaps (
  GL_TEXTURE_2D, type, i.width, i.height, type, GL_UNSIGNED_BYTE, i.data
);

置き換えた

glTexImage2D (
  GL_TEXTURE_2D, 0, type, i.width, i.height, 0, type, GL_UNSIGNED_BYTE, i.data 
);
于 2009-04-14T14:00:44.243 に答える
0

最初にチェックするのは、ShadowIce で述べられているように、カラー マテリアルの設定です。次に、テクスチャ ファイルをチェックして、適切なサイズ (つまり、256x256 など) と RGB ビットマップであることを確認します。ファイルに少しでも問題がある場合、どのように試しても正しくレンダリングされません。

次に、そのコードを単にデバッグしようとするのをやめて、代わりにNeHe Web サイトのチュートリアルとの違いを確認します。

NeHe は、OpenGL で何かをしようとしているかどうかを確認するのに適した場所です。テクスチャはおそらく最も難しいものであり、残りの GL スキルが向上するにつれて難しくなります。

于 2009-04-14T13:52:13.157 に答える