首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Tesselation着色机上的GL_INVALID_OPERATION

Tesselation着色机上的GL_INVALID_OPERATION
EN

Stack Overflow用户
提问于 2014-01-14 20:09:56
回答 2查看 758关注 0票数 3

我使用OpenGL和LWJGL以及我自己的非常小的框架来处理一些琐碎的任务。我正在学习“OpenGL SuperBible:全面教程和参考”(第6版)一书。

我将列出我计划中最重要的部分:

代码语言:javascript
复制
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调用时抛出。

test.vert.glsl:

代码语言:javascript
复制
#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;
}

test.cont.glsl:

代码语言:javascript
复制
#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;
}

test.eval.glsl:

代码语言:javascript
复制
#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);
}

代码语言:javascript
复制
#version 440 core

in VS_OUT {
    vec4 color;
} fs_in;

out vec4 color;

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

我已经三次检查了我的所有代码,并交叉与这本书,但不知道为什么它不工作。如果需要的话,我将非常感谢您的帮助并随时提供更多的信息。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-01-14 20:49:26

我刚才找到了答案:

代码语言:javascript
复制
    glDrawArrays(GL_TRIANGLES, 0, 3);

需要:

代码语言:javascript
复制
    glDrawArrays(GL_PATCHES, 0, 3);

如果OpenGL能做出更多的努力来说明出了什么问题,我们会很感激的。

书中也没有提到我需要使用GL_PATCHES,我只是看了一下书中可编译示例的源代码就知道了。

票数 7
EN

Stack Overflow用户

发布于 2014-01-14 20:47:38

在对您的着色器进行了更彻底的调查之后,我怀疑问题的一部分是在所有阶段链接之后,程序中没有顶点属性1 (layout(location = 1) in vec4 color)。这可能不是你的全部问题,但就目前的情况而言,你的GLSL程序将不会按照你想要的方式运行。

您必须将输入到顶点着色器的数据通过镶嵌着色器阶段传递到片段着色器阶段--如果不这样做,GLSL编译器/链接器将确定在程序执行时不使用顶点属性,并且不为其分配位置。这种行为也适用于制服。

看看我为explanation on how to do this写的另一个答案。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21123001

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档