Ayrıca, önceden tanımlanmış bir gl_FragColor'a sahibiz.
Bununla başlayalım. Hayır, önceden tanımlı değilsingl_FragColor
. Bu çekirdek OpenGL 3.1 ve üzeri sürümlerden kaldırıldı. Uyumluluğu kullanmadığınız sürece (bu durumda, 3.30 gölgelendiriciniz #version 330 compatibility
en üstte yazmalıdır ), bunu asla kullanmamalısınız.
Şimdi, kullanıcı tanımlı parça gölgelendirici çıktılarına geri dönün. Ama önce hızlı bir benzetme.
Köşe gölgelendiricilerinde girdilerinizin nasıl olduğunu hatırlıyor musunuz? Ve bu girişler, nitelik endeksleri köşe size aktarmak sayıları temsil glVertexAttribPointer
ve glEnableVertexAttribArray
benzeri ve? Hangi girdinin hangi nitelikten çekileceğini siz belirlersiniz. GLSL 3.30'da şu sözdizimini kullanırsınız:
layout(location = 2) in color;
Bu, color
köşe gölgelendiricisi girdisinin öznitelik konumu 2'den gelmesini sağlar. 3.30'dan önce (veya ARB_explicit_attrib_location olmadan), bunu glBindAttrbLocation
bağlamadan önce açıkça ayarlamanız veya öznitelik dizini için programı sorgulamanız gerekir glGetAttribLocation
. Açıkça bir öznitelik konumu sağlamazsanız, GLSL keyfi olarak bir konum atayacaktır (yani: uygulama tanımlı bir şekilde).
Gölgelendiricide ayarlamak neredeyse her zaman daha iyi bir seçenektir.
Her durumda, parça gölgelendirici çıktıları neredeyse tamamen aynı şekilde çalışır. Parça gölgelendiricileri , çerçeve arabelleğindeki birden çok arabelleğe eşlenen birden çok çıktı rengine yazabilir . Bu nedenle, hangi çıktının hangi parça çıktı rengine gideceğini belirtmeniz gerekir.
Bu işlem, parça çıktı konumu değeriyle başlar. Köşe gölgelendirici girdi konumlarına çok benzer şekilde ayarlanır:
layout(location = 1) out secColor;
API işlevleri de vardır glBindFragDataLocation
ve glGetFragDataLocation
benzer olan, glBindAttribLocation
ve glGetAttribLocation
.
Herhangi bir açık atama yapmazsanız, uygulamalar genellikle çıkış değişkenlerinizden birini konum 0'a atar. Ancak, OpenGL standardı bu davranışı gerektirmez , bu nedenle ona da bağlı olmamanız gerekir.
Şimdi adil olmak, programınız olmalıdır başarısız Eğer farklı çıkış yerleri alamadım iki çıkışa kullanıldığında bağlantı. Muhtemelen olan şey, derleyicinizin yazmadığınız dosyayı optimize etmesiydi, bu yüzden bağlayıcı hatalarını kontrol etme zamanı geldiğinde bunu unutmuştu.