【问题标题】:Opengl error 1281 when trying to glUseProgram尝试使用 glUseProgram 时出现 Opengl 错误 1281
【发布时间】:2015-05-08 21:39:35
【问题描述】:

有什么想法可以进一步调试这个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);
}

输出..

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

这就是我从 .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;
    }
}

顶点着色器源..

#version 120

uniform mat4 uMVPMatrix;
attribute vec4 vPosition;

void main() {
    gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex;
    //gl_Position = uMVPMatrix * vPosition;
}

片段着色器源..

#version 120

uniform vec4 vColor;

void main() {
    gl_FragColor = vColor;
}

【问题讨论】:

  • 1281 = 0x0501 = GL_INVALID_VALUE,所以仔细检查你的函数参数。

标签: opengl glsl


【解决方案1】:

乍一看,我不确定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);
}

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

看看documentation 换成glGetError

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

因此,如果您早期的 OpenGL 调用之一(例如,可能在您的 compileSource 函数中)记录了 1281 错误,并且您没有在该点和您调用 @987654332 之间的任何地方调用 glGetError @,您不能合理地假设错误实际上源自 glUseProgram 调用。

总之,glGetError 不会返回 OpenGL 调用记录的最新错误。您需要更详细地调用glGetError,以便查明错误的来源。这将允许您解决您遇到的问题并准确确定哪个 OpenGL 调用正在记录错误。

【讨论】:

  • 谢谢@dogjones 我在调用glUseProgram 之前已将调用移至glGetError,并且错误也存在。我注意到的是1281 不断被打印。在我第一次调用glGetError 之后,值不应该被重置吗?正如你提到的。
  • 我唯一能想到的是您发布的绘图代码示例是否在glBeginglEnd 调用之间执行。但这并没有太大意义。如果我们讨论的示例是在glBeginglEnd 调用之间,您应该知道glGetErrorglUseProgramglBeginglEnd 之间调用时会导致未定义的行为。在这种情况下,我建议将代码示例移至 glBegin 调用之前。
  • 我在任何绘图代码中都没有glBeginglEnd
  • 据我所知,您看到的行为不符合标准,可能是 JOGL 的问题。我想接下来我会尝试查看您的程序中报告错误的时间有多早。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-02-04
  • 1970-01-01
  • 2020-06-24
  • 2014-02-05
  • 2016-10-08
相关资源
最近更新 更多