The Book of Shaders by Patricio Gonzalez Vivo & Jen Lowe

Українська - Bahasa Indonesia - Tiếng Việt - 日本語 - 中文版 - 한국어 - Español - Portugues - Français - Italiano - Deutsch - Русский - Polski - Türkçe - English


2B Matrisler

Öteleme (Translate)

Önceki bölümde bazı şekiller yapmayı öğrendik — bu şekilleri hareket ettirmenin püf noktası koordinat sisteminin kendisini hareket ettirmektir. Bunu, her bir fragmanın konumunu içeren st değişkenine basitçe bir vektör ekleyerek başarabiliriz. Bu, tüm uzay koordinat sisteminin hareket etmesine neden olur.

Bunu açıklamaktansa görmek daha kolaydır; kendiniz görmek için:

Şimdi aşağıdaki alıştırmayı deneyin:

Döndürme

Nesneleri döndürmek için tüm uzay sistemini hareket ettirmemiz de gerekir. Bunun için bir matris kullanacağız. Matris, sütun ve satırlar halinde düzenlenmiş bir sayı kümesidir. Vektörler, vektörün değerlerini belirli bir şekilde değiştirmek için kesin kurallar izlenerek matrislerle çarpılır.

Matris için Vikipedi sayfası

GLSL'de iki, üç ve dört boyutlu matrisler için yerleşik destek vardır: mat2 (2x2), mat3 (3x3) ve mat4 (4x4). GLSL ayrıca matris çarpımını (*) ve matrise özgü fonksiyonu (matrixCompMult()) da destekler.

Matrislerin davranışlarına dayanarak, belirli davranışlar üretmek için matrisler oluşturulabilir. Örneğin bir vektörü ötelemek için matris kullanabiliriz:

Daha ilginç olarak, koordinat sistemini döndürmek için bir matris kullanabiliriz:

2B döndürme matrisi oluşturan bir fonksiyon için aşağıdaki koda bakın. Bu fonksiyon, koordinatları vec2(0.0) noktası etrafında döndürmek için iki boyutlu vektörler için yukarıdaki formülü izler.

mat2 rotate2d(float _angle){
    return mat2(cos(_angle),-sin(_angle),
                sin(_angle),cos(_angle));
}

Şekilleri çizme şeklimize göre, bu tam olarak istediğimiz şey değildir. Artı şeklimiz vec2(0.5) konumuna karşılık gelen tuvalin merkezinde çizilmiştir. Bu yüzden, uzayı döndürmeden önce şekli merkezden vec2(0.0) koordinatına taşımamız, uzayı döndürmemiz ve sonunda orijinal yerine geri taşımamız gerekir.

Bu şöyle görünür:

Aşağıdaki alıştırmaları deneyin:

Ölçekleme

Matrislerin uzaydaki nesneleri ötelemek ve döndürmek için nasıl kullanıldığını gördük. (Daha doğrusu, nesneleri döndürmek ve taşımak için koordinat sistemini dönüştürmek.) 3D modelleme yazılımı veya Processing'deki push ve pop matris fonksiyonlarını kullandıysanız, matrislerin bir nesnenin boyutunu ölçeklemek için de kullanılabileceğini bilirsiniz.

Önceki formülü izleyerek, 2B ölçekleme matrisinin nasıl yapılacağını anlayabiliriz:

mat2 scale(vec2 _scale){
    return mat2(_scale.x,0.0,
                0.0,_scale.y);
}

Bunun nasıl çalıştığını daha derinden anlamak için aşağıdaki alıştırmaları deneyin.

Matrisler için diğer kullanımlar: YUV renk

YUV, fotoğraf ve videoların analog kodlaması için kullanılan ve krominans bileşenlerinin bant genişliğini azaltmak için insan algısının aralığını dikkate alan bir renk uzayıdır.

Aşağıdaki kod, renkleri bir moddan diğerine dönüştürmek için GLSL'de matris işlemlerini kullanmanın ilginç bir fırsatıdır.

Gördüğünüz gibi, renkleri matrislerle çarparak vektörler olarak ele alıyoruz. Bu şekilde değerleri "hareket ettiriyoruz".

Bu bölümde vektörleri taşımak, döndürmek ve ölçeklemek için matris dönüşümlerini nasıl kullanacağımızı öğrendik. Bu dönüşümler, önceki bölümde öğrendiğimiz şekillerden kompozisyonlar yapmak için gerekli olacaktır. Bir sonraki bölümde öğrendiğimiz her şeyi güzel prosedürel desenler yapmak için uygulayacağız. Tekrarlama ve çeşitleme kodlamanın heyecan verici bir pratik olabileceğini göreceksiniz.

Araç kutunuz için