You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Android平台OpenGL ES片段着色器版本指定失败求助

Android OpenGL ES片段着色器版本声明编译失败问题解决

核心原因

从OpenGL ES 3.0(对应#version 300 es)开始,片段着色器的语法规则发生了关键变更:废弃了内置的gl_FragColor变量,必须显式声明自定义输出变量。这是导致你添加版本声明后编译失败的直接原因。

修正后的片段着色器代码

#version 300 es
precision mediump float; // 300 es要求显式声明片段着色器精度,不可省略
out vec4 fragColor; // 自定义输出变量
void main() {
  fragColor = vec4(1.0, 0.0, 0.0, 1.0);
}

关键细节说明

  • 顶点着色器在300 es版本中兼容性更强,gl_Position等内置变量仍可正常使用,因此你的顶点着色器加版本声明能正常编译。
  • 300 es及以上版本的片段着色器必须显式指定精度,默认没有精度规则,省略会导致编译错误。

额外排查优化

  1. 修正编译错误日志逻辑
    你的loadShader函数中错误判断了编译状态(当前是成功时打印错误,失败时无输出),修正后才能获取真实的编译报错信息:
fun loadShader(type: Int, shaderCode: String): Int {
    return GLES32.glCreateShader(type).also { shader ->
        GLES32.glShaderSource(shader, shaderCode)
        GLES32.glCompileShader(shader)

        val successPointer = ByteBuffer.allocateDirect(Int.SIZE_BYTES).asIntBuffer()
        GLES32.glGetShaderiv(shader, GLES32.GL_COMPILE_STATUS, successPointer)
        if (successPointer[0] == 0) { // 等于0表示编译失败
            println("编译失败: ${GLES32.glGetShaderInfoLog(shader)}")
        }
    }
}
  1. 确认设备支持版本
    通过以下代码检查当前设备支持的OpenGL ES版本,确保硬件支持3.0及以上:
val glVersion = GLES30.glGetString(GLES30.GL_VERSION)
println("设备支持的OpenGL ES版本: $glVersion")

内容的提问来源于stack exchange,提问作者Big Bro

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.17 03:17:17