【问题标题】:Invalide value when using EmitVertex in GLSL version 150在 GLSL 版本 150 中使用 Emit Vertex 时的值无效
【发布时间】:2013-07-11 15:06:03
【问题描述】:

这个 glsl 着色器编译得很好,但是当我尝试用 glUseProgram() 激活它时; opengl 给我一个无效值错误:

@vert
#version 150
uniform mat4 projectionmodelview_matrix_;
in vec3 global_position_;

void main(void) {
    gl_Position = projectionmodelview_matrix_ * vec4(global_position_, 1.0);
    EmitVertex();

    gl_Position = projectionmodelview_matrix_ * vec4(global_position_, 1.0);
    EmitVertex();

    gl_Position = projectionmodelview_matrix_ * vec4(global_position_, 1.0);
    EmitVertex();
    EndPrimitive();
}

@frag
#version 150
out vec4 out_color_;
void main(void) {
    out_color_ = vec4(1.0, 0.0, 0.0, 1.0);
}

但是,如果我删除发射顶点的部分,它会起作用。我做错了什么?

【问题讨论】:

    标签: opengl glsl geometry-shader


    【解决方案1】:

    简单的回答,顶点着色器不能使用EmitVertexEndPrimitive。对通过管道的每个顶点调用一次顶点着色器,并为该单个顶点输出不同的值。它不能创建或丢弃任何顶点或图元(它甚至根本没有合理的图元概念)。你需要的是一个geometry shader(虽然你的代码根本没有多大意义,为每个角放置一个具有相同顶点的三角形,所以根本不会有任何光栅化)。

    因此,鉴于此顶点着色器是完全非法的,我实际上怀疑声明 “此 glsl 着色器编译良好” 的真实性,GL_INVALID_VALUE 错误似乎是合理的。虽然GL_INVALID_VALUE 实际上会为不是由 GL 生成的程序抛出(但这也可能是由于某些包装框架只是删除了一个未成功编译和链接的程序,虽然很奇怪)。

    【讨论】:

    • 啊哈,几何着色器与顶点着色器不同?我一直认为几何着色器是一个顶点着色器,它也可以复制\发射顶点:)
    • @ViktorSehr 不,geometry shader 出现在 顶点着色器之后,并为每个图元调用一次(在此图元的顶点通过顶点着色器之后),并且可以从该原语生成新的原语(或根本不生成)。
    • 我怎么会错过这样的事情:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-01-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-04-16
    相关资源
    最近更新 更多