opengl-es - 这个 WebGL 程序中的顶点着色器和片段着色器之间的插值何时发生?
问题描述
背景
我正在查看来自 WebGL2 库PicoGL.js的示例代码。
它描述了一个三角形(三个顶点:(-0.5, -0.5), (0.5, -0.5), (0.0, 0.5)
),顶点着色器为每个三角形分配了一种颜色(红、绿、蓝):
#version 300 es
layout(location=0) in vec4 position;
layout(location=1) in vec3 color;
out vec3 vColor;
void main() {
vColor = color;
gl_Position = position;
}
vColor
输出被传递给片段着色器:
#version 300 es
precision highp float;
in vec3 vColor;
out vec4 fragColor;
void main() {
fragColor = vec4(vColor, 1.0);
}
它们一起呈现以下图像:
问题)
我的理解是顶点着色器每个顶点调用一次,而片段着色器每个像素调用一次。
但是,片段着色器引用了vColor
变量,每次调用每个顶点只分配一次,但像素比顶点多得多!
生成的图像清楚地显示了颜色渐变 - 为什么?WebGL 会自动vColor
在顶点之间插入像素值吗?如果是这样,插值是如何完成的?
解决方案
是的,WebGL 会自动在提供给 3 个顶点的值之间进行插值。
从本站复制
从一个值到另一个值的线性插值将是这个公式
result = (1 - t) * a + t * b
其中
t
是一个从 0 到 1 的值,表示 和 之间的某个a
位置b
。0 在a
和 1 在b
。尽管 WebGL 使用这个公式,但对于变化
result = (1 - t) * a / aW + t * b / bW ----------------------------- (1 - t) / aW + t / bW
aW
当变量设置为时设置的那个在哪里,当变量设置为时设置的那个W
是在哪里。gl_Position.w
a
bW
W
gl_Position.w
b
上面链接的站点显示了该公式在插值变化时如何生成透视正确的纹理映射坐标
它还显示了变化的动画
推荐阅读
- python - 在子列表中查找包含元组的列表中的最小值
- python - 类型错误:不支持的操作数类型 %: 'list' 和 'int' with np.mod
- python - 从列表 iltems 的不同组合中创建一个元素列表
- typescript - 不同的返回类型取决于输入
- mongodb - 将独立的 MongoDB 实例转换为单节点副本集
- firebase - 我们可以在firebase中通过UID搜索用户应用程序版本和设备操作系统吗?
- git - 如何在 vscode 中隐藏 git blame 时间线?
- ios - 用objective-c中的图像尺寸更改UIImage上文本的字体大小
- next.js - 如何在永久使用后停止我的节点应用程序以启动它
- crafter-cms - CrafterCMS 在初始设置后没有配置站点