在Android上使用opengl GLES20向片段着色器添加可变变量会中断渲染
我正在尝试在android上渲染3d网格,顶点的位置如下所示:在Android上使用opengl GLES20向片段着色器添加可变变量会中断渲染,android,opengl-es,opengl-es-2.0,Android,Opengl Es,Opengl Es 2.0,我正在尝试在android上渲染3d网格,顶点的位置如下所示: var positionHandle = GLES20.glGetAttribLocation(program, "vPosition").also { GLES20.glEnableVertexAttribArray(it) GLES20.glVertexAttribPointer( it, 3, GLES20.G
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设备上的安卓9)上运行良好,但在(安卓10三星Galaxy设备)上无法运行,并且不会引发任何错误
如果我删除行variabling vec4 positionOut代码>从片段着色器渲染工作。
问题是为什么只有可变变量的定义会破坏渲染?我现在不使用该变量,但我想在下一步中使用它。您的代码无效,如下所示:
片段语言没有浮点类型的默认精度限定符。所以对于浮动,浮动
点向量和矩阵变量声明,声明必须包含精度限定符或
默认浮点精度必须事先声明
因此,您必须将其声明为例如variable mediump ec4 positionOut代码>,或者您将其放入了精度
语句的某个范围。您的代码无效,如下所示:
片段语言没有浮点类型的默认精度限定符。所以对于浮动,浮动
点向量和矩阵变量声明,声明必须包含精度限定符或
默认浮点精度必须事先声明
因此,您必须将其声明为例如variable mediump ec4 positionOut代码>,或者您将其放入precision
语句的某个范围。也许您需要在声明定位器变量之前设置precision语句。这对@alex没有帮助,不会抛出错误
-@derhass似乎发现了错误,但是还有一个问题,您没有检测到一个应该很容易检测到的错误。是一些显示如何检测编译和链接错误的示例代码-不确定它是否是OpenGL的正确方言,但应该足够接近。也许在声明定位器变量之前需要设置精度语句。这对@alex没有任何错误抛出没有帮助
-@Derhas似乎已经发现了错误,但是还有一个问题,您没有检测到一个应该很容易检测到的错误。下面是一些示例代码,展示了如何检测编译和链接错误-不确定这是否是OpenGL的正确方言,但应该足够接近。