private void DrawTexture(Texture source, RenderTexture target, RectInt position)
{
if (source == null || target == null || m_DrawTextureShader == null)
return;
if (m_DrawTextureMateral == null)
m_DrawTextureMateral = new Material(m_DrawTextureShader);
// Construct transformation matrix
// column major
//
// r-l 0 0 l
// 0 t-b 0 b
// 0 0 0 -1
// 0 0 0 1
float l = position.x * 2.0f / target.width - 1;
float r = (position.x + position.width) * 2.0f / target.width - 1;
float b = position.y * 2.0f / target.height - 1;
float t = (position.y + position.height) * 2.0f / target.height - 1;
var mat = new Matrix4x4();
mat.m00 = r - l;
mat.m03 = l;
mat.m11 = t - b;
mat.m13 = b;
mat.m23 = -1;
mat.m33 = 1;
m_DrawTextureMateral.SetMatrix(Shader.PropertyToID("_ImageMVP"), GL.GetGPUProjectionMatrix(mat, true));
Graphics.Blit(source, target, m_DrawTextureMateral);
}
//the corresponding shader code
//_ImageMVP is the matrix we just set above
v2f_img vert (appdata_img v)
{
v2f_img o;
o.pos = mul(_ImageMVP, v.vertex);
o.uv = v.texcoord;
return o;
}
fixed4 frag (v2f_img i) : SV_Target
{
return tex2D(_MainTex, i.uv);
}
привет, парни. Я хочу выяснить происхождение вышеприведенной матрицы. Функция "drawtexture" создает матрицу (названную _ImageMVP) для рисования четырехугольника в указанном месте RTT, фактически квад заполнен экран с четырьмя вершинами, который состоит из четырех вершин ((0,0f, 0,0f, 0,1f), (0,0f, 1,0f, 0,1f), (1,0f, 1,0f, 0,1f), (1,0f, 0,0f, 0.1f) , Кажется, что эта матрица может быть преобразованием области просмотра, а затем предварительно умножена на некоторую матрицу смещения (от 0 ~ 1 до c пробел -1 ~ 1, потому что диапазон нашей вершины равен 0 ~ 1) , как результат, матрица достигает цели вышеупомянутой функции, но я думаю, но я не понимаю, как получить коэффициенты этой матрицы, особенно l, r, t, b, простите меня плохо в математике, я ' Мы добавили некоторые комментарии к коду на случай путаницы. Пожалуйста, скажите мне c математические шаги, которые нужно решить, заранее спасибо!