This translation is community contributed and may not be up to date. We only maintain the English version of the documentation. Read this manual in English
Materyaller (material), bir grafik bileşeninin (component) görüntüsü oluşturulurken kullanılacak işleme (rendering) biçimini tanımlar; bu bileşen bir sprite bileşeni, karo haritası, yazı tipi, GUI düğümü, model vb. olabilir.
Bir materyal, işleme hattında işlenecek nesneleri seçmeye yarayan bilgileri etiketler olarak tutar. Ayrıca, kullanılabilir grafik sürücüsü aracılığıyla derlenip grafik donanımına yüklenen ve bileşen her karede işlenirken çalıştırılan gölgelendirici programlarına (shader programs) başvurular da tutar.
Materyal oluşturmak için Assets tarayıcısındaki hedef klasöre sağ tıklayın ve New... ▸ Material seçeneğini seçin. (Menüden File ▸ New... seçeneğini, ardından Material seçeneğini de seçebilirsiniz). Yeni materyal dosyasına bir ad verin ve Ok düğmesine basın.

Yeni materyal Material Editor içinde açılır.

Materyal dosyası aşağıdaki bilgileri içerir:
render.enable_material() işleme API’si işlevinde de kullanılır. Adın benzersiz olması önerilir..vp). Köşe gölgelendiricisi programı, bileşenin geometrik temel öğelerini (primitive) oluşturan her köşe için GPU üzerinde çalıştırılır. Her köşenin ekran konumunu hesaplar ve isteğe bağlı olarak ara değerleme (interpolation) uygulanıp parça programına girdi olarak verilen “varying” değişkenleri üretir..fp). Program, bir geometrik temel öğenin her parçası (pikseli) için GPU üzerinde çalışır ve amacı her parçanın rengini belirlemektir. Bu genellikle doku sorgulamaları ve girdi değişkenlerine (varying değişkenleri veya sabitler) dayalı hesaplamalarla yapılır.render.predicate() tarafından kullanılan bir bit maskesi olarak temsil edilir. Bunun nasıl yapıldığını öğrenmek için İşleme belgelerine bakın. Bir projede kullanabileceğiniz en fazla etiket sayısı 32’dir.Gölgelendirici öznitelikleri (shader attributes; köşe akışları veya köşe öznitelikleri olarak da adlandırılır), GPU biriminin geometriyi işlemek için köşeleri bellekten nasıl aldığını belirleyen bir mekanizmadır. Köşe gölgelendiricisi, attribute anahtar sözcüğünü kullanarak bir akış kümesi belirtir ve çoğu durumda Defold, akışların adlarına göre verileri arka planda otomatik olarak üretip bağlar. Ancak bazı durumlarda, motorun üretmediği belirli bir efekti elde etmek için köşe başına daha fazla veri iletmek isteyebilirsiniz. Bir köşe özniteliği aşağıdaki alanlarla yapılandırılabilir:
SEMANTIC_TYPE_COLOR ile tanımlamak düzenleyicide bir renk seçici gösterir; veriler ise motordan gölgelendiriciye yine olduğu gibi iletilir.
SEMANTIC_TYPE_NONE Varsayılan anlamsal tür. Özniteliğe ait materyal verilerini doğrudan köşe arabelleğine iletmek dışında öznitelik üzerinde başka bir etkisi yoktur (varsayılan)SEMANTIC_TYPE_POSITION Öznitelik için köşe başına konum verisi üretir. Motora konumların nasıl hesaplanacağını belirtmek için koordinat uzayıyla birlikte kullanılabilirSEMANTIC_TYPE_TEXCOORD Öznitelik için köşe başına doku koordinatları üretirSEMANTIC_TYPE_PAGE_INDEX Öznitelik için köşe başına sayfa indisleri üretirSEMANTIC_TYPE_COLOR Düzenleyicinin özniteliği nasıl yorumladığını etkiler. Bir öznitelik renk anlamıyla yapılandırılırsa özellik denetleyicisinde bir renk seçici aracı gösterilirSEMANTIC_TYPE_NORMAL Öznitelik için köşe başına normal verisi üretirSEMANTIC_TYPE_TANGENT Öznitelik için köşe başına teğet verisi üretirSEMANTIC_TYPE_WORLD_MATRIX Öznitelik için köşe başına dünya matrisi verisi üretirSEMANTIC_TYPE_NORMAL_MATRIX Öznitelik için köşe başına normal matrisi verisi üretirSEMANTIC_TYPE_TEXTURE_TRANSFORM_2D Öznitelik için köşe başına 3x3 doku dönüşüm matrisi üretir. Parçacık bileşenleri için motor, bileşendeki görüntü özelliğine ait koordinatları atlas uzayına dönüştüren bir matris sağlar. Sprite bileşenleri için motor, bileşenin kullandığı her görüntüye ait bir matris sağlar (çoklu doku kullanılırken). Model bileşenleri için birim matris sağlanır.TYPE_BYTE İşaretli 8 bitlik bayt değerleriTYPE_UNSIGNED_BYTE İşaretsiz 8 bitlik bayt değerleriTYPE_SHORT İşaretli 16 bitlik short değerleriTYPE_UNSIGNED_SHORT İşaretsiz 16 bitlik short değerleriTYPE_INT İşaretli tamsayı değerleriTYPE_UNSIGNED_INT İşaretsiz tamsayı değerleriTYPE_FLOAT Kayan noktalı değerler (varsayılan)VECTOR_TYPE_SCALAR Tek skaler değerVECTOR_TYPE_VEC2 2B vektörVECTOR_TYPE_VEC3 3B vektörVECTOR_TYPE_VEC4 4B vektör (varsayılan)VECTOR_TYPE_MAT2 2B matrisVECTOR_TYPE_MAT3 3B matrisVECTOR_TYPE_MAT4 4B matrisVertex Her köşe için bir kez; örneğin, bir konum özniteliği genellikle örgüdeki (mesh) her köşe için köşe işlevine verilir (varsayılan)Instance Her örnek için bir kez; örneğin, bir dünya matrisi özniteliği genellikle her örnek için köşe işlevine bir kez verilirÖzel öznitelikler, akışları daha küçük bir veri türü veya farklı sayıda öğe kullanacak şekilde yeniden yapılandırarak hem CPU hem de GPU üzerindeki bellek kullanımını azaltmak için de kullanılabilir.
Materyal sistemi, belirli bir ad kümesi için çalışma sırasında özniteliğin adına göre otomatik olarak varsayılan bir anlamsal tür atar:
position - anlamsal tür: SEMANTIC_TYPE_POSITIONtexcoord0 - anlamsal tür: SEMANTIC_TYPE_TEXCOORDtexcoord1 - anlamsal tür: SEMANTIC_TYPE_TEXCOORDpage_index - anlamsal tür: SEMANTIC_TYPE_PAGE_INDEXcolor - anlamsal tür: SEMANTIC_TYPE_COLORnormal - anlamsal tür: SEMANTIC_TYPE_NORMALtangent - anlamsal tür: SEMANTIC_TYPE_TANGENTmtx_world - anlamsal tür: SEMANTIC_TYPE_WORLD_MATRIXmtx_normal - anlamsal tür: SEMANTIC_TYPE_NORMAL_MATRIXmtx_texture_transform_2d - anlamsal tür: SEMANTIC_TYPE_TEXTURE_TRANSFORM_2DMateryalde bu özniteliklere ait girdiler varsa varsayılan anlamsal türün yerine materyal düzenleyicisinde yapılandırdığınız tür kullanılır.
Kullanıcı tanımlı gölgelendirici sabitlerine benzer şekilde, go.get, go.set ve go.animate çağrılarıyla köşe özniteliklerini de çalışma sırasında güncelleyebilirsiniz:

