Android 顶点着色器矩阵乘法损坏?

Android 顶点着色器矩阵乘法损坏?,android,c++,opengl-es,opengl-es-2.0,vertex-shader,Android,C++,Opengl Es,Opengl Es 2.0,Vertex Shader,Android上的OpenGL ES 2.0:一个非常简单的着色器,适用于几乎所有设备,但不适用于华为Ascend P6: 顶点着色器: attribute vec2 a_position; attribute vec2 a_texcoords; uniform mat4 u_matrix; varying mediump vec2 v_texcoords; void main() { gl_Position = u_matrix * vec4(a_position, 0.0, 1

Android上的OpenGL ES 2.0:一个非常简单的着色器,适用于几乎所有设备,但不适用于华为Ascend P6:

顶点着色器:

attribute vec2 a_position;
attribute vec2 a_texcoords;

uniform mat4 u_matrix;

varying mediump vec2 v_texcoords;

void main()
{
    gl_Position = u_matrix * vec4(a_position, 0.0, 1.0);
    v_texcoords = a_texcoords;
}
片段着色器:

uniform lowp sampler2D u_textureUnit;

varying mediump vec2 v_texcoords;

void main()
{
    gl_FragColor = texture2D(u_textureUnit, v_texcoords);  
}
着色器程序用于在z=0平面中绘制正方形(作为4顶点三角形条带),并在世界空间中给出_位置。a_texcoords是标准(0,0)->(1,1)坐标。u_矩阵是从透视摄影机设置的,即projectionmatrix*viewmatrix。当我在视图矩阵中更改距离(放大)时,在某一点上,平铺消失,只显示清晰的颜色,就像从未执行片段着色器一样。当我再次缩小时,我再次看到瓷砖

<>现在奇怪的事情开始了:当我(在C++代码中)把这个位置转换为剪辑空间并把它作为着色器传递给<着色器>属性vEC4<代码>,并把它修改为<代码> GLYPosie时,一切都在华为设备上运行。我还将
u_matrix*vec4(a_position,0.0,1.0)
的结果与我传递的剪辑空间位置进行了比较,结果表明它们几乎等于我从cpu端传递的剪辑空间坐标。(事实上,我对这两种颜色都进行了透视分割,然后将
vec4(1)-vec4(abs(difference).xyz*20.0,0.0)
作为一种颜色,它几乎无法与白色区分,因此差异非常小,我猜只是不同的浮点运算。)

知道发生了什么吗?剪刀、深度和模板测试被禁用,相机的近平面和远平面都很好,背面剔除被禁用。请随意询问更多细节


更新1:如果我倾斜凸轮使其看起来不完全在-Z方向,我会得到相同的伪影,但现在看起来像是近平面剪裁(我可以放大到只有一半屏幕为空白的状态)。但我不知道这是怎么发生的;我的近距离飞机设置为20米;但是伪影发生在距离约1300(米)的摄影机z=0平面上。

老实说,无论如何,您应该使用
vec4
顶点属性作为您的位置。GL中的所有顶点属性本质上是每个位置4个分量(一个
vec2
属性占据1个位置)。如果你将自己的职位声明为
vec2
,你将一无所获,当你想用
u\u矩阵
乘以
u矩阵时,你必须额外编写一个*
vec4(…,0.0,1.0)
,如果你让GL自动处理从2D到4D的扩展,你就不会这样做。如果您写入
attribute vec4
,则GL将
Z
的值指定为0.0,将
W
的值指定为1.0,然后仅为该属性提供两个组件所需的足够数据。是的,但这不会改变实际问题的任何方面-我只是尝试绝对确定。只有当我在cpu上进行转换时,它才会起作用——有没有想过为什么会出现这种情况?我马上想到的唯一一件事是,在cpu端,单精度浮点可能意味着32位。在GLES中,
highp
实际上只有16位。这款手机中的Vivante GC4000 GPU支持32位浮点运算,因此我希望顶点着色器(
highp
)中的默认精度能够使用全精度。如果在其他设备的顶点着色器中声明
precision float mediump
,是否也会出现这种行为?我尝试在多个设备上使用mediump,似乎在所有设备上都能正常工作-但是规范说mediump可能等于highp,我无法确定它是否确实在设备上。我也尝试了lowp,它仍然在Nexus4上工作(因为可能甚至有lowp==highp),但在NexusS上没有(mediump在其中工作)。我还发现了其他一些东西-请参见更新1您是否尝试在片段着色器中指定
highp
精度?