顶点着色器的输出变量是如何插值的?
How are the out variables of vertex shader interpolated?
据我了解,顶点中计算的顶点的输入属性将根据当前像素的重心坐标进行插值。能够插值 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
时使用的重心坐标与插值属性vTextureCoord
和vNormal
中使用的重心坐标相同,则似乎不正常。因为vPositionFromLight
和gl_Position
被不同的MVP变换到不同的clip空间
vPositionFromLight
是如何插值的? vPositionFromLight
.
插值时使用的重心坐标是多少
Because vPositionFromLight and gl_Position are transformed into different clip spaces by different MVP.
就 OpenGL 而言,它们只是 数字 。 vPositionFromLight
是否在“剪辑 space”中? OpenGL 不在乎;它们是 vec4
,并且 vec4
将获得与任何其他顶点着色器输出相同的插值数学。
post-插值的space与插值前的结果相同space
据我了解,顶点中计算的顶点的输入属性将根据当前像素的重心坐标进行插值。能够插值 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
时使用的重心坐标与插值属性vTextureCoord
和vNormal
中使用的重心坐标相同,则似乎不正常。因为vPositionFromLight
和gl_Position
被不同的MVP变换到不同的clip空间
vPositionFromLight
是如何插值的? vPositionFromLight
.
Because vPositionFromLight and gl_Position are transformed into different clip spaces by different MVP.
就 OpenGL 而言,它们只是 数字 。 vPositionFromLight
是否在“剪辑 space”中? OpenGL 不在乎;它们是 vec4
,并且 vec4
将获得与任何其他顶点着色器输出相同的插值数学。
post-插值的space与插值前的结果相同space