尝试glUseProgram时出现OpenGL错误1281

bob*_*e01 3 opengl glsl

有什么想法可以opengl进一步调试此错误吗?1281

我正在从文件加载源代码,进行编译,链接,然后尝试在之后检查错误 glUseProgram

在我对象的绘制方法中..

log.info(gl2.glIsProgram(shaderProgram)); // true
gl2.glUseProgram(shaderProgram);

int error;
while ((error = gl2.glGetError()) != GL2.GL_NO_ERROR) {
    throw new RuntimeException("glUseProgram" + ": glError " + error);
}
Run Code Online (Sandbox Code Playgroud)

输出..

[13:38:08] INFO (IARectangle.java:99) - true
java.lang.RuntimeException: glUseProgram: glError 1281
Run Code Online (Sandbox Code Playgroud)

这就是我从.glsl文件..加载我的着色器源的方式。

Vector<Integer> shaders = new Vector<Integer>();

try {

    shaders.add(compileSource(
        loadSource("shaders/vertexShader.glsl"),
        loadSource("shaders/fragmentShader.glsl")));

    return shaders;

} catch (Exception e) {
    e.printStackTrace();
    return shaders;
}

public String[] loadSource(String filename){

    StringBuilder sb = new StringBuilder();
    try {

        InputStream is = getClass().getClassLoader().getResourceAsStream(filename);
        BufferedReader br = new BufferedReader(new InputStreamReader(is, "UTF-8"));
        String line;
        while ((line = br.readLine()) != null) {

            sb.append(line);
            sb.append('\n');
        }
        is.close();

    } catch (Exception e) {
        e.printStackTrace();
    }

    return new String[] { sb.toString() };
}

public final int compileSource(final String[] vertexSource, final String[] fragmentSource) throws Exception {

     vertexShaderProgram;
    int fragmentShaderProgram;
    int shaderProgram;

    // load vertexShader source, compile and verify
    vertexShaderProgram = gl2.glCreateShader(GL2.GL_VERTEX_SHADER);
    gl2.glShaderSource(vertexShaderProgram, 1, vertexSource, null, 0);
    gl2.glCompileShader(vertexShaderProgram);
    verifyCompile(gl2, vertexShaderProgram);

    // load fragmentShader source, compile and verify
    fragmentShaderProgram = gl2.glCreateShader(GL2.GL_FRAGMENT_SHADER);
    gl2.glShaderSource(fragmentShaderProgram, 1, fragmentSource, null, 0);
    gl2.glCompileShader(fragmentShaderProgram);
    verifyCompile(gl2, fragmentShaderProgram);

    shaderProgram = gl2.glCreateProgram();

    gl2.glAttachShader(shaderProgram, vertexShaderProgram);
    gl2.glAttachShader(shaderProgram, fragmentShaderProgram);
    gl2.glLinkProgram(shaderProgram);
    IntBuffer intBuffer = IntBuffer.allocate(1);
    gl2.glGetProgramiv(shaderProgram, GL2.GL_LINK_STATUS, intBuffer);

    if (intBuffer.get(0) != 1){

        String infoLog = null;
        gl2.glGetProgramiv(shaderProgram, GL2.GL_INFO_LOG_LENGTH, intBuffer);
        int size = intBuffer.get(0);
        log.error("Program link error: ");
        if (size > 0) {

            ByteBuffer byteBuffer = ByteBuffer.allocate(size);
            gl2.getGL2().glGetProgramInfoLog(shaderProgram, size, intBuffer, byteBuffer);
            byte[] sizeBytes = new byte[size];
            byteBuffer.get(sizeBytes, 0, size);
            infoLog = new String(sizeBytes);

            log.error("info: " + infoLog);

        } else {
            log.error("Unknown");
        }
        System.exit(1);
        return shaderProgram;

    } else {

        return shaderProgram;
    }
}
Run Code Online (Sandbox Code Playgroud)

顶点着色器源..

#version 120

uniform mat4 uMVPMatrix;
attribute vec4 vPosition;

void main() {
    gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex;
    //gl_Position = uMVPMatrix * vPosition;
}
Run Code Online (Sandbox Code Playgroud)

片段着色器源..

#version 120

uniform vec4 vColor;

void main() {
    gl_FragColor = vColor;
}
Run Code Online (Sandbox Code Playgroud)

Bri*_*ice 5

乍一看,我不确定为什么glGetError返回错误代码。但是要回答您的特定问题“如何进一步调试此错误?”,我有一个建议。

将您的绘制代码更改为此:

// Logging errors before the call to glUseProgram
int error;
while ((error = gl2.glGetError()) != GL2.GL_NO_ERROR) {
    log.info(error);
}

log.info(gl2.glIsProgram(shaderProgram)); // true
gl2.glUseProgram(shaderProgram);

int error;
while ((error = gl2.glGetError()) != GL2.GL_NO_ERROR) {
    throw new RuntimeException("glUseProgram" + ": glError " + error);
}
Run Code Online (Sandbox Code Playgroud)

请注意,这里的区别是我们添加了一段代码来记录调用glGetError 之前返回的错误glUseProgram。原因是因为错误不一定源自您对的调用glUseProgram。如果您看到使用上述代码记录的1281错误,则可以确定该错误实际上是由调用之前进行的OpenGL调用引起的glUseProgram

看看该文件glGetError

glGetError返回错误标志的值。每个可检测到的错误都分配有一个数字代码和符号名称。发生错误时,错误标志将设置为适当的错误代码值。在调用glGetError,返回错误代码并将标志重置为GL_NO_ERROR之前,不会记录其他错误。

因此,如果您以前的OpenGL调用之一(compileSource例如,您的函数中的某些内容)记录了该1281错误,并且您没有glGetError在该点与之间调用glUseProgram,则您不能合理地认为该错误实际上是由glUseProgram呼叫。

总之,glGetError不返回OpenGL调用记录的最新错误。您需要以glGetError更高的粒度进行调用,以查明错误的出处。这将使您能够解决所遇到的问题,并准确确定哪个OpenGL调用正在记录该错误。