2012-04-20 11 views
0

私は以下の質問に答えました。彼の支援のためにgavinbに感謝します。Uint8をunsigned charのRGB値に変換します

質問: 私は学習体験のためだけにテクスチャを複製しようとしています。私は24ビットのTGA画像を使用していますが、SDLで読み込んでいます。私は

struct Colour24 
{ 
    unsigned char r; 
    unsigned char g; 
    unsigned char b; 
} 

unsigned char* texture = new unsigned char[width * height * 3]; 

    for (int y = 0; y < height; y++) 
    { 
     for (int x = 0; x < width; x++) 
     { 
      int index = (y * width) + x; 

      Colour24 colour = getColourAt(x, y); 

      newTexture[index] = colour.r; 
      newTexture[index + 1] = colour.g; 
      newTexture[index + 2] = colour.b; 
     } 
    } 

Colour24 getColour(int x, int y) 
{ 
    Uint32 pixel; 
    Uint8 red, green, blue; 
    Colour24 rgb; 

    pixel = getPixel(m_surface, x, y); // using the SDL get pixel function 

    SDL_GetRGB(pixel, m_surface->format, &red, &green, &blue); 

    rgb.r = red; 
    rgb.b = blue; 
    rgb.g = green; 

    return rgb; 
} 

OLD私自身の構造を作成しました: 私はOpenGLのテクスチャにこれを送信することを計画していると私は直接表面 - >ピクセルを送信するとき、それは作業を行います。しかし、自分でデータ配列を作成したいと思います。ヘルプは大歓迎です!

編集:申し訳ありませんが、私は十分に自分自身を説明しませんでした。私は手動で24ビットTGA画像を含むSDL_Surfaceからテクスチャを手動で再作成しようとしています。次に、テクスチャを作成するためにOpenGLに渡します。私は、表面 - >ピクセルで私のOpenGLコードをテストし、うまく動作します。私はちょうど私が間違ってどこにそれを読み込みに取り組んでいます。

+0

まさに問題は何?コンパイラエラー?あなたは何を期待していませんか?少なくとも、関数定義の同じレベルにコードが含まれているため、コードは不完全です。 – bjhend

+0

このテクスチャをOpenGLに読み込むことはできますが、正しくありません。私は、赤、緑、青のクロスハッチングが起こっています。 – rocklobster

答えて

1

私の独自のTGAローダーを書き終え、高さにピクセルあたりのバイト数を乗算する必要があることが判明しました。それでも100%確信しているわけではありませんが、今は動作します。

コード:

TGAReader* reader = new TGAReader(); 
reader->readSurface("MyTexture.tga"); 

int height = reader->height; 
int width = reader->width; 
int bpp = reader->bpp; 

unsigned char* texture = new unsigned char[width * height * bpp]; 

for (int y = 0; y < height * bpp; y++) 
{ 
    for (int x = 0; x < width; x += 3) 
    { 
     int index = (y * width) + x; 

     Colour24 colour = reader->getColourAt(x, y); 

     newTexture[index] = colour.r; 
     newTexture[index + 1] = colour.g; 
     newTexture[index + 2] = colour.b; 
    } 
} 
// create OpenGL texture 
unsigned int = createTextureFromData(newTexture, width, height, bpp); 

// reading tga data 
Colour24 TGAReader::getColourAt(int x, int y) 
{ 
    Colour24 rgb; 

    rgb.r = m_data[((y * width) + x)]; 
    rgb.g = m_data[((y * width) + x) + 1]; 
    rgb.b = m_data[((y * width) + x) + 2]; 

    return rgb; 
} 
0

サイズはUint8の宣言に依存します。一方、unsigned charのサイズは、多くのプラットフォームでは8ビットですが、C++標準では正確に8ビットに指定されていません。

変換エラーを避けるには、Colour24に直接Uint8を使用する方がよいでしょう。

+0

ありがとう、私は今それを試してみます。 – rocklobster

+0

EDIT:チェックしました。 Uint8はuint8_tのtypedefです。これはunsigned char型のtypedefです。 – rocklobster

2

信じられないほど秘密のアーキテクチャを使用していない限り、unsigned charはほぼ確実にuint8_tに相当します。

しかし、コードにはいくつか問題がありますが、何をしようとしているのか、問題が何であるかは明確ではありません。

まず、getColourAt()を呼び出すときにx座標とy座標を入れ替えました。私はこのように、あなたは幅インデックスにインデックスに高さとjをIを使用しているので、あなたがjを使用する必要があります。

Colour24 colour = getColourAt(j, i); 

おそらくx、yの命名に固執する方が簡単だろう。

第2に、テクスチャバッファへのインデックス付けが間違っています。それは次のようになります。

texture[i*width+j+0] = colour.red; 
texture[i*width+j+1] = colour.green; 
texture[i*width+j+2] = colour.blue; 

あなたがwidthバイトのi完全な行、および不完全な行のjバイトを持っているからです。

また、SDL_GetRGBコールでピクセル形式が欠落しているため、コンパイルされません。

最後に、getColour()関数は正しく動作しません。 x、yでイメージにオフセットしていないので、常に0,0のピクセル値を返します。あなたはこれと同じテクニックを使用することができます。 RGBA(32ビット)ピクセル形式を意味するSDLでUInt32を使用しているように、RGB(24ビット)を使用しているかのように、インデックス作成には注意が必要です。

+0

これを今すぐテストしてください。わかりやすく元の投稿を編集しました。 – rocklobster

+0

私はオリジナルの投稿を私が使っている新しいコードで更新しました。私は別の結果を持っていますが、まだ奇妙なものです。 – rocklobster

+1

テクスチャバッファにy値のインデックスを掛けるときに、heightではなくwidthを使用する必要があります。また、ピクセルはUInt32なので、バッファを24bppではなく32bppとして扱い、上記のトラップに入ります。すべてのピクセル形式で動作する完全なソリューションについては、http://www.libsdl.org/cgi/docwiki.cgi/Introduction_to_SDL_Video#getpixelをご覧ください。 – gavinb

関連する問題