java - 曲面分割着色器上的 GL_INVALID_OPERATION

标签 java opengl glsl shader lwjgl

我将 OpenGL 与 LWJGL 和我自己的非常小的框架一起用于琐碎的任务。我正在关注OpenGL SuperBible: Comprehensive Tutorial and Reference (6th Edition)这本书。

我将列出程序中最重要的部分:

public class GameController extends Controller {
    private Program test1Program;
    private int vaoId;

    @Override
    protected void init() {
        glViewport(0, 0, 800, 600);
        test1Program = new Program(
                new VertexShader("src/shaders/test.vert.glsl").create(),
                new ControlShader("src/shaders/test.cont.glsl").create(),
                new EvaluationShader("src/shaders/test.eval.glsl").create(),
                new FragmentShader("src/shaders/test.frag.glsl").create()
                ).create();
        vaoId = glGenVertexArrays();
        glBindVertexArray(vaoId);
    }

    @Override
    protected void draw(double msDelta) {
        glClearColor((float)Math.sin(currentTime / 1000f) * 0.5f + 0.5f, (float)Math.cos(currentTime / 1000f) * 0.5f + 0.5f, 0.0f, 1.0f);
        glClear(GL_COLOR_BUFFER_BIT);        
        test1Program.use();
        glVertexAttrib4f(0, (float)Math.sin(currentTime / 1000f) * 0.5f, (float)Math.cos(currentTime / 1000f) * 0.5f, 0.0f, 0.0f);
        glVertexAttrib4f(1, (float)Math.sin(currentTime / 1000f * 2f) * 0.5f + 0.5f, (float)Math.cos(currentTime / 1000f * 2f) * 0.5f + 0.5f, 0.0f, 1.0f);
        glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);
        glDrawArrays(GL_TRIANGLES, 0, 3);
    }

    @Override
    protected void shutdown() {
        test1Program.delete();
        glDeleteVertexArrays(vaoId);
    }

    public static void main(String[] args) {
        Controller controller = new GameController();
        controller.start();
    }
}

我的自定义 VertexShaderControlShaderEvaluationShaderFragmentShader 正在运行,如果着色器代码无法正确编译或者没有正确链接,然后将抛出异常并且我会注意到它。所以我已经验证了那些和 Program 工作正常。

错误(Exception in thread "main"org.lwjgl.opengl.OpenGLException: Invalid operation (1282))在调用 glDrawArrays 时抛出。

测试.vert.glsl:

#version 440 core

layout(location = 0) in vec4 offset;
layout(location = 1) in vec4 color;

out VS_OUT {
    vec4 color;
} vs_out;

void main() {
    const vec4 vertices[3] = vec4[3](
        vec4(0.25, -0.25, 0.5, 1.0),
        vec4(-0.25, -0.25, 0.5, 1.0),
        vec4(0.25, 0.25, 0.5, 1.0)
    );
    gl_Position = vertices[gl_VertexID] + offset;
    vs_out.color = color;
}

测试.cont.glsl:

#version 440 core

layout(vertices = 3) out;

void main() {
    if (gl_InvocationID == 0) {
        gl_TessLevelInner[0] = 5.0;
        gl_TessLevelOuter[0] = 5.0;
        gl_TessLevelOuter[1] = 5.0;
        gl_TessLevelOuter[2] = 5.0;
    }
    gl_out[gl_InvocationID].gl_Position = gl_in[gl_InvocationID].gl_Position;
}

测试.eval.glsl:

#version 440 core

layout(triangles, equal_spacing, cw) in;

void main() {
    gl_Position = (gl_TessCoord.x * gl_in[0].gl_Position + gl_TessCoord.y * gl_in[1].gl_Position + gl_TessCoord.z * gl_in[2].gl_Position);
}

#version 440 core

in VS_OUT {
    vec4 color;
} fs_in;

out vec4 color;

void main() {
    color = fs_in.color;
}

我已经对我的所有代码进行了三次检查,并与本书进行了交叉检查,但不知道为什么它不起作用。如有任何帮助,我将不胜感激,并会在必要时提供更多信息。

最佳答案

我刚刚找到了答案:

    glDrawArrays(GL_TRIANGLES, 0, 3);

需要:

    glDrawArrays(GL_PATCHES, 0, 3);

如果 OpenGL 做出更多努力来说明问题所在,我们将不胜感激。

书中也没有任何地方(明确地)提到我需要使用 GL_PATCHES,我只是通过查看书中可编译示例的源代码来弄清楚这一点。

关于java - 曲面分割着色器上的 GL_INVALID_OPERATION,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21123001/

相关文章:

java - 使用 JQuery 将值设置为输入类型复选框

java - 在封闭类的父类(super class)型声明中使用嵌套类型作为泛型类型参数

linux - 如何在 Linux 的虚幻引擎 4 编辑器中强制使用 OpenGL 3?

c++ - 无法在 OpenGL ES2 中显示 RGB 纹理

c++ - 在 OpenGL 中使用 imageStore 写入图像

Java:将数字分成相等的部分或彼此近似

java - 从同一个应用程序(Flavors)安装两个调试 apk

opengl - 具有不同版本的多个上下文

opengl - 使用 SDL2 和 OpenGL 渲染文本

opengl - GLSL顶点着色器双线性采样高度图