【问题标题】:opengl vertex color interpolationsopengl 顶点颜色插值
【发布时间】:2014-03-17 02:23:27
【问题描述】:

我刚刚开始使用 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中默认启用的状态吗?这个状态还有哪些其他值,我如何在它们之间切换?我希望使用片段着色器完全控制像素颜色,但似乎有幕后的计算会改变结果。显然有些事情我不明白,有人可以帮忙解决这个问题吗?

【问题讨论】:

  • 我相信插值发生在顶点着色器之后,片段着色器之前。所以片段着色器接收到插值。不过想想。如果三角形的每个顶点都有不同的值会发生什么?插值是必要的,并为此心存感激。编辑:查看flat 关键字。
  • 看看这个答案stackoverflow.com/questions/4421261/… 这可能有助于解释为什么会发生这种插值以及如何覆盖这个默认行为(提示:通过创建自己的片段着色器来处理着色)
  • 这是件好事,我原以为自己必须在其中一个着色器中编写插值算法,但无论我的工具在幕后做什么,我都想知道。
  • @MatthewPigram 呵呵。我实际上不知道您可以覆盖该行为。我一直认为插值是理所当然的。您可以覆盖哪些内容?

标签: c++ opengl


【解决方案1】:

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

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

如果您想看看没有插值会发生什么,请在绘制之前调用 glShadeModel(GL_FLAT)。默认值为 GL_SMOOTH。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-08-11
    • 2016-06-19
    • 1970-01-01
    • 2020-12-16
    • 1970-01-01
    • 2016-02-16
    • 1970-01-01
    相关资源
    最近更新 更多