0

openglでシンプルなテクスチャを描画しようとしています。簡単なクラスTextureを作成しました。

class Texture{
public:
    unsigned int id;
    unsigned char image[256*256*3];
    int level;
    int border;
    int width;
    int height;    

    Texture (int level =0, int border = 0) : level(level), border(border) {
        glGenTextures(1, &id);
        width = 256, height = 256;
        glTexImage2D(GL_TEXTURE_2D, level, GL_RGB, width, height, border, GL_RGB, GL_UNSIGNED_BYTE, &image[0]);
        glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
        glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
        glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE); 


        for (int i= 0; i<width*height*3; i+=3){
            image[i]=1;//i%255;
            image[i+1] =1;// 255-i%255;
            image[i+2] =1;// i%128;
        }
    }

    void useIt(){
        glBindTexture( GL_TEXTURE_2D, id );
    }
};

unsigned char配列を作成し、ランダムデータで埋めます。私はそれをこのように使おうとしています:

glEnable(GL_TEXTURE_2D);
texture->useIt();
glBegin(GL_TRIANGLES);

glNormal3d(0, 1, 0);
glTexCoord2d(0.0,0.0);
glVertex3f(width/-2.f,height/2.f,depth/2.f);
glTexCoord2d(1.0,1.0);  
glVertex3f(width/2.f,height/2.f,depth/2.f);
glTexCoord2d(1.0,0.0);
glVertex3f(width/2.f,height/2.f,depth/-2.f);
glTexCoord2d(0.0,0.0);
glVertex3f(width/-2.f,height/2.f,depth/2.f);
glTexCoord2d(1.0,1.0);
glVertex3f(width/2.f,height/2.f,depth/-2.f);
glTexCoord2d(0.0,1.0);
glVertex3f(width/-2.f,height/2.f,depth/-2.f);

glEnd();
glDisable(GL_TEXTURE_2D);

平面を描画しますが、テクスチャはありません(以前に使用したマテリアルで描画します)。私は何が間違っているのですか?

4

2 に答える 2

1

glBindTextureTexture操作の前に、コンストラクターで必要ですglTex*

行メモリアドレスは4バイト境界にないため、glPixelStorei(GL_UNPACK_ALIGNMENT, 1)次のことも必要になる場合があります。glTexImage2D

ところで...、imageを介してデータを「アップロード」する前に、データを設定する必要がありますglTexImage2D。現在、初期化されていないデータでテクスチャを設定しているだけです。さらに、RGBバイトデータを設定するループは、黒に非常に近い値を提供しているだけです(1, 1, 1)

于 2012-12-01T16:22:05.063 に答える
1

コードで考えられる3つの問題。Brett Haleは、glTexImageを使用してデータをアップロードする前に、テクスチャオブジェクトをバインドする必要があることをすでに説明しています。

glTexImageは、提供するデータのコピーを作成します(これは、ポインターまたはオフセットのみをバッファーオブジェクトに取り込むglVertex…Pointer関数とは異なります)。ただし、画像配列の内容をテクスチャにコピーした、画像配列にデータを入力します。また、データをテクスチャにコピーした後、画像配列を安全に削除できます。

最後になりましたが、これらの操作はコンストラクターにあります。OpenGLコンテキストが作成される前に初期化されたスコープ内にテクスチャクラスインスタンスがある場合、OpenGLコンテキストがないため、何も起こりません。したがって、OpenGLコンテキストが使用可能になった後でのみテクスチャオブジェクトが作成されることを確認するか、OpenGLコンテキストが使用可能になったら呼び出すテクスチャ作成とアップロードコードを別のメソッドに入れてください。

于 2012-12-01T16:46:48.900 に答える