片段着色器颜色插值:详细信息和硬件支持

时间:2014-02-21 18:10:20

标签: opengl glsl hardware gpu fragment-shader

我知道使用非常简单的顶点着色器,如

attribute vec3 aVertexPosition;
attribute vec4 aVertexColor;
uniform mat4 uMVMatrix;
uniform mat4 uPMatrix;
varying vec4 vColor;

void main(void) {
    gl_Position = uPMatrix * uMVMatrix * vec4(aVertexPosition, 1.0);
    vColor = aVertexColor;
}

和一个非常简单的片段着色器,如

precision mediump float;
varying vec4 vColor;

void main(void) {
    gl_FragColor = vColor;
}

用红色,蓝色和绿色顶点绘制一个三角形,最终会得到一个像这样的三角形

interpolated triangle

我的问题是:

  1. 内插片段颜色属于一个三角形(或基元)的计算是否会在GPU上并行发生?
  2. 在三角形内插入片段颜色的算法和硬件支持是什么?

4 个答案:

答案 0 :(得分:4)

enter image description here

插值是步骤片段处理器

算法非常简单,只是根据UV

插入颜色

enter image description here enter image description here

答案 1 :(得分:1)

  1. 是的,绝对。
  2. 三角形颜色插值是固定功能管道的一部分(它实际上是光栅化步骤的一部分,在片段处理之前发生),因此它完全在硬件中执行,可能是所有视频卡。可以找到用于内插顶点数据的等式,例如,在OpenGL 4.3 specification14.6.1部分(第405-406页)。该算法为三角形定义barycentric coordinates,并使用它们在顶点之间进行插值。

答案 2 :(得分:1)

除了这里给出的答案之外,我还想补充一点,就是不必为插值提供专用的固定功能硬件。现代GPU倾向于使用“拉模型插值”,其中插值实际上是通过着色器单元完成的。

我建议阅读有关该主题的Fabian Giesen's blog article(以及关于genreal中图形管道的全系列文章)。

答案 3 :(得分:0)

关于第一个问题 - 尽管GPU上有并行单元,但它取决于所考虑的三角形的大小。对于大多数GPU来说,绘图是在逐个图块的基础上进行的,并且根据三角形的“屏幕”大小,如果它完全落在一个图块内,它将仅在一个图块处理器中完全处理。如果它被拆分,它可以由不同的单元并行完成。

第二个问题由我之前的其他海报回答。