OpenGL -最简单的方法来绘制一个正方形与纹理

OpenGL - Easiest way to draw a square with a texture

本文关键字:一个 正方形 纹理 最简单 方法 绘制 OpenGL      更新时间:2023-10-16

我通常用这样的纹理画一个正方形:

  • 创建具有4个坐标的VBO(正方形为a,B,C,D)
  • 创建一个EBO,有4个索引(a,C,D和B,C,D),告诉我想从2个三角形中画一个正方形。
  • 用纹理绘制这些元素

没有最简单的方法没有EBO数组吗?

因为它不是很方便使用…如果我想这样使用:

VAO = [-0.8f, 0.5f, 0.0f,…]

EBO =[0,1,3,1,2,3,…]

然后我需要从我的VAO中移除一个正方形…然后我还需要从我的EBO数组中删除索引并重新排列它。有更好的方法吗?

如果你真的只想画一个带有纹理的正方形,你应该考虑创建一个新的空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);
}

映射变量告诉fragmentshader纹理坐标是什么

没有一个最简单的方法没有EBO数组吗?

复制顶点&使用glDrawArrays()

您可以使用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();