2013-03-09 84 views
0



这是使用Android平台上OpenGLES2.0(对API 8,如果这有什么差别)开发的移动应用程序。

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

以下是我在做什么:
1)当初始化时,我加载了一堆整个网格物体来显示,这些网格物体使用各种程序进行渲染。其中一个网格显示一个纹理,这是工作。
2)I已经加载全部网格后,我加载“按钮”,其为基本上与已经在被上述(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);" +
"}");
OpenGLES2未能呈现位图


这是我已经试过:
1)我已经试过防止不透明和透明的程序运行。在这种情况下我得到完全充满垃圾的画面(带状规则间隔开的横条纹,纯黑和看似随机的东西之间交替 - 每个频带可能是约50个像素高)。
2)我已经检查了float数组的内容上我FloatBuffer基于(我不能工作,如何直接检查FloatBuffer。这一切对我来说很好。

我有点位难倒!任何人有什么想法?

回答

0

OK,我得到了这条底线。我会列出一般的东西先检查的情况下,没有人结束了在这里,我的伤害是那么到底是什么。

一般情况下:
1)如果你没有看到东西,关闭剔除脸(glDisable(GL_CULL_FACE));这样,如果你错误地掌握了你的多边形的手型,你仍然会看到一些东西。
2)注意OpenGL的0,0是左下角,但你可能已经决定0,0是你的UI代码的左上角(这可以帮助和帮助你给三角形赋予不正确的手型) 。点13​​显示如何避免这种情况。
3)如果屏幕上出现垃圾,您可能已经忘记清除缓冲区。所以,具体来说,我有一些错误的三角形(由于我的UI代码和OpenGL代码中的起源之间的不匹配),并且,当开始修剪东西回到调试基础时,已经意外地注释掉glClear调用。

关于是否有可能没有做orthoganal码矩阵变换,我觉得这是应该的,但不能报到;把东西回归到基本意味着代码去了,一旦我找到了它,我肯定不会放弃它!