顶点着色器输出,没有任何 VBO 输入

vertex shader output without any vbo input

本文关键字:任何 VBO 输入 输出 顶点      更新时间:2023-10-16

我正在使用 OpenGL 3.2 编写C++编码,但我遇到了一个奇怪的顶点着色器问题。

所以,我有许多大小恒定的四边形(实际上是正方形)。我实际上想跳过 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 的情况下覆盖它吗?

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

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

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

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

相关文章: