这个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);
}
但是,如果我删除发射顶点的部分,它就可以了。我做错了什么?
答案 0 :(得分:2)
简单回答,顶点着色器无法使用EmitVertex
和EndPrimitive
。对于通过管道传递的每个顶点,将调用一次顶点着色器,并为该单个顶点输出变化值。它不能创建或丢弃任何顶点或基元(它甚至根本没有合理的基元概念)。你需要的是一个geometry shader(尽管你的代码根本没有多大意义,为每个角放出一个具有相同顶点的三角形,所以根本没有任何栅格化的东西)
所以鉴于这个顶点着色器是完全非法的,我实际上怀疑语句的真实性“这个glsl着色器编译得很好”,而GL_INVALID_VALUE
错误似乎是合理的。虽然实际上会为一个不是由GL生成的程序抛出GL_INVALID_VALUE
(但也可能是由于某些包装器框架只是删除了一个未成功编译和链接的程序,但很奇怪)。