为什么我的老报空指针!
OpenGL.java代码如下:
public class OpenGL extends Activity {
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
GLRender render=new GLRender();
GLSurfaceView view=new GLSurfaceView(this);
view.setRenderer(render);
setContentView(view);
}
}
class GLImage
{
public static Bitmap mBitmap1;
public static Bitmap mBitmap2;
public static Bitmap mBitmap3;
public static Bitmap mBitmap4;
public static Bitmap mBitmap5;
public static Bitmap mBitmap6;
public static void load(Resources resources)
{
mBitmap1 = BitmapFactory.decodeResource(resources, R.drawable.b01);
mBitmap2 = BitmapFactory.decodeResource(resources, R.drawable.b02);
mBitmap3 = BitmapFactory.decodeResource(resources, R.drawable.b03);
mBitmap4 = BitmapFactory.decodeResource(resources, R.drawable.b04);
mBitmap5 = BitmapFactory.decodeResource(resources, R.drawable.b05);
mBitmap6 = BitmapFactory.decodeResource(resources, R.drawable.b06);
}
}
GLRender.java代码如下:
public class GLRender implements Renderer{
int one = 0x10000;
int texture;
float rotateTri;
float rotateQuad;
//三角形三个顶点
private IntBuffer triggerBuffer = IntBuffer.wrap(new int[]{
0,one,0, //上顶点
-one,-one,0, //左下点
one,-one,0,}); //右下点
private FloatBuffer textCoords=FloatBuffer.wrap(new float[]{
0.0f,0.0f,
1.0f,0.0f,
0.5f,1.0f,
});
public void onDrawFrame(GL10 gl) {
// TODO Auto-generated method stub
//清除屏幕和深度缓存
gl.glClear(GL10.GL_COLOR_BUFFER_BIT|GL10.GL_DEPTH_BUFFER_BIT);
//重置当前的模型观察矩阵
gl.glLoadIdentity();
//左移1.5个单位,并移入屏幕6.0个单位
gl.glTranslatef(-1.5f, 0.0f, -6.0f);
//允许设置定点
gl.glEnableClientState(GL10.GL_VERTEX_ARRAY);
gl.glEnableClientState(GL10.GL_TEXTURE_COORD_ARRAY);
gl.glTexCoordPointer(2, GL10.GL_FIXED, 0,textCoords);
gl.glBindTexture(GL10.GL_TEXTURE_2D, texture);
//设置三角形
gl.glVertexPointer(3, GL10.GL_FIXED, 0, triggerBuffer);
//绘制三角形
gl.glDrawArrays(GL10.GL_TRIANGLES, 0, 3);
gl.glEnableClientState(GL10.GL_TEXTURE_COORD_ARRAY);
gl.glEnableClientState(GL10.GL_VERTEX_ARRAY);
}
public void onSurfaceChanged(GL10 gl, int width, int height) {
// TODO Auto-generated method stub
float ratio=(float)width/height;
gl.glViewport(0, 0, width, height);//设置OpenGL场景的大小
gl.glMatrixMode(GL10.GL_PROJECTION);//设置投影矩阵
gl.glLoadIdentity();//重置投影矩阵
gl.glFrustumf(-ratio, ratio, -1, 1, 1, 10);//设置视口大小
gl.glMatrixMode(GL10.GL_MODELVIEW);//选择模型观察矩阵
gl.glLoadIdentity();//重置模型观察矩阵
}
public void onSurfaceCreated(GL10 gl, EGLConfig config) {
// TODO Auto-generated method stub
//告诉系统对透视进行修改
gl.glHint(GL10.GL_PERSPECTIVE_CORRECTION_HINT, GL10.GL_FASTEST);
//设置背景颜色(黑色)
gl.glClearColor(0, 0, 0, 0);
//启动阴影平滑
gl.glShadeModel(GL10.GL_SMOOTH);
//设置深度缓存
gl.glClearDepthf(1.0f);
//启用深度缓存测试
gl.glEnable(GL10.GL_DEPTH_TEST);
//声明所做深度测试的类型
gl.glDepthFunc(GL10.GL_LEQUAL);
IntBuffer intBuffer=IntBuffer.allocate(1);
gl.glGenTextures(1, intBuffer);
texture=intBuffer.get();
gl.glBindTexture(GL10.GL_TEXTURE_2D, texture);
GLUtils.texImage2D(GL10.GL_TEXTURE_2D, 0, GLImage.mBitmap3, 0);
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);
}
}
Logcat日志输出如下:
07-18 02:15:32.224: ERROR/AndroidRuntime(367): FATAL EXCEPTION: GLThread 8
07-18 02:15:32.224: ERROR/AndroidRuntime(367): java.lang.NullPointerException: texImage2D can't be used with a null Bitmap07-18 02:15:32.224: ERROR/AndroidRuntime(367): at android.opengl.GLUtils.texImage2D(GLUtils.java:143)
07-18 02:15:32.224: ERROR/AndroidRuntime(367): at wyf.wpf.GLRender.onSurfaceCreated(GLRender.java:82)
07-18 02:15:32.224: ERROR/AndroidRuntime(367): at android.opengl.GLSurfaceView$GLThread.guardedRun(GLSurfaceView.java:1317)
07-18 02:15:32.224: ERROR/AndroidRuntime(367): at android.opengl.GLSurfaceView$GLThread.run(GLSurfaceView.java:1116)
07-18 02:23:49.467: ERROR/OpenGLES(399): Application com.android.cube (SDK target 3) called a GL11 Pointer method with an indirect Buffer.
主要问题是,我再另一个项目中同样这样引用图片,都没抛空指针,为什么在这里就抛空指针呢?如果哪位大哥不介意,能否给一个完整的代码。谢谢!