Android glDrawTexfOES在手机上绘制黑色纹理,并在emulator中更正
我正在使用OpenGL编写一个2D游戏,使用存储在我的资源中的png图像(64x64像素,具有透明度) 我的代码如下所示:Android glDrawTexfOES在手机上绘制黑色纹理,并在emulator中更正,android,opengl-es,Android,Opengl Es,我正在使用OpenGL编写一个2D游戏,使用存储在我的资源中的png图像(64x64像素,具有透明度) 我的代码如下所示: import javax.microedition.khronos.egl.EGLConfig; import javax.microedition.khronos.opengles.GL10; import javax.microedition.khronos.opengles.GL11; import javax.microedition.khronos.opengle
import javax.microedition.khronos.egl.EGLConfig;
import javax.microedition.khronos.opengles.GL10;
import javax.microedition.khronos.opengles.GL11;
import javax.microedition.khronos.opengles.GL11Ext;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.opengl.GLUtils;
import android.opengl.GLSurfaceView.Renderer;
public class TestGLRenderer implements Renderer {
private int mTexGLNames[];
private Context mContext;
public TestGLRenderer(Context ctx) {
mContext = ctx;
}
public void onSurfaceCreated(GL10 gl, EGLConfig config) {
// setup the gl renderer
gl.glClearColor(0.2f, 0.4f, 0.6f, 1.0f);
gl.glEnable(GL10.GL_TEXTURE_2D);
gl.glShadeModel(GL10.GL_FLAT);
gl.glEnable(GL10.GL_BLEND);
gl.glBlendFunc(GL10.GL_ONE, GL10.GL_ONE_MINUS_SRC_ALPHA);
// reserve GL texture names
mTexGLNames = new int[1];
gl.glGenTextures(1, mTexGLNames, 0);
// load image from resources
Bitmap b;
b = BitmapFactory.decodeResource(mContext.getResources(),
R.drawable.image);
// load image in opengl
gl.glBindTexture(GL10.GL_TEXTURE_2D, mTexGLNames[0]);
GLUtils.texImage2D(GL10.GL_TEXTURE_2D, 0, b, 0);
}
public void onDrawFrame(GL10 gl) {
gl.glClear(GL10.GL_COLOR_BUFFER_BIT | GL10.GL_DEPTH_BUFFER_BIT);
gl.glColor4f(1.0f, 1.0f, 1.0f, 1.0f);
gl.glBindTexture(GL10.GL_TEXTURE_2D, mTexGLNames[0]);
int crop[] = new int[] { 0, 64, 64, -64 };
((GL11) gl).glTexParameteriv(GL10.GL_TEXTURE_2D,
GL11Ext.GL_TEXTURE_CROP_RECT_OES, crop, 0);
((GL11Ext) gl).glDrawTexfOES(160, 240, 0, 64, 64);
}
public void onSurfaceChanged(GL10 gl, int w, int h) {
}
}
结果在模拟器(运行安卓2.2)中工作正常,但在我的手机(LG-P500,安卓2.2)上,图像显示为黑色方块。附件是模拟器和我的手机的截图
我的代码有问题吗,还是我的手机有问题(我的手机可以运行其他3D游戏而没有问题)
我不确定原因是否与您相同,但请尝试一下 我以前加载过纹理(和你一样的问题): 这在emulator中可以很好地工作,但您可以设置更多参数来设置纹理的计算方式。我的猜测是,手机无法在默认情况下设置这些,这就是为什么它不工作(但这只是猜测)。因此,对于解决方案:
gl.glBindTexture(GL10.GL_TEXTURE_2D, textureIDs[i]); //Same
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);
GLUtils.texImage2D(GL10.GL_TEXTURE_2D, 0, bitmaps[i], 0); //Same
就这样。如果您不知道,您可以从这些参数(GL_LINEAR和GL_REPEAT)中搜索更多信息
我希望这会有所帮助。=)我不确定原因是否与您相同,但请尝试一下 我以前加载过纹理(和你一样的问题): 这在emulator中可以很好地工作,但您可以设置更多参数来设置纹理的计算方式。我的猜测是,手机无法在默认情况下设置这些,这就是为什么它不工作(但这只是猜测)。因此,对于解决方案:
gl.glBindTexture(GL10.GL_TEXTURE_2D, textureIDs[i]); //Same
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);
GLUtils.texImage2D(GL10.GL_TEXTURE_2D, 0, bitmaps[i], 0); //Same
就这样。如果您不知道,您可以从这些参数(GL_LINEAR和GL_REPEAT)中搜索更多信息
我希望这会有所帮助=)事实上,我假设这些设置都有默认设置(在我使用的大多数框架中都有)。事实上,我假设这些设置都有默认设置(在我使用的大多数框架中都有)。在解释了它们之后,它现在起作用了。