通常我画一个像这样的纹理的正方形:
没有EBO阵列是不是最简单的方法?
因为使用它不是很方便...如果我想这样使用:
VAO = [-0.8f,0.5f,0.0f,...]
EBO = [0,1,3,1,2,3,...]
然后我需要从我的VAO中移除一个方格...然后我还需要从我的EBO数组中删除索引并重新排列它。 有更好的方法吗?
答案 0 :(得分:2)
如果你真的只想绘制一个带纹理的正方形,你应该考虑制作一个新的空VAO,然后调用glDrawArrays(GL_TRIANGLE_STRIP, 0,3);
然后顶点着色器看起来像这样:
out vec2 mapping;
void main()
{
float size = 1.0f;
vec2 offset;
switch(gl_VertexID)
{
case 0:
//Bottom-left
mapping = vec2(0.0f, 0.0f);
offset = vec2(-size, -size);
break;
case 1:
//Top-left
mapping = vec2(0.0f, 1.0f);
offset = vec2(-size, size);
break;
case 2:
//Bottom-right
mapping = vec2(1.0, 0.0);
offset = vec2(size, -size);
break;
case 3:
//Top-right
mapping = vec2(1.0, 1.0);
offset = vec2(size, size);
break;
}
gl_Position = vec4(offset, 0.0f, 1.0f);
}
映射变量告诉碎片器纹理坐标是什么。
答案 1 :(得分:1)
没有EBO阵列是不是最简单的方法?
复制你的顶点&使用glDrawArrays()
。
答案 2 :(得分:1)
您可以使用DrawArray绘制索引。
这样的事情:
Vertex2D* vertex = (Vertex2D*) vbo->lock();
vertex[0].x = x[0]; vertex[0].y = y[0]; vertex[0].u = u[0]; vertex[0].v = v[0]; vertex[0].color = color;
vertex[1].x = x[0]; vertex[1].y = y[1]; vertex[1].u = u[0]; vertex[1].v = v[1]; vertex[1].color = color;
vertex[2].x = x[1]; vertex[2].y = y[1]; vertex[2].u = u[1]; vertex[2].v = v[1]; vertex[2].color = color;
vertex[3].x = x[1]; vertex[3].y = y[0]; vertex[3].u = u[1]; vertex[3].v = v[0]; vertex[3].color = color;
vbo->unlock();
shader->bind();
vbo->bind();
vao->bind();
tex->bind();
glDrawArrays(GL_TRIANGLE_FAN, 0, 4);
tex->unbind();
vao->unbind();
vbo->unbind();
shader->unbind();