C++ opengl顶点颜色插值

C++ opengl顶点颜色插值,c++,opengl,C++,Opengl,我刚刚开始使用opengl学习图形,几乎没有掌握着色器等概念。在一系列教程之后,我在屏幕上绘制了一个三角形,并为每个顶点指定了一个颜色属性 使用顶点着色器,我将颜色值转发给片段着色器,然后该着色器将顶点颜色简单地指定给片段 顶点着色器: [.....] layout(location = 1) in vec3 vertexColor; out vec3 fragmentColor; void main(){ [.....] fragmentColor = vertexColo

我刚刚开始使用opengl学习图形,几乎没有掌握着色器等概念。在一系列教程之后,我在屏幕上绘制了一个三角形,并为每个顶点指定了一个颜色属性

使用顶点着色器,我将颜色值转发给片段着色器,然后该着色器将顶点颜色简单地指定给片段

顶点着色器:

[.....]

layout(location = 1) in vec3 vertexColor;
out vec3 fragmentColor;

void main(){
    [.....]
    fragmentColor = vertexColor;

}
片段着色器:

[.....]

out vec3 color;

in vec3 fragmentColor;

void main()
{

color = fragmentColor;

}
所以我给三角形的每个顶点指定了不同的颜色。结果是一个平滑插值的彩色三角形


我的问题是:由于我向片段着色器发送了特定的颜色,平滑插值发生在哪里?它是opengl中默认启用的状态吗?此状态还可以有哪些其他值?如何在这些值之间切换?我希望使用片段着色器可以完全控制像素颜色,但似乎幕后的计算会改变结果。很明显,有些事情我不明白,有人能帮我解决这个问题吗?

在OpenGL管道中,在顶点着色阶段(顶点、镶嵌和几何体着色)和片段着色之间,是光栅化器。它的工作是确定特定几何体(点、线或三角形)覆盖的屏幕位置。了解这些位置以及输入顶点数据后,光栅化器将线性插值片段着色器中每个变化变量的数据值,并将这些值作为输入发送到片段着色器中。当应用于颜色值时,这称为Gouraud着色

来源:OpenGL编程指南,第八版


如果要查看在没有插值的情况下会发生什么,请在绘制之前调用glShadeModel(GL_FLAT)。默认值为GL_SMOOTH。

我相信插值发生在顶点着色器之后,片段着色器之前。因此片段着色器接收插值。想一想。如果三角形的每个顶点都有不同的值,会发生什么?插值是必要的,对此要心存感激。编辑:查看
flat
关键字。看看这个答案。这可能有助于解释为什么会发生这种插值,以及如何覆盖这种默认行为(提示:通过创建自己的片段着色器来处理着色)。这是一件好事,我希望自己必须在其中一个着色器中编写插值算法,但无论我的工具在幕后做什么,我都想知道。@MatthewPigram-Huh。我真的不知道你可以改变这种行为。我一直认为插值是理所当然的。你能推翻什么?