2

OpenGL ではテクスチャが 2 の累乗でなければならないため、OpenGL で問題が発生しています。私がやっていることは次のとおりです。

I PNGLIB または SOIL を使用して、PNG ファイルを unsigned char の配列にロードします。アイデアは、この配列を実行して、自分に関連する部分を「選択」できるということです。たとえば、人をロードしたと想像してください。ただし、頭を別のテクスチャに保存したいだけです。したがって、配列をループして、必要な部分のみを選択します。

最初の質問: 配列内のデータは RGBA モードで格納されていると思いますが、データが行方向または列方向で埋められているかどうかはまだわかりません。この情報を知ることは可能ですか?

2 番目の質問:常に 2 の累乗のテクスチャを作成する必要があるため、幅 513 ピクセルの画像があり、幅 1024 ピクセルのテクスチャが必要になる場合があります。そのため、ピクセルが本来あるべき場所にないため、画像が完全に「破壊」されたように見えます。テクスチャは、配列に入力された関連データとは異なるサイズです。では、画像の内容を再度取得するために配列を再編成するにはどうすればよいでしょうか? 次のことを試しましたが、うまくいきません。

unsigned char* new_memory = 0;

    int index = 0;
    int new_index = 0;
    new_memory = new unsigned char[new_tex_width * new_tex_height * 4];

    for(int i=0; i<picture.width; i++) // WIDTH
    {
        for(int j=0; j<picture.height; j++) // HEIGHT
        {
            for(int k=0; k<4; k++) // DEPTH
                new_memory[new_index++] = picture.memory[index++];//picture.memory[i + picture.height * (j + 4 * k)];
        }
        new_index += new_tex_height - picture.height;
    }


    glGenTextures(1, &png_texture);
    glBindTexture(GL_TEXTURE_2D, png_texture);

    glTexImage2D(GL_TEXTURE_2D, 0, 3, new_tex_width, new_tex_height, 0 , GL_RGBA, GL_UNSIGNED_BYTE, new_memory);
4

1 に答える 1

3

2つのテクスチャの非パワーは、かなり前からサポートされています。ただし、テクスチャアトラスを作成し、テクスチャを再配置することには、まだ多くのメリットがあります。これを行う方法は、freeimageを使用することです。これは、これらすべてを処理し、一部の圧縮形式をサポートするためです。

あなたがそれをあなたのやり方でやりたい、そしてそれが単なるビットマップであることを知っているなら、私はそれを(テストされておらず、入力をチェックしませんが、あなたにアイデアを与えるはずです)の線に沿ってもっとやります:

void Blit( int xOffset, int yOffset, int targetW, int sourceW, int sourceH, unsigned char* source, unsigned char* target, unsigned int bpp )
{
    for( unsigned int i = 0; i < sourceH; ++i )
    {
        memcpy( target + bpp * ( targetW * ( yOffset + i ) + xOffset ), source + sourceW * i * bpp, sourceW * bpp );
    }
}

基本的には、各行を取得してmemcpyします。

于 2012-06-18T10:01:23.020 に答える