0

OpenGL NeHe Productionを学んでいます。レッスン22バンプマッピング、マルチテクスチャを読んだときに問題が発生しました。

ロゴbmpファイルをロードするとき、2つのbmpファイルをロードする必要があります。1つは色情報を格納し、もう1つはアルファ情報を格納します。これが2つのbmpファイルです:OpenGL_Alpha.bmp: ここに画像の説明を入力してください

およびOpenGL.bmp: ここに画像の説明を入力してください

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

if (Image=auxDIBImageLoad("Data/OpenGL_ALPHA.bmp")) {
            alpha=new char[4*Image->sizeX*Image->sizeY];
            for (int a=0; a<Image->sizeX*Image->sizeY; a++)
                    alpha[4*a+3]=Image->data[a*3]; //???????
            if (!(Image=auxDIBImageLoad("Data/OpenGL.bmp"))) status=false;
            for (a=0; a<Image->sizeX*Image->sizeY; a++) {
                    alpha[4*a]=Image->data[a*3];//??????????                         
                    alpha[4*a+1]=Image->data[a*3+1];             
                    alpha[4*a+2]=Image->data[a*3+2];                     
            }

            glGenTextures(1, &glLogo);  

            glBindTexture(GL_TEXTURE_2D, glLogo);
            glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR);
            glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR);
            glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8, Image->sizeX, Image->sizeY, 0, GL_RGBA, GL_UNSIGNED_BYTE, alpha);
            delete alpha;

}

私の質問は:なぜImage->dataのインデックスがa* 3なのか?

誰かが私のために解釈してもらえますか?

4

2 に答える 2

3

OpenGLNeHeProductionを学んでいます。レッスン22バンプマッピングを読んだとき

なんで?NeHeチュートリアルはひどく時代遅れであり、そこで概説されているバンプマッピング手法は完全に時代遅れです。これは、13年以上にわたってシェーダーベースの法線マッピングによってスーパーシードされてきました(2003年まではシェーダーの代わりにテクスチャコンバイナーが使用されていました)。

また、BMPの代わりに、テクスチャに適した画像ファイル形式(アルファチャネル付き)を使用する必要があります。好き:

  • TGA
  • PNG
  • OpenEXR

また、さまざまな圧縮DXテクスチャ形式は、いくつかのアプリケーションに適しています。

私の質問は:なぜImage->dataのインデックスがa* 3なのか?

RGBDIBの赤チャンネルを抽出します。

于 2012-05-09T12:20:58.407 に答える
0

これはチャネルオフセットです。RGBデータは3つの連続したバイトとして保存されます。ここで、「a」はどのピクセルを表します(3バイトのグループ、1つはR用、1つはG用、1つはB用)。

a*3を3バイトの配列へのポインタと考えてください。

char* myPixel = Image->data + (a*3);

char red   = myPixel[0];
char green = myPixel[1];
char blue  = myPixel[2];
于 2012-05-09T12:24:08.450 に答える