gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-01 22:27:14 26 4
gpt4 key购买 nike

我将 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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com