go.set("#sprite", "tint", vmath.vector4(1,0,0,1))
go.animate("#sprite", "tint", go.PLAYBACK_LOOP_PINGPONG, vmath.vector4(1,0,0,1), go.EASING_LINEAR, 2)
Ancak köşe özniteliklerini güncellerken dikkat edilmesi gereken bazı noktalar vardır; bir bileşenin değeri kullanıp kullanamayacağı özniteliğin anlamsal türüne bağlıdır. Örneğin, sprite bileşeni SEMANTIC_TYPE_POSITION türünü destekler. Bu anlamsal türe sahip bir özniteliği güncellerseniz bileşen, üzerine yazılan değeri yok sayar; çünkü anlamsal tür, verilerin her zaman sprite bileşeninin konumundan üretilmesini gerektirir.
Model bileşenleri de özel materyal özniteliklerine go.get(), go.set() ve go.animate() aracılığıyla erişim sağlar. Örneğin, model materyalinde my_attribute adlı bir öznitelik tanımladıktan sonra:
go.set("#model", "my_attribute", vmath.vector4(1, 0, 0, 1))
go.animate("#model", "my_attribute", go.PLAYBACK_LOOP_PINGPONG,
vmath.vector4(0, 1, 0, 1), go.EASING_LINEAR, 2)
Birden çok örgü içeren bir modelde şu anda yalnızca ilk örgüye bu şekilde erişilebilir. Örneklerle çizimde kullanılmayan ve köşe başına tanımlı bir özniteliği güncellemek, örgü boyutuyla orantılı miktarda köşe verisinin yeniden oluşturulup yüklenmesine de yol açabilir. Bu nedenle sık güncellemeler büyük örgüler için maliyetli olabilir.
Bir köşe özniteliğinin skaler veya Vec4 dışında bir vektör türü olduğu durumlarda da verileri go.set kullanarak ayarlayabilirsiniz:
-- The last two components in the vec4 will not be used!
go.set("#sprite", "sprite_position_2d", vmath.vector4(my_x,my_y,0,0))
go.animate("#sprite", "sprite_position_2d", go.PLAYBACK_LOOP_PINGPONG, vmath.vector4(1,2,0,0), go.EASING_LINEAR, 2)
Aynı durum matris öznitelikleri için de geçerlidir; öznitelik Mat4 dışında bir matris türündeyse de verileri go.set kullanarak ayarlayabilirsiniz.
UV koordinatlarını atlas uzayına dönüştürmek için doku dönüşüm özniteliğini kullanma:
#version 140
in vec3 position;
in vec4 texcoord0;
in mat3 texture_transform_2d;
out vec2 var_texcoord0;
void main()
{
// Extract position from the transform
vec2 atlas_pos = texture_transform_2d[2].xy;
// Extract the scale from the transform
vec2 atlas_size = vec2(
length(texture_transform_2d[0].xy),
length(texture_transform_2d[1].xy)
);
// convert to local UV (0..1)
vec2 localUV = (texcoord0 - atlas_pos) / atlas_size;
// Alternatively, if the UV coordinates already are in the 0..1 range,
// you can transform into atlas space directly by multiplying the transform:
vec2 transformedUv = texture_transform_2d * texcoord0;
// Pass the value into the fragment shader
var_texcoord0 = localUV;
// ... rest of vertex shader
}
Örneklerle çizim, bir sahnede aynı nesnenin birden çok kopyasını verimli biçimde çizmek için kullanılan bir tekniktir. Nesne her kullanıldığında ayrı bir kopyasını oluşturmak yerine, grafik motorunun tek bir nesne oluşturup bunu birden çok kez yeniden kullanmasını sağlar. Örneğin, büyük bir orman içeren bir oyunda her ağaç için ayrı bir ağaç modeli oluşturmak yerine, örneklerle çizim sayesinde tek bir ağaç modeli oluşturup bunu farklı konum ve ölçeklerle yüzlerce veya binlerce kez yerleştirebilirsiniz. Böylece orman, her ağaç için ayrı çizim çağrıları yerine tek bir çizim çağrısıyla işlenebilir.
Örneklerle çizim şu anda yalnızca model bileşenlerinde kullanılabilir.
Örneklerle çizim, mümkün olduğunda otomatik olarak etkinleştirilir. Defold, çizim durumlarını mümkün olduğunca toplu çizim için birleştirmeye büyük ölçüde dayanır. Örneklerle çizimin çalışması için bazı gereksinimlerin karşılanması gerekir:
render.enable_material ile özel bir materyal ayarlanmışsa da örneklerle çizim çalışır)Bir köşe özniteliğini örnek başına tekrarlanacak şekilde yapılandırmak için Step function değerinin Instance olarak ayarlanması gerekir. Bu, belirli anlamsal türlerde ada göre otomatik olarak yapılır (yukarıdaki Varsayılan öznitelik anlamları tablosuna bakın), ancak materyal düzenleyicisinde Step function değeri Instance olarak ayarlanarak elle de yapılabilir.
Basit bir örnek olarak, aşağıdaki sahnede her biri bir model bileşeni içeren dört oyun nesnesi (game object) vardır:

