我试着画一个四边形作为背景,并在片段着色器中将其设置为恒定的颜色。但是,只画出了四边形中的一个三角形,并且它的比例很奇怪。我为三角形画的顶点是:
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;
}
但这会导致:
这看起来很简单,但我不知道我做错了什么。
我如何显示一个彩色的四边形作为背景?任何指针对此都会有帮助。
编辑:输出现在如下所示:
2条答案
按热度按时间dohp0rv51#
只绘制了一个三角形,因为您将相同的坐标放置了两次,但顺序不同,这并不重要(除非您打开了
GL_CULL_FACE
)。要绘制两个三角形,您必须绘制两个 * 不同 * 的三角形。之所以说它的比例很奇怪,是因为0,0是屏幕的中间,而不是左下角,左下角是-1,-1,右上角是1,1。
3qpi33ja2#
我将顶点更改为:
添加的索引:
并使用了一个元素缓冲对象:
并将抽奖电话更改为:
它现在工作