顶点着色器输出,没有任何 VBO 输入
vertex shader output without any vbo input
我正在使用 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上运行的。当然,一个实验的结果不是确凿的证据,但它肯定有助于确认这应该有效。
相关文章:
- 如果C++类在类方法中具有动态分配,但没有构造函数/析构函数或任何非静态成员,那么它仍然是POD类型吗
- 奇怪的(对我来说)返回声明 - 在谷歌上找不到任何关于它的信息
- 如何在不产生任何垃圾的情况下获得C中的像素
- 为什么我不能在 C++ 中的特定函数重载中调用同一函数的任何其他重载?
- C++映射有2个键,这样任何1个键都可以用来获取值
- Visual Studio(或任何其他工具)能否将地址解释为调用堆栈(boost上下文)的开头
- RtlCaptureStackBackTrace未捕获任何帧
- 链表c++插入,所有情况都已检查,但没有任何工作
- C++模板函数,用于比较任何无符号整数和有符号整数
- Arduino millis() - millis() 怎么能等于 0 以外的任何东西?
- 尝试摆脱任何堆内存分配
- 是否有任何C++功能可以对地图进行排序?
- 打印时有二叉树问题.用户输入不打印任何内容
- 共享指针和具有自定义删除程序的唯一指针之间的语法差异背后的任何原因
- 在C++行尾写一个分号或多个分号是否会改变任何内容
- C++类型特征,以查看是否可以<uint32_t>对类型"K"的任何变量调用"static_cast(k)"
- GLSL着色器不渲染任何内容,VAO已填充,VBO已填充顶点
- VBO 与即时模式 (glBegin/glEnd) 的行为是否存在任何行为差异
- 顶点着色器输出,没有任何 VBO 输入
- QThread在GUI事件上调用glBufferData()时不更新OpenGL vbo和不渲染任何东西