OpenGLES2无法渲染位图

时间:2013-03-09 22:36:41

标签: android user-interface opengl-es-2.0 glsles



这是在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。这对我来说都很好看。

我有点难过!有人有任何想法吗?

1 个答案:

答案 0 :(得分:0)

好的,我已经到底了。我将列出一般要检查的东西,以防万一有人再次来到这里,那么我的损坏究竟是什么。

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

所以,具体来说,我得到了一些错误的三角形(由于我的UI代码和OpenGL代码中的起源不匹配),并且当开始修剪回到基础调试时,已经意外地评论了搞出glClear电话。

关于是否可以不对正交码进行矩阵变换,我觉得它应该是,但不能报告;切换回基础知识意味着代码已经过去了,一旦我开始工作,我肯定不会把它放回去!