#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. Большое спасибо. Я понимаю ваш ответ.