这是在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( 如果你看不到东西,关闭扑杀脸(glDisable(GL_CULL_FACE)
(;这样,如果你把多边形的利手方向弄错了,你仍然会看到一些东西
2( 请注意,OpenGL的0,0是左下角,但您可能已经决定0,0是UI代码的左上角(这可能会帮助和教唆您错误地使用三角形(。第13点说明了如何避免这种情况
3( 如果你在屏幕上看到垃圾,你可能忘记清理缓冲区了。
因此,特别是,我得到了一些错误的三角形(由于UI代码和OpenGL代码中的源代码不匹配(,并且在开始将内容修剪回基本内容进行调试时,意外地注释掉了glClear调用。
关于是否有可能不做正交码的矩阵变换,我觉得应该做,但无法报告;把东西切回基本部分意味着代码就可以了,一旦我让它工作起来,我肯定不会再把它放回去了!