我正在尝试在android上渲染三维网格,顶点的位置如下所示:
var positionHandle = GLES20.glGetAttribLocation(program, "vPosition").also {
GLES20.glEnableVertexAttribArray(it)
GLES20.glVertexAttribPointer(
it, 3, GLES20.GL_FLOAT, false, 12, vertexBuffer
)
}
我的顶点着色器:
uniform mat4 uMVPMatrix;
attribute vec4 vPosition;
varying vec4 positionOut;
void main() {
gl_Position = uMVPMatrix * vPosition;
positionOut = vPosition;
}
片段着色器:
varying vec4 positionOut;
precision mediump float;
void main() {
gl_FragColor = vec4(1, 0,1,1);
}
此代码在一台设备上运行良好(OnePlus设备上的Android 9(,但在(Android 10三星Galaxy设备(上不起作用,并且不会引发错误。
如果从片段着色器中移除线varying vec4 positionOut;
,则渲染工作正常。问题是,为什么只有可变变量的定义会破坏渲染?我现在不使用这个变量,但我想在下一步中使用它。
根据规范,您的代码无效:
片段语言没有浮点类型的默认精度限定符。因此,对于浮动,浮动点向量和矩阵变量声明,声明必须包含精度限定符或默认的浮点精度必须事先声明。
因此,您要么必须将其声明为例如varying mediump ec4 positionOut;
,要么将其放入precision
语句的某个范围中。