Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/349.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 用OpenGL代替Canvas-Android_Java_Android_Opengl Es_Renderer - Fatal编程技术网

Java 用OpenGL代替Canvas-Android

Java 用OpenGL代替Canvas-Android,java,android,opengl-es,renderer,Java,Android,Opengl Es,Renderer,我试图用更快的opengl es surface替换我已经拥有的基于画布的渲染系统,但是,我似乎无法让opengl渲染器以这样一种方式一致,即它充当2d字段,而不是透视视图 渲染器的当前代码如下所示: @Override public void onSurfaceChanged(GL10 gl, int width, int height) { gl.glViewport(0, 0, width, height); gl.glMatrixMod

我试图用更快的opengl es surface替换我已经拥有的基于画布的渲染系统,但是,我似乎无法让opengl渲染器以这样一种方式一致,即它充当2d字段,而不是透视视图

渲染器的当前代码如下所示:

     @Override
     public void onSurfaceChanged(GL10 gl, int width, int height) {
        gl.glViewport(0, 0, width, height);
        gl.glMatrixMode(GL10.GL_PROJECTION);
        gl.glLoadIdentity();
        gl.glOrthof(0.0f, width, 0.0f, height, 0.0f, 1.0f);

        gl.glShadeModel(GL10.GL_FLAT);
        gl.glEnable(GL10.GL_BLEND);
        gl.glBlendFunc(GL10.GL_SRC_ALPHA, GL10.GL_ONE_MINUS_SRC_ALPHA);
        gl.glColor4x(0x10000, 0x10000, 0x10000, 0x10000);
        gl.glEnable(GL10.GL_TEXTURE_2D);
    }

    @Override
    public void onSurfaceCreated(GL10 gl, EGLConfig config) {
        gl.glHint(GL10.GL_PERSPECTIVE_CORRECTION_HINT, GL10.GL_FASTEST);

        gl.glClearColor(0.5f, 0.5f, 0.5f, 1);
        gl.glShadeModel(GL10.GL_FLAT);
        gl.glDisable(GL10.GL_DEPTH_TEST);
        gl.glEnable(GL10.GL_TEXTURE_2D);

        gl.glDisable(GL10.GL_DITHER);
        gl.glDisable(GL10.GL_LIGHTING);

        gl.glClear(GL10.GL_COLOR_BUFFER_BIT | GL10.GL_DEPTH_BUFFER_BIT);    
    }

如何设置渲染器,使平移变换与屏幕上的像素匹配?(所以向右平移5将使其移动5个像素)

请注意,在openGL中,Y坐标是反向的。否则一切都一样。
至于正确的标志,我建议您查看开源android游戏副本岛:

以下是我在自己的代码中使用的内容:

public void onSurfaceChanged(GL10 gl, int width, int height) 
{
    mViewWidth = width;
    mViewHeight = height;

    gl.glViewport(0, 0, mViewWidth,  mViewHeight);
    gl.glLoadIdentity();
    GLU.gluOrtho2D(gl, 0, mViewWidth, mViewHeight, 0);
}

public void onSurfaceCreated(GL10 gl, EGLConfig config) 
{
    gl.glClearColor(0.5f, 0.5f, 0.5f, 1);
    gl.glHint(GL10.GL_PERSPECTIVE_CORRECTION_HINT, GL10.GL_FASTEST);
    gl.glShadeModel(GL10.GL_FLAT);
    gl.glDisable(GL10.GL_DEPTH_TEST);
    gl.glEnable(GL10.GL_BLEND);
    gl.glBlendFunc(GL10.GL_ONE, GL10.GL_ONE_MINUS_SRC_ALPHA); 

    gl.glViewport(0, 0, mViewWidth,  mViewHeight);
    gl.glMatrixMode(GL10.GL_PROJECTION);
    gl.glLoadIdentity();
    gl.glEnable(GL10.GL_BLEND);
    gl.glBlendFunc(GL10.GL_SRC_ALPHA, GL10.GL_ONE_MINUS_SRC_ALPHA);
    gl.glShadeModel(GL10.GL_FLAT);
    gl.glEnable(GL10.GL_TEXTURE_2D);

    GLU.gluOrtho2D(gl, 0, mViewWidth, mViewHeight, 0);
}

其中,
mViewWidth
mviewwight
是显示的大小。

为什么不使用将GL实例传递给画布构造函数呢。这会保留openGL在绘制位图时相对于基本画布的速度优势吗?不要使用画布。即使有文档记录,它也不起作用。另外,根据IRC的讨论,Canvas的开发者已经将其从API中删除,用于将来的版本。他们真的在贬低它吗?这肯定会使我的应用程序无法运行/然而,我有,代码是如此的优化和瓷砖为基础的系统厚,它几乎没有任何用处,以找到简单的代码,我需要渲染一些纹理到屏幕上。我有一个类似的问题,并没有问题,找到了副本岛的作者设置gl画布的部分。它位于名为GameRenderer.java的文件中。我已经编辑了我的原始回复,包括我使用的设置代码。好的,谢谢。尽管在转换我的整体代码结构方面,它仍然不太有效。是否有任何方法可以存储非base-2大小的纹理?如果没有的话,无论如何使用openGL都是不值得的(我已经在推Android的内存限制了)。不确定非base-2。我自己不使用这些,但我相信OpenGLES2.0支持它,只有Android 2.0支持。也许还有其他的技巧可以让它们发挥作用,也许你可以发布一个新问题。祝你好运