2

openGL ES(iPhone用)を使用してテクスチャにレンダリングしてから、画面にテクスチャを表示しようとしています。テクスチャの上部に32行のギャップがあり、下部の32行が切り取られていることを除いて、すべてが機能します。すべての描画が32ピクセル下にオフセットされているようです。その結果、下の32行はテクスチャの外側にあるため描画されません。

非常に簡単な例を次に示します。

void RenderToTexture( int texture )
{
    unsigned char buffer[4 * 320 * 480];
    unsigned char colour[4];
    colour[0] = 255;
    colour[1] = 0;
    colour[2] = 0;
    colour[3] = 128;
    for ( int i = 0; i < 4 * 320 * 480; i += 4 )
    {
        buffer[i] = colour[0];
        buffer[i+1] = colour[1];
        buffer[i+2] = colour[2];
        buffer[i+3] = colour[3];
    }
    glBindTexture( GL_TEXTURE_2D, texture );
    glTexSubImage2D( GL_TEXTURE_2D, 0, 0, 0, 320, 480, GL_RGBA, GL_UNSIGNED_BYTE, buffer );
}

結果は次のとおりです。

http://img10.imageshack.us/img10/2113/screenjc.th.jpg

RenderToTexture()を呼び出す代わりにglColor4f()を使用して色を設定するだけで、期待どおりに赤い画面が表示されます。

4

2 に答える 2

5

その 32 ピクセルは 512 に欠けているものです: 512 - 480 = 32. その理由は、GL_TEXTURE_2D で 2 のべき乗であるテクスチャ サイズしか使用できないためです。そのため、幅と高さを切り上げて 512 にする必要があります。テクスチャ座標を使用するか、テクスチャ マトリックスを設定することで、テクスチャの必要な部分のみを表示できます。

于 2009-10-20T07:55:55.393 に答える
1

iPhone 3GS は、特定の条件下で非 2 のべき乗テクスチャをサポートします。次のすべてに該当する必要があります。

  • GL_TEXTURE_WRAP_S は GL_CLAMP_TO_EDGE に設定する必要があります
  • GL_TEXTURE_WRAP_T は GL_CLAMP_TO_EDGE に設定する必要があります
  • ミップマッピングはオフにする必要があります。GL_LINEAR_MIPMAP_LINEAR ではなく GL_LINEAR で縮小する
于 2009-10-20T15:26:13.647 に答える