在 Android 上使用 opengl GLES20 向片段着色器添加可变变量会破坏渲染
adding varying variable to fragment shader breaks the render using opengl GLES20 on Android
我正在尝试在 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, 0,1,1);
}
此代码在一台设备上运行良好(Android 9 在 OnePlus 设备上)但它不适用于(Android 10 Samsung Galaxy 设备)并且没有抛出任何错误。
如果我从片段着色器中删除 varying vec4 positionOut;
行,渲染工作。
问题是为什么只有可变变量的定义会破坏渲染?我现在不使用该变量,但我想在下一步中使用它。
您的代码无效 the spec:
The fragment language has no default precision qualifier for floating point types. Hence for float, floating
point vector and matrix variable declarations, either the declaration must include a precision qualifier or
the default float precision must have been previously declared.
因此您要么必须将其声明为例如 varying mediump ec4 positionOut;
,要么将其放入 precision
语句的某个范围。
我正在尝试在 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, 0,1,1);
}
此代码在一台设备上运行良好(Android 9 在 OnePlus 设备上)但它不适用于(Android 10 Samsung Galaxy 设备)并且没有抛出任何错误。
如果我从片段着色器中删除 varying vec4 positionOut;
行,渲染工作。
问题是为什么只有可变变量的定义会破坏渲染?我现在不使用该变量,但我想在下一步中使用它。
您的代码无效 the spec:
The fragment language has no default precision qualifier for floating point types. Hence for float, floating point vector and matrix variable declarations, either the declaration must include a precision qualifier or the default float precision must have been previously declared.
因此您要么必须将其声明为例如 varying mediump ec4 positionOut;
,要么将其放入 precision
语句的某个范围。