グラフィック専用に glDrawTexfoes() を使用しているゲームがあります。もちろん2dです。今まで、グラフィックを描画するときにグラフィックを引き延ばしませんでした。2 つのセットがあり、1 つは小さなもので、もう 1 つはデバイスごとに大きいものでした。そのアプローチは限界に達しています (率直に言って、私はそれを使用するべきではありませんでしたが、それは 2 年前のことです)。
だから今、私は画像の単一のセットを使用しようとしており、glDrawTexfoes を使用して、それらをスケーリングしてディスプレイを埋めようとしています。画像を並べる場所を除いて、ほとんどの部分で機能しています。結果を示す画像を含めました。垂直線は存在しないはずです。
テクスチャ パラメータをできる限りいじりましたが、この問題を取り除くことができないため、SO に切り替えています。詳細は次のとおりです。画像は 2 の累乗ではありません。スプライト シートを使用しておらず、各スプライトには独自のビットマップがあります。
このコードを使用してテクスチャを作成します
bitmap.prepareTexture(_glMaxTextureSize);
gl.glGenTextures(1, mTextureNameWorkspace, 0);
int error = gl.glGetError();
if (error != GL10.GL_NO_ERROR) {
Log.d("Texture Load 1", "GLError: " + error + " (" + GLU.gluErrorString(error) + "): " + bitmap.toString() );
}
assert error == GL10.GL_NO_ERROR;
bitmap.textureName = mTextureNameWorkspace[0];
gl.glBindTexture(GL10.GL_TEXTURE_2D, bitmap.textureName);
error = gl.glGetError();
if (error != GL10.GL_NO_ERROR) {
Log.d("Texture Load 2", "GLError: " + error + " (" + GLU.gluErrorString(error) + "): " + bitmap.toString());
}
assert error == GL10.GL_NO_ERROR;
gl.glTexParameterf(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_MIN_FILTER, GL10.GL_LINEAR);
gl.glTexParameterf(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_MAG_FILTER, GL10.GL_LINEAR);
gl.glTexParameterf(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_WRAP_S, GL10.GL_REPEAT);
gl.glTexParameterf(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_WRAP_T, GL10.GL_REPEAT);
gl.glTexEnvf(GL10.GL_TEXTURE_ENV, GL10.GL_TEXTURE_ENV_MODE, GL10.GL_REPLACE); //GL10.GL_REPLACE);
GLUtils.texImage2D(GL10.GL_TEXTURE_2D, 0, bitmap.textureHanlde, 0);
error = gl.glGetError();
if (error != GL10.GL_NO_ERROR) {
Log.d("Texture Load 3", "GLError: " + error + " (" + GLU.gluErrorString(error) + "): " + bitmap.toString());
}
bitmap.releaseTextureBitmap();
assert error == GL10.GL_NO_ERROR;
mCropWorkspace[0] = 0;
mCropWorkspace[1] = bitmap.getHeight();
mCropWorkspace[2] = bitmap.getWidth();
mCropWorkspace[3] = -bitmap.getHeight();
((GL11) gl).glTexParameteriv(GL10.GL_TEXTURE_2D, GL11Ext.GL_TEXTURE_CROP_RECT_OES, mCropWorkspace, 0);
error = gl.glGetError();
if (error != GL10.GL_NO_ERROR) {
Log.d("Texture Load 4", "GLError: " + error + " (" + GLU.gluErrorString(error) + "): " + bitmap.toString());
}
assert error == GL10.GL_NO_ERROR;
OpenGL コンテキストは、次のコードで作成されます
/*
* Some one-time OpenGL initialization can be made here probably based
* on features of this particular context
*/
gl.glHint(GL10.GL_PERSPECTIVE_CORRECTION_HINT, GL10.GL_FASTEST);
gl.glClearColor(0.0f, 0.0f, 0.0f, 1);
gl.glShadeModel(GL10.GL_FLAT);
gl.glDisable(GL10.GL_DEPTH_TEST);
gl.glEnable(GL10.GL_TEXTURE_2D);
/*
* By default, OpenGL enables features that improve quality but reduce
* performance. One might want to tweak that especially on software
* renderer.
*/
gl.glDisable(GL10.GL_DITHER);
gl.glDisable(GL10.GL_LIGHTING);
gl.glTexEnvx(GL10.GL_TEXTURE_ENV, GL10.GL_TEXTURE_ENV_MODE, GL10.GL_MODULATE);
gl.glClear(GL10.GL_COLOR_BUFFER_BIT | GL10.GL_DEPTH_BUFFER_BIT);
ビューポートは次のように設定されます
float scaleX = (float)w / _screenWidth;
float scaleY = (float)h / _screenHeight;
final int viewportWidth = (int)(_screenWidth * scaleX);
final int viewportHeight = (int)(_screenHeight * scaleY);
gl.glViewport(0, 0, viewportWidth, viewportHeight);
mScaleX = scaleX;
mScaleY = scaleY;
/*
* Set our projection matrix. This doesn't have to be done each time we
* draw, but usually a new projection needs to be set when the viewport
* is resized.
*/
float ratio = (float) _screenWidth / _screenHeight;
gl.glMatrixMode(GL10.GL_PROJECTION);
gl.glLoadIdentity();
gl.glFrustumf(-ratio, ratio, -1, 1, 1, 10);
最後に、コードの壁を許して、描画は次のように行われます
gl.glShadeModel(GL10.GL_FLAT);
gl.glEnable(GL10.GL_BLEND);
gl.glBlendFunc(GL10.GL_ONE, GL10.GL_ONE_MINUS_SRC_ALPHA);
gl.glColor4x(0x10000, 0x10000, 0x10000, 0x10000);
gl.glViewport(0, 0, (int)viewWidth, (int)viewHeight);
gl.glMatrixMode(GL10.GL_PROJECTION);
gl.glLoadIdentity();
gl.glOrthof(0, viewWidth, viewHeight, 0.0f, 0.0f, 1.0f);
gl.glMatrixMode(GL10.GL_MODELVIEW);
gl.glLoadIdentity();
gl.glEnable(GL10.GL_TEXTURE_2D);
[loop over sprites]
final float screenScale = 800/600f; // hardcoded to test stuff out
final float snappedX = ((x + transX)*screenScale); //+ e.speedX * interpolation;
final float snappedY = _screenHeight - (y + height + transY ) * screenScale;//+ e.speedY * interpolation);
final int texName = ob.textureName;
gl.glBindTexture(GL10.GL_TEXTURE_2D, texName);
_cropWorkspace[0] = left;
_cropWorkspace[1] = top + height;
_cropWorkspace[2] = width;
_cropWorkspace[3] = -height;
if( operation == Drawer.MIRROR_X )
{
_cropWorkspace[0] = left + width;
_cropWorkspace[2] = -width;
}
((GL11) gl).glTexParameteriv(GL10.GL_TEXTURE_2D, GL11Ext.GL_TEXTURE_CROP_RECT_OES, _cropWorkspace, 0);
((GL11Ext) gl).glDrawTexfOES(snappedX, snappedY, 1, width * screenScale, height * screenScale );