Android OpenGLES2无法渲染位图
Android OpenGLES2无法渲染位图,android,user-interface,opengl-es-2.0,glsles,Android,User Interface,Opengl Es 2.0,Glsles,这是在android平台上使用OpenGLES2.0开发一个移动应用程序(如果API 8有什么不同的话)。 我试图在当前正在工作的渲染系统上添加一个UI层,但它不工作,我不知道为什么。任何帮助都将不胜感激。 以下是我正在做的: 1) 初始化时,我将加载一整堆要显示的网格,这些网格使用各种程序进行渲染。其中一个网格显示纹理,这正在工作。 2) 加载所有网格后,我加载一个“按钮”,它基本上是一个正方形,具有与上面(1)中已使用的纹理相同的纹理,并在其上拉伸。 3) 我的主渲染循环使深度掩码可写,并依
这是在android平台上使用OpenGLES2.0开发一个移动应用程序(如果API 8有什么不同的话)。
我试图在当前正在工作的渲染系统上添加一个UI层,但它不工作,我不知道为什么。任何帮助都将不胜感激。
以下是我正在做的:
1) 初始化时,我将加载一整堆要显示的网格,这些网格使用各种程序进行渲染。其中一个网格显示纹理,这正在工作。
2) 加载所有网格后,我加载一个“按钮”,它基本上是一个正方形,具有与上面(1)中已使用的纹理相同的纹理,并在其上拉伸。
3) 我的主渲染循环使深度掩码可写,并依次为每个程序渲染不透明的任何内容,然后使深度掩码只读,依次为每个程序渲染具有任何透明度的任何内容,然后清除深度缓冲区位并依次渲染每个UI组件。
我在做一件事情,这可能不是正确的方式做的事情-程序呈现我的UI组件没有执行任何模型视图投影转换-我直接传递归一化设备坐标到它,这只是一个传递。据我所知,这应该行得通——我之所以提到它,是因为我对此表示怀疑。UI组件程序的顶点和片段着色器的代码如下:
int-vShader=compileShader(GLES20.GL\u-VERTEX\u着色器,
“属性向量4位置;”+
“属性向量2 aTexCoord;”+
“可变矢量2 vTexCoord;”+
“void main(){”+
“vTexCoord=aTexCoord;”+
“gl\u Position=aPosition;”+
“}”)代码>
int fShader=compileShader(GLES20.GL\u FRAGMENT\u着色器,
“精密中间泵浮动;”+
“统一采样器2D未来;”+
“可变矢量2 vTexCoord;”+
“void main(){”+
“gl_FragColor=texture2D(uTexture,vTexCoord);”+
“}”)代码>
以下是我尝试过的:
1) 我尝试过阻止不透明和透明的程序运行。在这种情况下,我得到的屏幕上全是垃圾(有规则间隔的水平条纹,在纯黑色和看似随机的东西之间交替出现,每个条纹大约有50像素高)。
2) 我已经检查了我的FloatBuffer
所基于的float数组的内容(我不知道如何直接检查FloatBuffer
。我觉得这一切都很好。
我有点糊涂了!有人有什么想法吗?好的,我已经把这件事搞清楚了。我先列出要检查的一般事项,以防有人再次来到这里,然后才知道我的损失到底是什么
一般来说:
1) 如果您没有看到内容,请禁用“消隐面”(glDisable(GL\u消隐面)
);这样,如果多边形的利手方向不对,您仍然可以看到一些东西。
2) 请注意,OpenGL的0,0是左下角,但您可能已经决定0,0是UI代码的左上角(这有助于并教唆您错误地使用三角形)。第13点说明了如何避免这种情况。
3) 如果你在屏幕上看到垃圾,你可能忘记清理缓冲区了
因此,具体地说,我得到了一些错误的三角形(由于我的UI代码和OpenGL代码中的源代码之间不匹配),并且在开始将内容修剪回基础以进行调试时,意外地注释掉了glClear调用
关于是否有可能不对正交码进行矩阵变换,我觉得应该这样做,但不能报告;把东西缩减到最基本的部分意味着代码可以运行了,一旦我让它工作起来,我肯定不会把它放回去