没有任何vbo输入的顶点着色器输出

时间:2014-11-28 20:20:48

标签: c++ opengl sdl shader

我使用C ++在OpenGL 3.2中进行编码,而且我有一个奇怪的顶点着色器问题。

所以,我有一些具有恒定大小的四边形(实际上是正方形)。我实际上想跳过vbo并简单地使用ibo来决定着色器内的值。

因此,我发现OpenGL似乎有一些标准可以使GLSL输出非活动,类似于它对输入的作用。这是我的代码:

//vertex shader
#version 140
in int p; //dummy input
out vec2 t; //finicky output
void main() { 
    p;    // line in question
    vec2 pos;
    vec4 st = vec4(-2.5, 2.5, 0.0, 5);  //const values  
    if (gl_VertexID == 0)       { pos.x = st.x; pos.y = st.z; t.x = 1; t.y = 1;}
    else if (gl_VertexID == 1)  { pos.x = st.x; pos.y = st.w; t.x = 1; t.y = 0;}
    else if (gl_VertexID == 2)  { pos.x = st.y; pos.y = st.z; t.x = 0; t.y = 1;}
    else if (gl_VertexID == 3)  { pos.x = st.y; pos.y = st.w; t.x = 0; t.y = 0;}    
    gl_Position = gl_ModelViewProjectionMatrix * vec4( pos, 0.0, 1.0 ); 
}
//fragment shader
#version 140
uniform sampler2D tex;
in vec2 t;
void main() { 
    gl_FragColor = texture2D(tex, t);
}

没有这个虚拟输入和行“p;”使p处于活动状态,OpenGL不会尝试将顶点着色器输出与片段着色器连接。反正有没有使用虚拟vbo来覆盖它?

1 个答案:

答案 0 :(得分:1)

这可能是您的OpenGL实现的问题。我在3.2规范中找不到任何顶点属性是必需的。相反,第一节" 2.11.3顶点属性"清楚地表明,具有顶点属性是可选的:

  

顶点着色器可以定义命名的属性变量,这些变量绑定到由VertexAttrib*设置的通用顶点属性。

请注意,"可以" ,而不是"必须"。

作为一个实验,我尝试了一个与你的非常相似的着色器的小例子,它运行良好。这根本没有任何顶点属性(顶点着色器中没有in变量)。这是在带有Intel Iris图形的MacBook Pro上运行的。当然,一次实验的结果并不是确凿的证据,但它肯定有助于确认这应该有效。