-1

通常行われているように、OpenGL テクスチャ 2D からピクセルをバイト配列 (unsigned char) に読み取ります。逆のプロセス。私の質問は - するだけで十分ですか:

glGetTexImage(GL_TEXTURE_2D,0,GL_RGBA,GL_UNSIGNED_INT,bytes);

それ以外の :

glGetTexImage(GL_TEXTURE_2D,0,GL_RGBA,GL_UNSIGNED_BYTE,bytes);

次に、各整数を繰り返し処理し、0-1 の範囲から 0-255 に変換しますか? サードパーティの画像ライブラリを使用せずにこのような変換を行う例は実際には見つかりませんでした。

私がこれを行う場合:

            size_t lenght=_viewWidth * _viewHeight ;
    GLubyte *bytes=(GLubyte*)malloc(lenght);
    ///////////////  read pixels from tex  /////////////////////
    glBindTexture(GL_TEXTURE_2D,tex);
    glGetTexImage(GL_TEXTURE_2D,0,GL_BGR,GL_UNSIGNED_BYTE,bytes);
           uint8_t Rc, Gc, Bc;
       for(x = 0; x < lenght; x+=3)
    {
        Bc = *bytes + x;
        Gc = *bytes + x + 1;
        Rc = *bytes + x + 2;

             }

Rc、Gc、Bc は 0 ~ 255 の範囲になりますか?

4

1 に答える 1

1

OpenGL がテクスチャをロードすると、着信ピクセルが呼び出しで指定された内部形式glTexImage*()として提供される形式に変換されます。この操作には、ピクセル形式(glTexImage*()の 3 番目のパラメーター) から内部形式へのマッピング手順が含まれる場合があり、多くの場合、範囲 [0,1] または [-1,1] のいずれかへのマッピングと、その後の範囲へのマッピングが含まれます。各コンポーネントの内部形式。たとえば、GL_FLOAT のピクセル形式と GL_RGBA8 の内部形式では、入力値が範囲 [0,1] から範囲 [0,255] にマップされます。

を使用してテクセルを取得するglGetTexImage()と、プロセスが逆に実行されるため、出力ピクセル値 (コンポーネントごと) は、指定された出力タイプ (例: GL_UNSIGNED_INT) の範囲内になります。unsigned int の範囲は [0,2 32 -1] であるため、整数イメージ配列で返される値の範囲になります。これらの値が異なる範囲 (GL_UNSIGNED_BYTES など) で必要な場合は、値を必要な範囲に手動で変換する必要があります。

個人的には、OpenGL が返すことができるデータ型の 1 つが必要な値の範囲と一致する場合は、その型を使用してみてください。

于 2013-03-14T19:09:24.563 に答える