Java学习者论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

手机号码,快捷登录

恭喜Java学习者论坛(https://www.javaxxz.com)已经为数万Java学习者服务超过8年了!积累会员资料超过10000G+
成为本站VIP会员,下载本站10000G+会员资源,购买链接:点击进入购买VIP会员
JAVA高级面试进阶视频教程Java架构师系统进阶VIP课程

分布式高可用全栈开发微服务教程

Go语言视频零基础入门到精通

Java架构师3期(课件+源码)

Java开发全终端实战租房项目视频教程

SpringBoot2.X入门到高级使用教程

大数据培训第六期全套视频教程

深度学习(CNN RNN GAN)算法原理

Java亿级流量电商系统视频教程

互联网架构师视频教程

年薪50万Spark2.0从入门到精通

年薪50万!人工智能学习路线教程

年薪50万!大数据从入门到精通学习路线年薪50万!机器学习入门到精通视频教程
仿小米商城类app和小程序视频教程深度学习数据分析基础到实战最新黑马javaEE2.1就业课程从 0到JVM实战高手教程 MySQL入门到精通教程
查看: 702|回复: 0

android下的opengl无法正确绘出图像,求高手帮忙啊 - Android学

[复制链接]

该用户从未签到

发表于 2011-10-26 19:16:03 | 显示全部楼层 |阅读模式
本人是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)
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|Java学习者论坛 ( 声明:本站资料整理自互联网,用于Java学习者交流学习使用,对资料版权不负任何法律责任,若有侵权请及时联系客服屏蔽删除 )

GMT+8, 2025-1-11 20:45 , Processed in 0.367534 second(s), 45 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表