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 compatibilityen ü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 glVertexAttribPointerve glEnableVertexAttribArraybenzeri 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, colorköşe gölgelendiricisi girdisinin öznitelik konumu 2'den gelmesini sağlar. 3.30'dan önce (veya ARB_explicit_attrib_location olmadan), bunu glBindAttrbLocationbağ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 glBindFragDataLocationve glGetFragDataLocationbenzer olan, glBindAttribLocationve 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.