ile çizilen çizgiler için bir gölgelendiriciyi nasıl kullanırım? OpenGL ES 2.0 kullanan bir Android uygulamasına sahibim. Her biri bir başlangıç noktası ve bir bitiş noktası ile tanımlanan bir diziden 10 satır çizmem gerekiyor. Yani 10 satır = 20 puan = 60 yüzer değer var. Noktaların hiçbiri birbirine bağlı değildir, böylece dizideki her bir nokta diğerleriyle ilgisizdir, dolayısıyla GL_LINES ile çiziyorum. (20GL_LINES ve OpenGL ES 2.0
public void drawLines(FloatBuffer vertexBuffer, float lineWidth,
int numPoints, float colour[]) {
GLES20.glLineWidth(lineWidth);
drawShape(vertexBuffer, GLES20.GL_LINES, numPoints, colour);
}
protected void drawShape(FloatBuffer vertexBuffer, int drawType,
int numPoints, float colour[]) {
// ... set shader ...
GLES20.glDrawArrays(drawType, 0, numPoints);
}
drawLines şamandıra tamponu (60 mantarlar), bir çizgi genişliğine, nokta sayısını alır:
bir şamandıra arabelleğe değerleri koyarak ve bu gibi bazı yardımcı kodu çağırarak çizerken) ve 4 float renk değeri dizisi. Gölgelendirici ayar kodunu göstermedim, ancak temelde renk değişkenini tek tip uColour değerine maruz bırakıyor.
uColour'u uyacak parça gölgelendiricisi, doğrudan çıkışa takar.
/* Fragment */
precision mediump float;
uniform vec4 uColour;
uniform float uTime;
void main() {
gl_FragColor = uColour;
}
tepe tarayıcı:
uniform mat4 uMVPMatrix;
attribute vec4 vPosition;
void main() {
gl_Position = uMVPMatrix * vPosition;
}
Ama şimdi farklı bir şey yapmak istiyorum. Arabamdaki her satırın farklı bir renge sahip olmasını istiyorum. Renkler, dizideki satırın konumunun bir işlevidir. Başlangıç çizgisini beyaza, son koyu griyi ve iki arasındaki geçişin arasını gölgelemek istiyorum. #ffffff, #eeeeee, #dddddd vb.
Açıkçası, her satırı tek tek yeni bir değeri uColour'a her seferinde taklit edebilirim ama bu verimsiz. Bir keresinde arayacağımı ve her seferinde gölgelendiricideki değeri değiştirdiğimde, GL'yi 10 kez aramak istemiyorum.
Belki de köşe gölgelendiricide uVertexCount adında tekdüze bir değer bildirebilir miyim? Çekmeden önce uVertexCount öğesini 0 olarak ayarlıyorum ve her defasında vertex shader denir ve bu değeri artırırım. Parça gölgelendirici, uVertexCount'a bakarak satır dizinini belirleyebilir. Daha sonra, bazı başlangıç ve bitiş değerleri veya diğer bazı araçlar arasındaki renk için bir değer arayabilir. Ancak bu, her satırın veya noktanın bir ilkel olarak mı yoksa tüm satır dizisinin tek bir ilkel mi olduğuyla bağlantılıdır.
Bu uygulanabilir mi? Köşe gölgelendirici başına köşe gölgelendiricinin kaç kez çağrıldığını bilmiyorum. Çağrılar, canlılık, örneğin köşe 0, köşe 1, x * bölüm, köşe 2, köşe 3, x * parçası vb. Gibi bir şekilde aralanmış mı?
Bazıları kavramı gösterebilir veya benzer bir şey yapmanın başka bir yolunu işaret edebilir mi?
Neden bir özellik olarak renk kullanmak? VertexBuffer'ınıza renk bilgilerini ekleyin. – pearcoding
Bunu bir öznitelik olarak ekleyebilirim ancak kullanmam gereken öznitelikten hangi renk olduğunu öğrenmek için parça gölgelendiricisindeki nokta/çizgi dizinini bilmem gerekiyor. Yani, bir öznitelik olarak 10 renkten oluşan bir diziyi geçtiysem, parça gölgelendiricim, bu 10'un hangisini kullanması gerektiğini nasıl biliyor? – locka
no otomatik olarak bitti ...Tek tip bir diziniz varsa, bir özniteliğiniz olduğunda dizine ihtiyacınız var. Bir özellik sadece bir köşeye bağlanır. Böylece, köşenizin her birinin bir konumu ve bir rengi vardır. – pearcoding