【问题标题】:How are the out variables of vertex shader interpolated?顶点着色器的输出变量是如何插值的?
【发布时间】:2021-10-07 09:36:13
【问题描述】:

据我了解,在顶点中计算的顶点的输入属性将根据当前像素的重心坐标进行插值。并且能够插值attributes 或计算当前像素的重心坐标是因为顶点流在顶点着色器之后转换为三角形流。当前像素点的重心坐标可以通过gl_Position提供的三角形顶点的屏幕位置和像素点位置得到。

但我很困惑如何在片段着色器中插入 in 变量。这是一个着色器的例子:

  • 顶点着色器
layout(binding = 0) uniform WorldMVP {
    mat4 worldMvp;
};
layout(binding = 0) uniform LightMVP{
    mat4 lightMvp;
};
layout(location = 0) in vec3 aVertexPosition;
layout(location = 1) in vec3 aVertexNormal;
layout(location = 2) in vec2 aTextureCoord;
layout(location = 0) out vec4 vPositionFromLight;
layout(location = 1) out vec2 vTextureCoord;
layout(location = 2) out vec3 vNormal;
void mian()
{
    gl_Position = worldMvp * vec4(aVertexPosition, 1.0);
    vPositionFromLight = lightMvp * vec4(aVertexPosition, 1.0);
    vTextureCoord = aTextureCoord;
    vNormal = aVertexNormal;
}
  • 片段着色器
layout(location = 0) in vec4 vPositionFromLight;
layout(location = 1) in vec2 vTextureCoord;
layout(location = 2) in vec3 vNormal;
layout(location = 0) out vec4 outColor;
void main()
{
    outColor = vec4(1.0, 1.0, 1.0, 1.0);
}

如果插值vPositionFromLight时使用的重心坐标与插值vTextureCoordvNormal等属性时使用的重心坐标相同,则似乎异常。因为vPositionFromLightgl_Position被不同的MVP转化为不同的剪辑空间。

vPositionFromLight 是如何插值的?插值vPositionFromLight时使用的重心坐标是多少。

【问题讨论】:

  • @KaiBurjack 感谢您的解释。轻型MVP变换的剪辑空间的重心坐标与世界MVP变换的剪辑空间的重心坐标是否相同?

标签: opengl graphics glsl vulkan


【解决方案1】:

因为 vPositionFromLight 和 gl_Position 被不同的 MVP 转换成不同的剪辑空间。

就 OpenGL 而言,它们只是数字vPositionFromLight 在“剪辑空间”中吗? OpenGL 不在乎;它们是vec4vec4 将获得与任何其他顶点着色器输出相同的插值数学。

后插值的空间与前插值的空间相同。

【讨论】:

  • 非常感谢。我明白你的回答。
猜你喜欢
  • 2012-12-11
  • 1970-01-01
  • 1970-01-01
  • 2017-05-08
  • 1970-01-01
  • 2020-05-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多