问题描述
我正在尝试在android上渲染3d网格,顶点的位置如下所示:
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,1,1);
}
此代码在一个设备(OnePlus设备上的Android 9)上可以正常工作,但在(Android 10 Samsung galaxy设备)上不起作用,并且不会引发任何错误。
如果我从片段着色器中删除行varying vec4 positionOut;
,则渲染起作用。
问题是,为什么仅可变变量的定义会破坏渲染?我现在不使用该变量,但我想在下一步中使用它。
解决方法
根据the spec,您的代码无效:
对于浮点类型,片段语言没有默认的精度限定符。因此对于浮动,浮动 点向量和矩阵变量声明,声明必须包含精度限定符或 默认的float精度必须事先已声明。
因此,您要么将其声明为varying mediump ec4 positionOut;
,要么放入precision
语句的某个范围。