如何解决在片段着色器中添加变化的变量会在Android上使用opengl GLES20破坏渲染
我正在尝试在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
语句的某个范围。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。