我使用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来覆盖它?
答案 0 :(得分:1)
这可能是您的OpenGL实现的问题。我在3.2规范中找不到任何顶点属性是必需的。相反,第一节" 2.11.3顶点属性"清楚地表明,具有顶点属性是可选的:
顶点着色器可以定义命名的属性变量,这些变量绑定到由
VertexAttrib*
设置的通用顶点属性。
请注意,"可以" ,而不是"必须"。
作为一个实验,我尝试了一个与你的非常相似的着色器的小例子,它运行良好。这根本没有任何顶点属性(顶点着色器中没有in
变量)。这是在带有Intel Iris图形的MacBook Pro上运行的。当然,一次实验的结果并不是确凿的证据,但它肯定有助于确认这应该有效。