Java 用OpenGL代替Canvas-Android
我试图用更快的opengl es surface替换我已经拥有的基于画布的渲染系统,但是,我似乎无法让opengl渲染器以这样一种方式一致,即它充当2d字段,而不是透视视图 渲染器的当前代码如下所示: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
@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支持。也许还有其他的技巧可以让它们发挥作用,也许你可以发布一个新问题。祝你好运