c++ - OpenGL - 绘制带纹理正方形的最简单方法

标签 c++ opengl vbo vao

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

  • 创建一个具有 4 个坐标(A、B、C、D 代表正方形)的 VBO
  • 创建一个包含 4 个索引(A、C、D 和 B、C、D)的 EBO,告诉我我想用 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);
}

映射变量告诉片段着色器纹理坐标是什么。

关于c++ - OpenGL - 绘制带纹理正方形的最简单方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31347833/

相关文章:

c++ - 如何使用多个 VAO 和 VBO 在 OpenGL 中绘制多个对象?

C++ 中的 PHP 样式 foreach 循环

c++ - 如何使用 C++ win32 API 将 Variant Safe Array 转换为 Char?

c++ - 就处理器时间而言,fmod 有多昂贵?

c++ - 使用openGL的glBindFramebuffer好像没有效果

opengl - BIO 中的交错是有助于还是阻碍性能?

c++ - 树状 (graphviz) 堆栈跟踪(可视化调试)

c++ - 自定义 OpenGL 缓冲类不显示任何内容

c - 是否可以将 glutInit 移至我的 init 函数?

opengl - 在OpenGL中使用索引作为坐标