2012-05-23 20 views
5

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?

+0

Neden bir özellik olarak renk kullanmak? VertexBuffer'ınıza renk bilgilerini ekleyin. – pearcoding

+0

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

+0

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

cevap

6

Renk Bilgilerini Vertexbuffer'ınıza (Floatbuffer) ekleyin ve niteliği gölgelendiricinizde kullanın.

Örnek vertexbuffer:

uniform mat4 uMVPMatrix; 

attribute vec4 vPosition; 
attribute vec3 vColor; 

varying vec3 color; 

void main() { 
    gl_Position = uMVPMatrix * vPosition; 
    color = vColor; 
} 

Örnek fragmentshader:

precision mediump float; 

varying vec3 color; 

void main() { 
    gl_FragColor = color; 
} 
+0

glDrawArray yerine glDrawElements kullanıyorum, vColor'u vektör gölgelendiriciye doğru itmek için bir yol mu var? Renk enterpolasyonlu mu, yoksa bundan bir şey mi yoksa değişen değerin değişmediğinden emin olmak için aynı rengi başlangıç ​​/ bitiş noktasına mı vermeliyim? Buna nasıl devam ettiğimi görmek için bu gece bir deneyeyim. – locka

+2

Sanırım şimdi anladım. GlVertexAttribPointer/glEnableVertexAttribArray öğesini renkler için bir dizi floraya bağlamak zorundayım. Muhtemelen çizginin her iki ucundaki renkleri ikiye katlamak zorundayım, ama bu yeterince basit olmalı. Bununla bir yere vardığımda bir güncelleme göndereceğim. – locka

+0

+1 Evet bu doğru yol: D – pearcoding