Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/141.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
不带任何vbo输入的顶点着色器输出 我在C++中用OpenGL 3.2编码,我有一个奇怪的顶点着色器问题。_C++_Opengl_Sdl_Shader - Fatal编程技术网

不带任何vbo输入的顶点着色器输出 我在C++中用OpenGL 3.2编码,我有一个奇怪的顶点着色器问题。

不带任何vbo输入的顶点着色器输出 我在C++中用OpenGL 3.2编码,我有一个奇怪的顶点着色器问题。,c++,opengl,sdl,shader,C++,Opengl,Sdl,Shader,所以,我有很多四元体(实际上是正方形),它们的大小是恒定的。实际上,我想跳过vbo,只需使用ibo来决定着色器中的值 因此,在这样做的过程中,我发现OpenGL似乎有一些使GLSL输出非活动的标准,类似于它对输入的标准。这是我的密码: //vertex shader #version 140 in int p; //dummy input out vec2 t; //finicky output void main() { p; // line in question v

所以,我有很多四元体(实际上是正方形),它们的大小是恒定的。实际上,我想跳过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*
设置的常规顶点属性

请注意,它说的是“可以”,而不是“必须”


作为一个实验,我尝试了一个与你的着色器非常相似的小例子,效果很好。这根本没有任何顶点属性(顶点着色器中的变量中没有
)。这是运行在MacBook Pro与英特尔虹膜图形。当然,一个实验的结果并不是决定性的证据,但它肯定有助于证实这一点。

好吧,不是所有的控制路径都为
t
赋值。这可能只是因为您正在经历软件中的大多数顶点落在您编写的4个案例之外。是否每次绘制调用仅绘制4个顶点?GL中支持无属性渲染。没有理由需要“虚拟输入”。我有点不清楚发生了什么事。您正在尝试什么样的GL实现?您正在使用兼容性配置文件。我记得兼容性配置文件中的无属性渲染存在一些问题,但我不记得它们是什么。如果您确实需要属性(不确定是否需要更多研究),这并不意味着您需要虚拟VBO。您可以使用类似于
glVertexAttrib1f()
的内容设置虚拟属性的值。如果值不重要,或者根本不重要。与此相反,我更倾向于知道如何从每个顶点访问整个(4个顶点)vbo。需要进行大量测试,以确保这是绘制四边形所允许的最小值。我必须查看我的设置代码。