私は、ネイティブ コードを使用して単一の OpenGL 2D テクスチャに描画する 2D ゲームに取り組んでいます。テクスチャはそのまま画面に描画されます。ディスプレイが回転している場合を除いて、コードは正常に機能します。ゲームは引き続き正しくプレイされますが、テクスチャが切り捨てられ、画面の中心からずれています。どの向きで開始してもゲームは正しく再生されますが、向きを変えるとペイントの問題が発生します。GL コンテキストが破壊されず、各方向の描画パラメータが正しく計算されるように、方向の変更を適切に処理しています。私が考えることができる唯一のことは、onSurfaceChanged() イベントの処理でいくつかのステップが欠落している可能性があるということです。onSurfaceChanged() によって呼び出されるネイティブ コードは次のとおりです。
if (pTexture)
free(pTexture);
pTexture = malloc(iTexturePitch * iTextureHeight);
rect[0] = 0;
rect[1] = iHeight; // w,h fit within the texture size
rect[2] = iWidth;
rect[3] = -iHeight;
glDeleteTextures(1, &s_texture);
while (*start)
glDisable(*start++); // disable unused options
glEnable(GL_TEXTURE_2D);
glGenTextures(1, &s_texture);
glBindTexture(GL_TEXTURE_2D, s_texture);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glShadeModel(GL_FLAT);
glColor4x(0x10000, 0x10000, 0x10000, 0x10000);
glTexParameteriv(GL_TEXTURE_2D, GL_TEXTURE_CROP_RECT_OES, rect);
テクスチャを表示するコード:
glClear(GL_COLOR_BUFFER_BIT);
glTexImage2D(GL_TEXTURE_2D, /* target */
0, /* level */
GL_RGB, /* internal format */
iTextureWidth, /* width */
iTextureHeight, /* height */
0, /* border */
GL_RGB, /* format */
GL_UNSIGNED_SHORT_5_6_5,/* type */
pTexture); /* pixels */
// border x/y for centering; stretched x/y is the destination size on the display
glDrawTexiOES(iBorderX, iBorderY, 0, iStretchedWidth, iStretchedHeight);