在OpenGL中绘制彩色四边形作为背景

bqujaahr  于 2022-11-04  发布在  其他
关注(0)|答案(2)|浏览(190)

我试着画一个四边形作为背景,并在片段着色器中将其设置为恒定的颜色。但是,只画出了四边形中的一个三角形,并且它的比例很奇怪。我为三角形画的顶点是:

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);

我还加载了一个网格,并渲染了一些透明度,所以我有多个着色器通道(用于背景和其他计算)。
我的顶点着色器采用in pos_attrib并拍摄out position,设置如下:

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;
    }

但这会导致:

这看起来很简单,但我不知道我做错了什么。
我如何显示一个彩色的四边形作为背景?任何指针对此都会有帮助。
编辑:输出现在如下所示:

dohp0rv5

dohp0rv51#

只绘制了一个三角形,因为您将相同的坐标放置了两次,但顺序不同,这并不重要(除非您打开了GL_CULL_FACE)。要绘制两个三角形,您必须绘制两个 * 不同 * 的三角形。
之所以说它的比例很奇怪,是因为0,0是屏幕的中间,而不是左下角,左下角是-1,-1,右上角是1,1。

3qpi33ja

3qpi33ja2#

我将顶点更改为:

const glm::vec3 background_vertices[4] =
{
    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)
};

添加的索引:

const int indices[] =
{
    0, 1, 3, // First triangle
    1, 2, 3 // Second triangle
};

并使用了一个元素缓冲对象:

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

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

    glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, background_ebo);
    glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(indices), indices, GL_STATIC_DRAW);

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

    glBindBuffer(GL_ARRAY_BUFFER, 0);
    glBindVertexArray(0);

并将抽奖电话更改为:

glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_INT, 0);

它现在工作

相关问题