Как интерполируются переменные out вершинного шейдера?

#opengl #graphics #glsl #vulkan

Вопрос:

Насколько я понимаю, входные атрибуты вершины, вычисленные в вершине, будут интерполированы в соответствии с барицентрической координатой текущего пикселя. И возможность интерполировать 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.

Как происходит vPositionFromLight интерполяция? Какова барицентрическая координата, используемая при интерполяции vPositionFromLight .

Комментарии:

1. @KaiBurjack Спасибо за ваше объяснение. Является ли барицентрическая координата пространства клипов, преобразованная MVP света, такой же, как и координата пространства клипов, преобразованная MVP мира?

Ответ №1:

Потому что vPositionFromLight и gl_Position преобразуются в разные пространства клипов разными MVP.

Что касается OpenGL, то это просто цифры. Находится vPositionFromLight в «пространстве клипа»? OpenGL все равно; они являются a vec4 , и это vec4 даст ту же математику интерполяции, что и любой другой вывод вершинного шейдера.

Пространство значения после интерполяции совпадает с пространством результата до интерполяции.

Комментарии:

1. Большое спасибо. Я понимаю ваш ответ.