0

我有只有颜色的实体,所以没有纹理和有纹理的实体。我不想让它们混合,所以我有两个选择:使用glDisableVertexAttribArray(1)和更改片段着色器(在我的纹理着色器位置是1,顶点是0)或始终保持顶点和纹理属性数组并使用1x1带有纹理的白色6纹理坐标由于不使用GL_TRIANGLES而不是GL_QUADS便携性的影响(白色是为了避免乘法运算中给出的颜色变形。你可以猜到我的片段着色器看起来像:

#version 330
layout(location=0)out vec4 color;
uniform vec4 _color;
uniform sampler2D tex;
in vec2 UV;
void main()
{
    color=vec4(texture(tex,UV).rgb,1)*_color;
}  

我不想连续打开/关闭属性数组,也不想要后者。
我没有使用两种确定的方法,我发现并尝试了两者的混合,所以使用了一个1x1白色像素并只打开了顶点属性数组。

glEnableVertexAttribArray(0); //for vertex
glDisableVertexAttribArray(1); //to turn off texture coordinates
glBindBuffer(GL_ARRAY_BUFFER,...)
glVertexAttribPointer(0,2,...
glBindTexture(GL_TEXTURE_2D,flat) //flat is a 1x1 white texture so just a pixel
glDrawArrays(GL_TRIANGLES,0,...);
glDisableVertexAttribArray(0);

虽然我关闭了纹理属性数组,但我得到了我想要的结果。那么,这个代码片段是否可以保证在任何地方都可以工作?

这个问题的答案也是“如果纹理的属性数组关闭时纹理绑定到上下文OpenGL怎么办?” 问题的一部分答案。

4

1 回答 1

4

首先,没有“纹理属性数组”;你完全混淆了这些术语,我建议你阅读它们。您在索引 1 下的内容是“您指定的任意顶点属性,以表示着色器中的纹理坐标”。

我了解您遇到的问题,虽然它现在可以工作,但它的扩展性相当差。当你开始引入灯光和更复杂的效果时,你最终会陷入各种无法维护的混乱局面。

因此,我的建议是设置程序管道而不是程序,并简单地编写两个片段着色器。至于禁用属性数组,我认为您最好启用和禁用它(您可以使用 VAO),而不是在非纹理绘制调用上增加不必要的开销。

于 2013-07-15T13:53:27.737 回答