首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用OpenGL es1.1的安卓版本之间深度缓冲区的差异

使用OpenGL es1.1的安卓版本之间深度缓冲区的差异
EN

Stack Overflow用户
提问于 2011-09-12 22:37:51
回答 1查看 674关注 0票数 0

我正在用OpenGL ES 1.0编写一个2d游戏(如果适用的话,可以转换为1.1扩展)。我试图保持尽可能通用,以防我遗漏了一些显而易见的东西。

对于Android2.2 (Froyo)和Android2.3.3(姜饼)之间的深度测试,我有一个问题。目前,onCreate I有以下内容:

代码语言:javascript
复制
//this is called once only when the renderer is created
gl.glClearDepthf(1.0f);                     
gl.glEnable(GL10.GL_DEPTH_TEST);            
gl.glDepthFunc(GL10.GL_LEQUAL); 
gl.glMatrixMode(GL10.GL_PROJECTION); 
gl.glLoadIdentity();                    
gl.glOrthof(0, mWidth, 0, mHeight, 1.0f, 320.0f);

在使用OES_draw_texture扩展时,我成功地使用了深度缓冲区,这不是问题。然而,当为传统的顶点绘图指定Z值时,版本之间出现了奇怪的差异。

在2.2中,以下代码呈现在最前面(最上面):

代码语言:javascript
复制
//This array is used in the function glDrawArrays as a GL10.GL_TRIANGLE_STRIP.
//It works as intended. The specific positions are the Z positions of each point in
//the square (the triangle strips form a square).
vertices[2]=0.5f*(1+320)*-1; 
vertices[5]=0.5f*(1+320)*-1; 
vertices[8]=0.5f*(1+320)*-1; 
vertices[11]=0.5f*(1+320)*-1; 

现在,这是很好的工作,但在2.3.3中,这将进一步推回对象。要使用2.3.3获得正确的位置,我需要执行以下操作:

代码语言:javascript
复制
vertices[2]=-1; 
vertices[5]=-1; 
vertices[8]=-1; 
vertices[11]=-1; 

这将纠正这个问题。

我的问题有两方面:

  • 当我指定深度缓冲区在1到320之间时,为什么我必须将Z值指定为-ve而不是+ve?标准的(尽管不是ES) 文档明确指出,zNear和zFar不应该是-ve或0。
  • 为什么在2.2和2.3.3之间有这样的差异呢?我的印象是,2.3.3是以“正确”的方式进行的,它的值接近于值,这正是我所期望的。那么,为什么有一半的深度缓冲区被忽略了呢?

我怀疑我可能遗漏了金格尔面包含蓄地假定的某个命令,而弗罗约却没有,但我不确定。任何帮助都将不胜感激。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2011-09-12 23:10:36

gl.glOrthof在ES2.0中没有作用,因为它不再有投影矩阵的概念。您可能希望使用android.opengl.Matrix.orthoM计算投影矩阵,然后在顶点着色器中将点乘以它,如下所示:

代码语言:javascript
复制
attribute vec3 position;
uniform mat4 projection;
void main() {
    gl_Position = projection * vec4(position, 1.);
}

分配给gl_Position的位置在“剪辑坐标”中,在每个维度的范围为-1..1。听起来,您是从顶点数据中分配gl_Position,而不是将其从想要的zNear..zFar扩展到-1..1。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7394848

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档