我正在尝试通过openGL显示纹理。在下面的代码中,我想用纹理绘制简单的正方形。当我在Android模拟器上运行它时,一切都很好,但是当我在真实设备上运行它时,我只能看到没有任何纹理的白色方块。
There is similar problem,但我不使用NDK。我只使用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);
}
有人可以查看我的代码并告诉我问题出在哪里吗?
答案 0 :(得分:2)
您还记得将缩小过滤器设置为不使用mipmap吗?如果你没有,我会很惊讶这会在模拟器上工作,但也许它可以出于某种原因。
E.g。
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
http://www.opengl.org/wiki/Common_Mistakes#Creating_a_Texture
答案 1 :(得分:1)
模拟器不会运行OpenGL ES,它会运行桌面驱动程序。意味着它可以支持纹理不是2 ^ n,其中你的手机只支持2 ^ n(又名方形)的纹理。
我会检查一下,如果你没有错误,很可能是你的问题。抓住2 ^ n图像,看看它是否适合你。