Materyal, örnek başına tekrarlanan tek bir özel köşe özniteliğiyle şu şekilde yapılandırılmıştır:

Köşe gölgelendiricisinde örnek başına kullanılan birden çok öznitelik belirtilmiştir:
// Per vertex attributes
attribute highp vec4 position;
attribute mediump vec2 texcoord0;
attribute mediump vec3 normal;
// Per instance attributes
attribute mediump mat4 mtx_world;
attribute mediump mat4 mtx_normal;
attribute mediump vec4 instance_color;
mtx_world ve mtx_normal özniteliklerinin varsayılan olarak Instance adım işlevini kullanacak şekilde yapılandırıldığını unutmayın. Materyal düzenleyicisinde bunlar için birer girdi ekleyip Step function değerini Vertex olarak ayarlayarak bunu değiştirebilirsiniz. Böylece öznitelik, örnek başına değil köşe başına tekrarlanır.
Bu durumda örneklerle çizimin çalıştığını doğrulamak için web profil çıkarıcısına bakabilirsiniz. Kutunun örnekleri arasında değişen tek şey örnek başına öznitelikler olduğundan, bu durumda tek bir çizim çağrısıyla işlenebilir:

Masaüstünde OpenGL 3.1 ve mobilde OpenGL ES 3.0, örneklerle çizimi temel bir özellik olarak sağlar. Daha eski OpenGL ES ve WebGL bağlamları bunu ANGLE_instanced_arrays gibi bir uzantıyla destekleyebilir; diğer eski bağdaştırıcılar ise desteklemez. Örneklerle çizim kullanılamadığında işleme varsayılan olarak yine çalışır, ancak performansı daha düşük olabilir.
Desteği saptamak ve gerektiğinde daha az maliyetli bir materyal seçmek veya çok sayıda örnek içeren içeriği çıkarmak için graphics.get_adapter_info() kullanın. features alanı, desteklenen özellik sabitlerinin dizisidir; bu sabitlerin anahtar olarak kullanıldığı bir tablo değildir:
local function has_context_feature(feature)
local adapter_info = graphics.get_adapter_info()
for _, supported_feature in ipairs(adapter_info.features) do
if supported_feature == feature then
return true
end
end
return false
end
local instancing_supported = has_context_feature(
graphics.CONTEXT_FEATURE_INSTANCING
)
Gölgelendirici sabitleri (shader constants) veya “uniform” değerleri, motordan köşe ve parça gölgelendiricisi programlarına iletilen değerlerdir. Bir sabiti kullanmak için materyal dosyasında onu Vertex Constant veya Fragment Constant özelliği olarak tanımlayın. Karşılık gelen uniform değişkenlerinin gölgelendirici programında tanımlanması gerekir. Bir materyalde aşağıdaki sabitler ayarlanabilir:
CONSTANT_TYPE_WORLDCONSTANT_TYPE_VIEWCONSTANT_TYPE_PROJECTIONCONSTANT_TYPE_VIEWPROJCONSTANT_TYPE_WORLDVIEWCONSTANT_TYPE_WORLDVIEWPROJCONSTANT_TYPE_WORLD_INVERSECONSTANT_TYPE_VIEW_INVERSECONSTANT_TYPE_PROJECTION_INVERSECONSTANT_TYPE_VIEWPROJ_INVERSECONSTANT_TYPE_WORLDVIEW_INVERSECONSTANT_TYPE_WORLDVIEWPROJ_INVERSECONSTANT_TYPE_NORMALCONSTANT_TYPE_TIMEvector4 değeridir; .x motorun başlatılmasından bu yana geçen süreyi, .y önceki kareden bu yana geçen süreyi içerir. .z ve .w şu anda sıfırdır. Motor bu değeri otomatik olarak günceller; go.set() ile güncellenmesi gerekmez. Bir örnek için Shadertoy öğreticisine bakın.
Modern bir GLSL uniform bloğunda time adlı bir Time sabiti tanımlayın:
uniform fragment_inputs
{
vec4 time;
};
CONSTANT_TYPE_USERÖrnek:
go.set("#sprite", "tint", vmath.vector4(1,0,0,1))
go.animate("#sprite", "tint", go.PLAYBACK_LOOP_PINGPONG, vmath.vector4(1,0,0,1), go.EASING_LINEAR, 2)
CONSTANT_TYPE_USER_MATRIX4Örnek:
go.set("#sprite", "m", vmath.matrix4())
Bir GUI betiğinde, düğümün materyal sabitlerini okumak ve yazmak için go işlevleri yerine gui.get() ve gui.set() kullanın. Vektör bileşenleri, matris sabitleri ve sabit dizileri desteklenir. Seçenekler tablosundaki dizi indisleri 1’den başlar:
local node = gui.get_node("button")
local tint = gui.get(node, "tint")
gui.set(node, "tint.x", 0.5)
gui.set(node, "light_matrix", vmath.matrix4())
gui.set(node, "tint_array", vmath.vector4(1, 0, 0, 1), { index = 1 })
CONSTANT_TYPE_USER veya CONSTANT_TYPE_USER_MATRIX4 türündeki bir materyal sabitinin go.get() ve go.set() ya da gui.get() ve gui.set() ile kullanılabilmesi için gölgelendirici programında kullanılması gerekir. Sabit materyalde tanımlanmış ancak programda kullanılmamışsa materyalden kaldırılır ve çalışma sırasında kullanılamaz.
Örnekleyiciler, bir dokudan (karo kaynağı veya atlas) renk bilgisi örneklemek için kullanılır. Renk bilgisi daha sonra gölgelendirici programındaki hesaplamalarda kullanılabilir.
Sprite, karo haritası, GUI ve parçacık efekti bileşenleri, görüntü dokularını ilk tanımlanan sampler2D değerine otomatik olarak bağlar. Sprite bileşenleri birden çok dokuyu da destekler: materyalde tanımlanan her örnekleyici, sprite bileşeninde adlandırılmış bir görüntü yuvasına dönüşür. İlk doku, sprite bileşeninin animasyon verilerini sağlar ve kare dizisini yönetir. Her karede, görüntü kimliği her ek dokuda karşılık gelen görüntüyü bulmak için kullanılır; ek dokular kendi UV koordinatlarını sağlar. Bu nedenle atanan atlasların veya karo kaynaklarının eşleşen kare kimlikleri ve benzer şekilli görüntüler içermesi önerilir; çokgen biçiminde paketlenen şekillerin farklı olması doku taşmasına yol açabilir. Ayrıntılar için Çok dokulu sprite bileşenleri bölümüne bakın.
Ek bir doku yuvası sunmayan bir bileşen veya işleme iş akışı için, işleme betiğinden ek doku örnekleyicileri bağlamak üzere render.enable_texture() kullanın.
![]()
-- mysprite.fp
varying mediump vec2 var_texcoord0;
uniform lowp sampler2D MY_SAMPLER;
void main()
{
gl_FragColor = texture2D(MY_SAMPLER, var_texcoord0.xy);
}
Bir bileşenin örnekleyici ayarlarını, materyal dosyasına örnekleyiciyi adıyla ekleyerek belirtebilirsiniz. Örnekleyicinizi materyal dosyasında yapılandırmazsanız genel graphics proje ayarları kullanılır.

