我有只有颜色的实体,所以没有纹理和有纹理的实体。我不想让它们混合,所以我有两个选择:使用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
怎么办?” 问题的一部分答案。