Reputation: 732
I'm trying to show textures by openGL. In following code I want to draw simple square with texture. When I run it on android emulator, everything is OK, but when I run it on real device, I can see only white square without any texture.
There is similar problem, but I don't use NDK. I use only Java.
public class MainActivity extends Activity
{
public static TextView t;
@Override
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
LinearLayout l = new LinearLayout(this);
t = new TextView(this);
l.addView(t);
l.setOrientation(1);
l.addView(new ImageView(this));
setContentView(l);
}
long last = System.currentTimeMillis();
int FPS = 0;
//Show FPS(+ some extraData)
public void FPS(final String extraData)
{
if(System.currentTimeMillis()<last+1000)
{
FPS++;
}
else
{
runOnUiThread(new Runnable(){@Override public void run(){
t.setText((double)FPS/(((double)System.currentTimeMillis()-last)/1000)+";"+extraData);
}});
FPS = 0;
last = System.currentTimeMillis();
}
}
public class ImageView extends GLSurfaceView implements GLSurfaceView.Renderer
{
MainActivity thiz;
public ImageView(MainActivity thiz)
{
super(thiz);
this.thiz = thiz;
setRenderer(this);
}
FloatBuffer vertex;
ShortBuffer texture;
int[] textureID = new int[1];
public void onDrawFrame(GL10 gl)
{
gl.glClear(GL10.GL_COLOR_BUFFER_BIT);
gl.glVertexPointer(2, GL10.GL_FLOAT, 0, vertex);
gl.glTexCoordPointer(2, GL10.GL_SHORT, 0, texture);
gl.glDrawArrays(GL10.GL_TRIANGLE_STRIP, 0, 4);
thiz.FPS("");
}
public void onSurfaceCreated(GL10 gl, EGLConfig arg1)
{
vertex = FloatBuffer.wrap(new float[]{-0.5f, -0.5f,
0.5f, -0.5f,
-0.5f, 0.5f,
0.5f, 0.5f});
texture = ShortBuffer.wrap(new short[]{0, 1,
1, 1,
0, 0,
1, 0});
Bitmap b = BitmapFactory.decodeResource(thiz.getResources(), R.drawable.nex2);
gl.glGenTextures(1, textureID, 0);
gl.glBindTexture(GL10.GL_TEXTURE_2D, textureID[0]);
GLUtils.texImage2D(GL10.GL_TEXTURE_2D, 0, b, 0);
b.recycle();
gl.glClearColor(0.1f, 0.5f, 1f, 1f);
gl.glEnable(GL10.GL_TEXTURE_2D);
gl.glEnableClientState(GL10.GL_VERTEX_ARRAY);
gl.glEnableClientState(GL10.GL_TEXTURE_COORD_ARRAY);
}
public void onSurfaceChanged(GL10 gl, int w, int h)
{
gl.glViewport(0, 0, w, h);
}
Can someone look at my code and tell me where is the problem?
Upvotes: 0
Views: 644
Reputation: 35933
Do you remember to set the minification filter to not use mipmaps? I'm kind of surprised this would work on the emulator if you didn't, but maybe it allows it for some reason.
E.g.
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
http://www.opengl.org/wiki/Common_Mistakes#Creating_a_Texture
Upvotes: 2
Reputation: 8325
The emulator does NOT run OpenGL ES afaik, it runs off of the desktop driver. Meaning it can support textures are not 2^n, where your phone only supports textures that are 2^n(aka square).
I would check this, it is most likely your issue if you are getting no errors. Grab a 2^n image and see if it works for you.
Upvotes: 1