我试图绘制一个四边形作为背景,并在片段着色器中将其设置为恒定颜色。然而,四边形中只绘制了一个三角形,并且其缩放比例很奇怪。 我的三角形顶点是:
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;
}
这看起来很简单,但我无法弄清楚我做错了什么。
如何显示彩色四边形作为背景? 对此的任何指示都会有所帮助。
最佳答案
只绘制了一个三角形,因为您将相同的坐标放置了两次,但顺序不同,这并不重要(除非您启用了 GL_CULL_FACE
)。要绘制两个三角形,您必须绘制两个不同三角形。
它“缩放得很奇怪”,因为 0,0 是屏幕的中间,而不是左下角。左下角是-1,-1,右上角是1,1。 0,0 是中间。
关于c++ - 在OpenGL程序中绘制彩色四边形作为背景,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/74132934/