0

以下の質問に答えました。gavinb の支援に感謝します。

質問: 学習体験のためだけにテクスチャを複製しようとしています。私は 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 テクスチャに送信することを計画していますが、直接 surface->pixels を送信すると機能します。しかし、データ配列を自分で作成したいと思います。助けていただければ幸いです。

編集:申し訳ありませんが、私は自分自身を十分に説明していません。24 ビットの TGA イメージを含む SDL_Surface からテクスチャを手動で再作成しようとしています。それを opengl に渡してテクスチャを作成します。Surface->pixels を使用して OpenGL コードをテストしたところ、正常に動作しました。どこでロードを間​​違えたのかを突き止めようとしています。

4

3 に答える 3

2

信じられないほど難解なアーキテクチャを使用していない限り、ほぼunsigned char確実に同等です。uint8_t

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

まず、getColourAt() を呼び出すときに x、y 座標を転置しました。高さのインデックスに i を使用し、幅のインデックスに j を使用しているため、次のように j,i を使用する必要があります。

Colour24 colour = getColourAt(j, i);

おそらく、x,y の命名に固執する方が簡単でしょう。

次に、テクスチャ バッファへのインデックス付けが間違っています。そのはず:

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

バイトのi完全な行と、不完全な行のバイトがあるためです。widthj

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

最後に、getColour() 関数は正しく機能しません。x、yで画像にオフセットしていないため、常に0,0のピクセルの値を返します。これには、上記と同じ手法を使用できます。RGBA (32 ビット) ピクセル形式を意味する SDL で UInt32 を使用しているが、RGB (24 ビット) を使用しているかのように、インデックス作成には注意してください。

于 2012-04-20T10:49:33.250 に答える
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;
}
于 2012-04-20T17:29:51.977 に答える
0

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

変換エラーを避けるためUint8に、直接使用することをお勧めします。Colour24

于 2012-04-20T10:44:04.593 に答える