Model bileşenleri için örnekleyicilerinizi materyal dosyasında istediğiniz ayarlarla belirtmeniz gerekir. Düzenleyici daha sonra bu materyali kullanan herhangi bir model bileşeni için dokuları ayarlamanıza izin verir:

-- mymodel.fp
varying mediump vec2 var_texcoord0;
uniform lowp sampler2D TEXTURE_1;
uniform lowp sampler2D TEXTURE_2;
void main()
{
lowp vec4 color1 = texture2D(TEXTURE_1, var_texcoord0.xy);
lowp vec4 color2 = texture2D(TEXTURE_2, var_texcoord0.xy);
gl_FragColor = color1 * color2;
}

sampler2D adıyla eşleşmesi önerilir.WRAP_MODE_REPEAT, [0,1] aralığının dışındaki doku verilerini tekrarlar.WRAP_MODE_MIRRORED_REPEAT, [0,1] aralığının dışındaki doku verilerini tekrarlar, ancak her ikinci tekrar aynalanır.WRAP_MODE_CLAMP_TO_EDGE, 1.0’dan büyük değerlerin doku verisini 1.0’a, 0.0’dan küçük değerlerinkini ise 0.0’a ayarlar—yani kenar pikselleri sınıra kadar tekrarlanır.Default, game.project dosyasında Graphics altında Default Texture Min Filter ve Default Texture Mag Filter olarak belirtilen varsayılan filtre seçeneğini kullanır.FILTER_MODE_NEAREST, koordinatları pikselin merkezine en yakın olan tekseli kullanır.FILTER_MODE_LINEAR, pikselin merkezine en yakın 2x2 teksel dizisinin ağırlıklı doğrusal ortalamasını ayarlar.FILTER_MODE_NEAREST_MIPMAP_NEAREST, tek bir mipmap içindeki en yakın teksel değerini seçer.FILTER_MODE_NEAREST_MIPMAP_LINEAR, en uygun iki yakın mipmap içindeki en yakın tekseli seçer ve ardından bu iki değer arasında doğrusal ara değerleme yapar.FILTER_MODE_LINEAR_MIPMAP_NEAREST, tek bir mipmap içinde doğrusal ara değerleme yapar.FILTER_MODE_LINEAR_MIPMAP_LINEAR, iki haritanın her birindeki değeri hesaplamak için doğrusal ara değerleme kullanır ve ardından bu iki değer arasında doğrusal ara değerleme yapar.İşleme hattı çizim yaparken sabit değerlerini varsayılan sistem sabit arabelleğinden alır. Varsayılan sabitleri geçersiz kılmak ve gölgelendirici programının uniform değerlerini bunun yerine işleme betiğinde kodla ayarlamak için özel bir sabit arabelleği oluşturabilirsiniz:
self.constants = render.constant_buffer() -- <1>
self.constants.tint = vmath.vector4(1, 0, 0, 1) -- <2>
...
render.draw(self.my_pred, {constants = self.constants}) -- <3>
tint sabitini parlak kırmızıya ayarlayınArabelleğin sabit öğelerine normal bir Lua tablosundaki gibi başvurulduğunu, ancak arabellek üzerinde pairs() veya ipairs() ile yineleme yapılamadığını unutmayın.