Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/311.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/opengl/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java GL_对细分着色器的无效_操作_Java_Opengl_Glsl_Shader_Lwjgl - Fatal编程技术网

Java GL_对细分着色器的无效_操作

Java GL_对细分着色器的无效_操作,java,opengl,glsl,shader,lwjgl,Java,Opengl,Glsl,Shader,Lwjgl,我正在使用OpenGL和LWJGL以及我自己的非常小的框架来完成一些琐碎的任务。我正在学习OpenGL超级圣经:综合教程和参考(第6版) 我将列出我的课程中最重要的部分: public class GameController extends Controller { private Program test1Program; private int vaoId; @Override protected void init() { glViewp

我正在使用OpenGL和LWJGL以及我自己的非常小的框架来完成一些琐碎的任务。我正在学习OpenGL超级圣经:综合教程和参考(第6版)

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

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();
    }
}
我的自定义
VertexShader
ControlShader
EvaluationShader
FragmentShader
正在工作,如果着色器代码编译不正确或链接不正确,则会引发异常,我会注意到它。因此,我已经验证了这些和
程序
是否正常工作

在调用
glDrawArrays
时抛出错误(
线程“main”org.lwjgl.opengl.opengleException中的异常:无效操作(1282)

test.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;
}

test.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;
}

test.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);
}


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

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

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


看一看我写的另一个答案。我刚刚找到了答案:

    glDrawArrays(GL_TRIANGLES, 0, 3);
需要:

    glDrawArrays(GL_PATCHES, 0, 3);
如果OpenGL再多做一些努力来说明问题所在,我们将不胜感激


书中也没有(明确地)提到我需要使用
GL_补丁
,我只是通过查看书中可编译示例的源代码来解决这个问题。

对那个被否决的投票者:给出被否决的理由。我不遵守发布标准的哪一部分?代码是否与默认管道一起工作(即没有Test1程序)?另外,为了安全起见,在渲染VAO之前再次绑定它。@Njol代码仅使用
VertexShader
FragmentShader
。刚刚验证了它也使用默认管道运行。问题很可能与不在核心上下文中使用VAO有关。。。通常,
GL\u INVALID\u操作
在您使用GLSL程序绘制任何内容之前(即调用
glUseProgram(…)
)很久,就会在GLSL程序的上下文中引发。不使用顶点指针进行绘制是完全可以接受的,但在核心上下文中调用
glDrawArrays(…)
之前,仍然需要绑定VAO。@AndonM.Coleman在LWJGL和着色器中的
core=false
上下文中工作时没有改变任何内容。在执行
glDrawArrays
之前,我还绑定了一个(空)VAO。遇到了相同的问题。谢谢分享。不过,我还有其他问题。我不得不忽略携带颜色数据的接口块,并在片段着色器中硬编码一个值,以便它显示任何内容。我希望我能理解为什么会更进一步。
    glDrawArrays(GL_PATCHES, 0, 3);