2009-04-12 16 views
7

私はOpenGLのテクスチャマッピングを解明しようとしています。私は簡単な例を得ることはできません。単純なOpenGLテクスチャマップは機能しませんか?

ポリゴンが描画されていますが、テクスチャではなく単色です。また、glDrawPixelsを使ってうまくいきましたので、ビットマップが正しくスプライト1 []にロードされています。

テクスチャ名を取得するのにglGenTexturesを使用しますが、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(); 

UPDATE: 私は途方に暮れてよ。ここで私が試したすべてのものです:

  1. がOGLが初期化される前に、私は私の風合いを初期化して判明。テクスチャは、クラスコンストラクタで初期化され(glGenTextures-> glTexImage2D)、すべてのフレームと呼ばれるメンバ関数で描画されます(glBegin-> glEnd)。 genTexturesが正常に動作しているように見えます。

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

  3. 手続きビットマップを作成し、

  4. がGL_COLOR_MATERIALが有効になっていないことを確認したことを使用してみました。

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

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

+1

glGenTexturesの後にtexName1が残っている場合は、エラー状態をチェックする必要があります。 –

+0

スプライト1 []内で幅と高さがバイトまたは整数として保存されていますか? –

+1

幅と高さはバイトのリトルエンディアンとして格納されます。私はglDrawPixelsでsprite1 [18]とsprite1 [22]を使っていました。彼らは正しいです。ビットマップはわずか29x20ピクセルなので、動作します。 –

答えて

1

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

とにかく助けてくれて本当にありがとうございました...私にとっては非常に有益でした。

+1

AFAIK OpenGL定数は2のべき乗ではなく、任意の値です。論理ORを使用すると情報が破壊されることになります。 – Adam

+1

OR可能定数は、GL_COLOR_BUFFER_BITのように、名前に-BITを付けたものです。GLではそれほど多くないので、慣れてはいけません。 – Kos

1

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

    GL_COLOR_MATERIALが有効になっているかもしれません
  • 変更 "glTexEnvf" を "glTexEnvi" とtexName1が0であればそれはあなたが持っていない可能性がありますglGenTextures後
  • に役立ちますかどうかを確認アクティブなOpenGLコンテキスト

エラーチェックのために、私は、 glGetErrorsの最も一般的な結果のためのdable出力を作成し、それを使ってエラーを生成する行を見つけます。別の可能性は、GLIntercept,BuGLeまたはgDEBuggerのようなものを使用することです。

0

最初に確認するのは、ShadowIceに記載されているような色の設定です。次に、テクスチャファイルをチェックして、適切なサイズ(256x256など)とRGBビットマップを確認します。ファイルにわずかな問題があっても、どのように試しても正しくレンダリングされません。

次に、私はそのコードをデバッグするのをやめ、代わりにtutorial on the NeHe websiteとは違うものを見ていきます。

NeHeは、OpenGLでの処理を試みているかどうかを確認するのに適しています。テクスチャはおそらく最も難しいことですが、残りのGLスキルが増すにつれて難しくなります。

1

私のOpenGLは錆びていますが、私はglTexImage2D と同じ問題があることを覚えています。最後に、私はそれを動作させるために管理が、私はいつも私はあなたのコメントでは

glTexImage2D (
    GL_TEXTURE_2D, 0, type, i.width, i.height, 0, type, GL_UNSIGNED_BYTE, i.data 
); 
+0

MINフィルタのglTexParameterのように聞こえます。デフォルトは、ミップマップテクスチャでのみ機能するGL_NEAREST_MIPMAP_LINEARです。 –

3

を置き換え

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

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

+1

GL_ARB_texture_rectangleは2.0以降、OpenGLに組み込まれています。http://www.opengl.org/wiki/NPOT_Texture – Kos

6

mentat's noteに加えて、2の累乗以外のテクスチャのディメンションに問題がある場合は、名前を変更しないテクスチャ名の生成についても言及します。

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

+0

これは私にとってはうまくいきました。私はOpenGL初期化の前にテクスチャを作成しようとしていました。私は時間と時間をもう一度見てきたので、関数呼び出しの順序はOpenGLプログラミングにとって非常に重要です。 – chembrad

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]); 

この投稿をうかがった人に役立つことを願っています。

+0

私はこれをもっとよく聞いています。混乱しています。内部フォーマットとしてBGRAを動作させるようですが、実際にはRGBAを使用しています。または私は間違っていますか? – akaru

関連する問題