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_position。 a_texcoords是标准(0,0) - >(1,1)坐标。 u_matrix是从透视摄像机设置的,即projectionmatrix * viewmatrix。当我改变视图矩阵中的距离(放大)时,在一个点处,图块消失,并且仅显示清晰的颜色,就好像片段着色器从未执行过一样。当我再次缩小时,我再次看到了瓷砖。
现在奇怪的事情开始了:当我(在C ++代码中)将位置转换为剪辑空间并将其作为attribute vec4
传递给着色器并将其未修改地写入gl_Position
时,一切都工作为预计在华为设备上。我还将u_matrix * vec4(a_position, 0.0, 1.0)
的结果与我通过的剪辑空间位置进行了比较,结果发现它们几乎等于我从cpu端传入的剪辑空间坐标。 (事实上,我对两者进行了透视划分,然后将vec4(1)-vec4(abs(difference).xyz*20.0,0.0)
作为一种颜色发出 - 它几乎与白色不同,所以差异非常小,我想只是不同的浮点算术。)
知道发生了什么事吗?剪刀,深度和模板测试被禁用,相机的近处和远处平面都很好,背面剔除被禁用。随意询问更多细节...
update1:如果我将凸轮倾斜到不准确的-Z,我得到相同的神器,但现在看起来像近平面剪裁(我可以放大到只有一半屏幕为空白的状态) 。但我不知道这是怎么发生的;我的近飞机设置为20(米);但是工件发生在相机< - > z = 0平面距离~1300(米)。