c++ - 在OpenGL程序中绘制彩色四边形作为背景

标签 c++ opengl glsl fragment-shader glm-math

我试图绘制一个四边形作为背景,并在片段着色器中将其设置为恒定颜色。然而,四边形中只绘制了一个三角形,并且其缩放比例很奇怪。 我的三角形顶点是:

const glm::vec3 background_vertices[6] =
{
    glm::vec3(-1.0f, -1.0f, 1.0f),
    glm::vec3(1.0f, -1.0f, 1.0f),
    glm::vec3(1.0f, 1.0f, 1.0f),

    glm::vec3(1.0f, 1.0f, 1.0f),
    glm::vec3(-1.0f, 1.0f, 1.0f),
    glm::vec3(-1.0f, -1.0f, 1.0f)
};

我使用以下命令为该四边形生成 VAO 和 VBO:

    // For background
    glGenVertexArrays(1, &background_vao);
    glGenBuffers(1, &background_vbo);
    glBindVertexArray(background_vao);

    glBindBuffer(GL_ARRAY_BUFFER, background_vbo);
    glBufferData(GL_ARRAY_BUFFER, sizeof(background_vertices), background_vertices, GL_STATIC_DRAW);

    glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, sizeof(glm::vec3), (void*)0);
    glEnableVertexAttribArray(0);

我最终在我的 display 函数中绘制它:

    glUniform1i(UniformLocs::pass, BACKGROUND);
    glBindVertexArray(background_vao);
    glDrawArrays(GL_TRIANGLES, 0, 3);

我还加载一个网格并以一定的透明度渲染它,因此我有多个着色器 channel (用于背景和其他计算)。

我的顶点着色器采用in pos_attrib并射出出位置,该位置设置为:

position = (pass == 0) ? pos_attrib : vec3(M * vec4(pos_attrib, 1.0));

并且gl_Position

    gl_Position = (pass == 0) ? vec4(position, 1.0) : PV * vec4(position, 1.0);

由于我的顶点在 NDC 范围内,因此我不对它们应用任何变换并将它们按原样发送到片段着色器。

我的片段着色器要么应用恒定颜色,要么通过以下方式计算对象的透明度:

    switch(pass)
    {
        case 0: // Render Background
            fragcolor = vec4(0.9f, 0.45f, 0.25f, 1.0f);
            break;
        default:
            fragcolor = min(HackTransparency(), vec4(1.0));
            break;
    }

但这会导致: Output

这看起来很简单,但我无法弄清楚我做错了什么。

如何显示彩色四边形作为背景? 对此的任何指示都会有所帮助。

编辑: 现在的输出如下所示: Latest output

最佳答案

只绘制了一个三角形,因为您将相同的坐标放置了两次,但顺序不同,这并不重要(除非您启用了 GL_CULL_FACE)。要绘制两个三角形,您必须绘制两个不同三角形。

它“缩放得很奇怪”,因为 0,0 是屏幕的中间,而不是左下角。左下角是-1,-1,右上角是1,1。 0,0 是中间。

关于c++ - 在OpenGL程序中绘制彩色四边形作为背景,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/74132934/

相关文章:

c++ - 基于范围的循环、唯一指针和 move 语义

c++ - 从派生类中使用关键字获取类型

c - 为什么 Visual Studio 不允许我编译此 Bresenham 代码?

c++ - 使用 OpenGL 3+ 渲染点(粒子)

opengl-es - 使用数据纹理

c++ - ostream 不打印添加两个 valarrays 的结果(使用运算符重载)

c# - 为 C# 使用 swig 时出现 TypeInitializationException

c++ - OpenGL GL_POLYGON 打印不正确

c++ - OpenGL:帮助使用 gl 函数绘制球体/圆

c - 在顶点着色器中将 4 个以上的组件打包到 RGBA_32 纹理中