|
本人是opengl的初学者,在网上找了不少代码学习画图。但是发现一个共同的问题,教程代码在我的机子上总是无法正确绘出图像。我自己debug的感觉就是无法正确的把编号的顶点数组加载到显卡的内存里。
下面是我的所有代码,基本上是照抄网上给的教程的代码,而且教程给出了截图,感觉代码应该没问题。
嘿嘿,代码比较多啊,不好意思。这个问题我搞了快一个礼拜了,把人急死了。
//MyOpenGLActivity.java下的代码
package lzy.MyOpenGL;
import android.app.Activity;
import android.opengl.GLSurfaceView;
import android.os.Bundle;
public class MyOpenGLActivity extends Activity {
OpenGl render;//我自己写的Render类,继承了Renderer, View.OnTouchListener接口
GLSurfaceView gview;
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
render = new OpenGl();//创建函数里面是对float数组、FloatBuffer、ByteBuffer以及一些变量的初始化
gview=new GLSurfaceView(this);
gview.setRenderer(render);
setContentView(gview);
gview.setOnTouchListener(render);//触摸屏幕的监听器
}
}
//OpenGl.java下的代码
package lzy.MyOpenGL;
import javax.microedition.khronos.egl.EGLConfig;
import javax.microedition.khronos.opengles.GL10;
import android.opengl.GLSurfaceView.Renderer;
import android.view.MotionEvent;
import android.view.View;
import java.nio.FloatBuffer;
import java.nio.ByteBuffer;
import java.nio.ShortBuffer;
public class OpenGl implements Renderer, View.OnTouchListener{
private float backgroundColor;//背景颜色变量
private float x, y, z;//控制glTranslatef函数的三个变量
private float lastX, lastY;//保存触摸屏事件里ACTION_DOWN行为的前一个点
private float one = 0.05f;//建立图形顶点用的一个公共变量
private FloatBuffer colorBuffer, lineBuffer;//依次是颜色数组和顶点数组的Buffer类
private ByteBuffer colorBB, lineBB; //对应上面的ByteBuffer类
private float[] line = {//这里是最奇怪的,不管我怎么改变line[]里面的数据,最后画出来的东西丝毫不受影响,就算全写成0,不管用
0, 0, 0,
0, 0, 0,
0, 0, 0
};
private float[] color = {这里的情况跟上面line的类似,不管用
255f,255f,255f,0,
255f,255f,255f,0,
255f,255f,255f,0,
};
@Override
public void onDrawFrame(GL10 gl) {
gl.glEnableClientState(GL10.GL_VERTEX_ARRAY);
gl.glEnableClientState(GL10.GL_COLOR_ARRAY);
gl.glClear(GL10.GL_COLOR_BUFFER_BIT);
gl.glClearColor(backgroundColor, backgroundColor, backgroundColor, 1.0f);
gl.glLoadIdentity();
gl.glTranslatef(x, -y, z);//这里是实现鼠标拖动屏幕效果的函数,管用
gl.glPointSize(10f);
//个人感觉问题就出在下面两行里,通过debug调试,确实能看到lineBuffer和colorBuffer里面分配了空间。而且在运行的时候查看变量也能看到gl的定点数组和颜色数组已经赋值(在这段代码后面有调试时候的变量内容,我用红色下划线标出来了)
gl.glVertexPointer(3, GL10.GL_FLOAT, 0, lineBuffer);
gl.glColorPointer(4, GL10.GL_FLOAT, 0, colorBuffer);
gl.glDrawArrays(GL10.GL_POINTS, 0, line.length / 3);//执行后画出来的东西不是我想要的,比如我在(0,0,0)处画点,结果是(0,0,0)没有点,大概在(0,1,0)处有一个点,而且这个点是不受我控制的,每次画图都会有这个点
gl.glDisableClientState(GL10.GL_VERTEX_ARRAY);
gl.glDisableClientState(GL10.GL_COLOR_ARRAY);
//gl.glFinish();//这一行注释不注释一个效果
}
@Override
public void onSurfaceChanged(GL10 gl, int width, int height) {
// TODO Auto-generated method stub
}
@Override
public void onSurfaceCreated(GL10 gl, EGLConfig config) {
// TODO Auto-generated method stub
}
public OpenGl(){
colorBB = ByteBuffer.allocateDirect(color.length * 4);
colorBuffer = colorBB.asFloatBuffer();
colorBuffer.put(color);
colorBuffer.position(0);
lineBB = ByteBuffer.allocateDirect(line.length * 4);
lineBuffer = lineBB.asFloatBuffer();
lineBuffer.put(line);
lineBuffer.position(0);
backgroundColor = 0.7f;
x = y =z =0f;
}
@Override
public boolean onTouch(View v, MotionEvent event) {//感觉跟这里面的代码没关系,这里就是实现用鼠标拖动屏幕的时候能让屏幕上的内容也跟着平移
// TODO Auto-generated method stub
switch(event.getAction()){
case MotionEvent.ACTION_DOWN:{
if(event.getX() == lastX && event.getY() == lastY){
x = y = z = 0;
}
lastX = event.getX();
lastY = event.getY();
break;
}
case MotionEvent.ACTION_MOVE:{
x += (event.getX() - lastX) / 500;
y += (event.getY() - lastY) / 500;
lastX = event.getX();
lastY = event.getY();
break;
}
}
return true;
}
}
这里就是调试到的变量内容,看着gl也被成功的传递了数组顶点和颜色数组啊
gl GLImpl (id=830007801232)
_colorPointer FloatToByteBufferAdapter (id=830007774752)
_matrixIndexPointerOES null
_normalPointer null
_pointSizePointerOES null
_texCoordPointer null
_vertexPointer FloatToByteBufferAdapter (id=830007775200)
_weightPointerOES null
have_OES_blend_equation_separate false
have_OES_blend_subtract false
have_OES_framebuffer_object false
have_OES_texture_cube_map false
haveCheckedExtensions false
对了,我用的是eclipse建的android2.33的工程,用的虚拟机是WVGA800(android 2.33-API level 10) |
|