简体   繁体   English

错误:0:4: 'gl_FragColor': 未声明的标识符 & 错误: 0:4: 'assign': 无法从 'uniform 4-component vector of float' 转换为 'float'

[英]ERROR: 0:4: 'gl_FragColor' : undeclared identifier & ERROR: 0:4: 'assign' : cannot convert from 'uniform 4-component vector of float' to 'float'

An OpenGL code throws two errors: OpenGL 代码抛出两个错误:

  1. ERROR: 0:4: 'gl_FragColor': undeclared identifier错误:0:4:“gl_FragColor”:未声明的标识符
  2. ERROR: 0:4: 'assign': cannot convert from 'uniform 4-component vector of float' to 'float'错误:0:4:“分配”:无法从“浮动的统一 4 分量向量”转换为“浮动”

The source codes:源代码:

        mProgram = ShaderHelper.buildProgram(
            TextResourceReader.readTextFileFromResource(
                context,
                R.raw.triangle_fragment_shader
            ),
            TextResourceReader.readTextFileFromResource(
                context,
                R.raw.triangle_fragment_shader
            )
        )
        // Add program to OpenGL ES environment
        GLES20.glUseProgram(mProgram)

ShaderHelper着色器助手

    public static int buildProgram(String vertexShaderSource, String fragmentShaderSource) {
        int vertexShader = ShaderHelper.compileVertexShader(vertexShaderSource);
        int fragmentShader = ShaderHelper.compileFragmentShader(fragmentShaderSource);

        int program = ShaderHelper.linkProgram(vertexShader, fragmentShader);
        ShaderHelper.validateProgram(program);

        return program;
    }

    public static int compileVertexShader(String shaderCode) {
        return compileShader(GL_VERTEX_SHADER, shaderCode);
    }

    public static int compileFragmentShader(String shaderCode) {
        return compileShader(GL_FRAGMENT_SHADER, shaderCode);
    }

    private static int compileShader(int type, String shaderCode) {
        // Set OpenGL version to 2 in advance, otherwise it will crash here.
        final int shaderObjectId = glCreateShader(type);
        if (shaderObjectId == 0) {
            VLog.w(TAG, "compileShader", "Could not create shader");
            return shaderObjectId;
        }

        glShaderSource(shaderObjectId, shaderCode);
        glCompileShader(shaderObjectId);

        final int[] compileStatus = new int[1];
        glGetShaderiv(shaderObjectId, GL_COMPILE_STATUS, compileStatus, 0);
        if (compileStatus[0] == 0) {
            glDeleteShader(shaderObjectId);
            VLog.d("Compile shader failed" + shaderCode);
            return shaderObjectId;
        }

//        LogWrapper.d(new String[] {"shaderCode", "GLLogInfo"}, new String[]{shaderCode, glGetShaderInfoLog(shaderObjectId)});;

        return shaderObjectId;
    }

    public static int linkProgram(int vertexShaderId, int fragmentShaderId) {
        final int programObjectId = glCreateProgram();
        if (programObjectId == 0) {
            VLog.w(TAG, "linkProgram", "Could not create new program");
            return programObjectId;
        }

        glAttachShader(programObjectId, vertexShaderId);
        glAttachShader(programObjectId, fragmentShaderId);

        glLinkProgram(programObjectId);
        final int[] linkStatus = new int[1];
        glGetProgramiv(programObjectId, GL_LINK_STATUS, linkStatus, 0);
        if (linkStatus[0] == 0) {
            glDeleteProgram(programObjectId);
            VLog.w(TAG, "linkProgram", glGetProgramInfoLog(programObjectId));
            return programObjectId;
        }
        return programObjectId;
    }

    public static boolean validateProgram(int programObjectId) {
//        if (!BuildConfig.DEBUG) {
//            return true;
//        }
        glValidateProgram(programObjectId);

        final int[] validateStatus = new int[1];
        glGetProgramiv(programObjectId, GL_VALIDATE_STATUS, validateStatus, 0);
        VLog.d("Results of validating program: ", new String[]{"validateStatus", "ProgramInfo"},
                new String[]{String.valueOf(validateStatus[0]), glGetProgramInfoLog(programObjectId)});

        return validateStatus[0] != 0;
    }

triangle_vertex_shader三角形顶点着色器

attribute vec4 vPosition;
void main() {
    gl_Position = vPosition;
}

triangle_fragment_shader三角形片段着色器

precision mediump float;
uniform vec4 vColor;
void main() {
    gl_FragColor = vColor;
}

After a meticulous investigation, I found the root cause is that I provide fragment shader as vertex shader by mistake.经过仔细排查,我发现根本原因是我错误地将片段着色器作为顶点着色器提供。 The correct one is shown as below:正确的如下图所示:

        mProgram = ShaderHelper.buildProgram(
            TextResourceReader.readTextFileFromResource(
                context,
                R.raw.triangle_vertex_shader
            ),
            TextResourceReader.readTextFileFromResource(
                context,
                R.raw.triangle_fragment_shader
            )
        )

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM