当前位置: 首页 > 知识库问答 >
问题:

顶点着色器如何将颜色信息传递给片段着色器?

丌官霖
2023-03-14

在一个简单的hello world OpenGL程序中,它只是在窗口上绘制一个静态三角形,当我将三角形的3个顶点设置为红色、绿色和蓝色时,三角形将填充渐变。

但是当我使用这样的着色器时:

顶点着色器:

attribute vec4 aVertex;
attribute vec4 aColor;

varying vec4 vColor;

void main(void) {
    gl_Position = gl_ModelViewMatrix * gl_ProjectionMatrix * aVertex;
    vColor = aColor;
}

其中属性aVertexaColor来自顶点缓冲区,通过glVertexAttribPointer的调用传递。

片段着色器:

varying vec4 vColor;
void main(void) {
    gl_FragColor = vColor;
}

三角形仍然充满了梯度,问题来了:

如果顶点着色器是按顶点计算的,则应为vColor的每个实例指定顶点的颜色。顶点颜色应为红色、绿色或蓝色,如顶点缓冲区中设置的。

那么渐变是从哪里来的呢?

在frag代码中,当它变成另一个的顶点时,它会变成另一个吗?

共有2个答案

秦诚
2023-03-14

渐变来自顶点颜色之间的插值,该插值发生在变化的片段着色器中。如果不想插值,请在变量开头使用“flat”关键字。你的误解可能源于缺乏关于顶点和碎片阶段如何工作的知识。它们的工作方式不同。顶点着色器是逐顶点调用的,而片段是逐像素调用的。默认情况下,插值会发生,因为需要覆盖在基本体部件定义的区域上的光栅化阶段生成的碎片。正如我所说,你可以通过“平坦”来禁用插值。在这种情况下,第一个顶点属性的颜色将定义形状的整体颜色。

彭浩穰
2023-03-14

片段着色器中的“变化”变量的结果是在顶点着色器阶段(基于顶点之间片段的相对位置)给定的值之间进行线性插值。

也就是说,当光栅化器在像素处吐出一个片段时,其位置也会在重心坐标中相对于三角形顶点给出。然后使用这些坐标对顶点着色器中的所有变量进行插值。在大多数情况下,这就是你想要的,而现在不插值所获得的速度是微不足道的。

使用关键字“flat”将禁用插值,而是使用第一个顶点的值(我不能100%确定“flat”是否适用于variable,因为我已切换到在较新版本的GLSL中使用in/out关键字)。

另一方面,我发现如果片段需要来自每个顶点的一些值,这一点特别有用。在本例中,我在几何体着色器中使用了平铺myVertexValue[3](例如这里)。

 类似资料:
  • WebGL的着色器代码分为顶点着色器代码和片元着色器代码两部分,顶点着色器代码会在GPU的顶点着色器单元执行,片元着色器代码会在GPU的片元着色器单元执行,在WebGL渲染管线流程中,或者说GPU的渲染流程中,顶点着色器代码先执行处理顶点,得到一系列片元,然后再执行片元着色器代码处理片元。 main()函数 顶点着色器和片元着色器代码都有一个唯一的主函数main(),attribute、varyi

  • 我真的不明白片段着色器是如何工作的。 我知道 顶点着色器每个顶点运行一次 片段着色器对每个片段运行一次 由于片段着色器不是按顶点而是按片段工作,它如何将数据发送到片段着色器?顶点的数量和片段的数量不相等。 它如何决定哪个碎片属于哪个顶点?

  • 我正在用OpenGL(PyOpenGL和Python)显示几何图形(文件格式:.stl)。几何数据具有形式,由三角形组合而成。 我保存到 VBO 数据;顶点、法线和颜色。由于法线仅每 3 个顶点(三角形)定义,并且我为每个顶点定义颜色矢量,因此 VBO 中的数据具有以下形式: 大写:;首先我保存所有顶点,然后我“附加”(使用)所有法线(法线数比顶点数和顶点颜色少3倍),然后我附加每个顶点的颜色向量

  • 在顶点数组缓冲区的典型构建中,我试图将一个无符号int属性与其他经典属性(顶点、法线、纹理坐标…)一起传递。然而,该属性的值最终以某种方式错误:我不确定该值是否错误,或者该属性只是没有设置。 从一个简单的例子开始,假设我定义了以下C输入结构: 准备我的顶点数组如下所示: 顶点着色器输入的定义如下: 此外,为了我的示例,假设我在片段着色器中有一个纹理采样器,在其上使用这些输入的TexCoord: 介

  • 顶点着色器用来操作ShaderEffect提供的顶点。正常情况下,ShaderEffect有4个顶点(左上top-left,右上top-right,左下bottom-left,右下bottom-right)。每个顶点使用vec4类型记录。为了实现顶点着色器的可视化,我们将编写一个吸收的效果。这个效果通常被用来让一个矩形窗口消失为一个点。 配置场景(Setting up the scene) 首先我