【问题标题】:Fragment shader color interpolation: details and hardware support片段着色器颜色插值:细节和硬件支持
【发布时间】:2014-02-23 08:09:22
【问题描述】:

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

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;
}

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

我的问题是:

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

【问题讨论】:

    标签: opengl glsl hardware gpu fragment-shader


    【解决方案1】:

    插值是步Fragment Processor

    算法非常简单,他们只是根据 UV 插入颜色

    【讨论】:

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

      【讨论】:

        【解决方案3】:

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

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

        【讨论】:

          【解决方案4】:

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

          第二个问题由我之前的其他发帖人回答。

          【讨论】:

            猜你喜欢
            • 2014-07-26
            • 1970-01-01
            • 1970-01-01
            • 2021-01-02
            • 1970-01-01
            • 1970-01-01
            • 2013-09-17
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多