0



这是在 android 平台上使用 OpenGLES2.0 开发移动应用程序(针对 API 8,如果有任何区别)。

我正在尝试在我当前工作的渲染系统上添加一个 UI 层,但它不起作用,我不知道为什么。任何帮助将不胜感激。

这就是我正在做的事情:
1)初始化时,我正在加载一整堆要显示的网格,这些网格使用各种程序进行渲染。其中一个网格显示纹理,这是有效的。
2) 在我加载了所有网格之后,我加载了一个“按钮”,它基本上是一个正方形,具有相同的纹理,已经在上面的 (1) 中使用过。
3)我的主渲染循环使深度蒙版可写,并且依次为每个程序渲染任何不透明的内容,然后将深度蒙版设为只读,然后依次为每个程序渲染任何具有任何透明度的内容,然后清除深度缓冲区位并依次渲染每个 UI 组件。

我正在做一件事,这可能不是正确的做事方式——渲染我的 UI 组件的程序没有执行任何模型-视图-投影转换——我将标准化的设备坐标直接传递给它,它只是一个通过。据我所知,这应该可行 - 我只提到它是因为我对此持怀疑态度。UI组件程序的顶点和片段着色器代码如下:
int vShader = compileShader(GLES20.GL_VERTEX_SHADER,
"attribute vec4 aPosition;" +
"attribute vec2 aTexCoord;" +
"varying vec2 vTexCoord;" +
"void main() {" +
" vTexCoord = aTexCoord;" +
" gl_Position = aPosition;" +
"}");
int fShader = compileShader(GLES20.GL_FRAGMENT_SHADER,
"precision mediump float;" +
"uniform sampler2D uTexture;" +
"varying vec2 vTexCoord;" +
"void main() {" +
" gl_FragColor = texture2D(uTexture,vTexCoord);" +
"}");


这是我尝试过的:
1)我尝试过阻止不透明和透明的程序运行。在这种情况下,我得到一个完全充满垃圾的屏幕(带状规则间隔的水平条纹,在纯黑色和看似随机的东西之间交替 - 每个带可能大约 50 像素高)。
2)我检查了我FloatBuffer所基于的浮点数组的内容(我不知道如何FloatBuffer直接检查。这对我来说看起来不错。

我有点难过!有人有什么想法吗?

4

1 回答 1

0

好的,我明白了这一点。我将首先列出要检查的一般事项,以防有人再次来到这里,然后确切地说我的伤害是什么。

一般来说:
1)如果你没有看到东西,关闭剔除面(glDisable(GL_CULL_FACE));这样,如果你的多边形的左手方向错误,你仍然会看到一些东西。
2) 请注意,OpenGL 的 0,0 是左下角,但您可能已经决定 0,0 是您的 UI 代码的左上角(这可以帮助和教唆您给三角形错误的使用习惯)。 这里第 13 点显示了如何避免这种情况。
3) 如果屏幕上出现垃圾,您可能忘记清除缓冲区。

所以,具体来说,我弄错了一些三角形(由于我的 UI 代码和 OpenGL 代码中的原点不匹配),并且在开始将东西修剪回基础进行调试时,意外地注释掉了 glClear称呼。

关于正交码是否可以不做矩阵变换,我觉得应该可以,但不能反馈;将东西还原为基础意味着该代码已经消失,一旦我让它工作,我肯定不会把它放回去!

于 2013-03-18T06:44:12.743 回答