0

这个 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);
}

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

4

1 回答 1

2

简单的回答,顶点着色器不能使用EmitVertexand EndPrimitive。对于通过管道的每个顶点调用一次顶点着色器,并为该单个顶点输出不同的值。它不能创建或丢弃任何顶点或图元(它甚至根本没有合理的图元概念)。为此,您需要一个几何着色器(尽管您的代码根本没有多大意义,为每个角输出一个具有相同顶点的三角形,因此根本不会有任何光栅化)。

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

于 2013-07-11T15:13:30.263 回答