2009-12-27 19 views
6

Ben OpenGL için oldukça yeni ve bazı zorluklarla karşılaşıyor gibi görünüyor. GLSL'de basit bir gölgelendirici yazdım, bu da basit bir iskelet animasyonu sağlayan ortak matrisler vererek köşeleri dönüştürmesi gerekiyordu. Her köşe, bir dizi dönüşüm matrisiyle ilişkili olan ve gölgelendiricimde "Öznitelik değişkenleri" olarak belirtilen maksimum iki kemik etkisine (bir Vec2'nin x ve y bileşenleri olarak saklanır), indislere ve karşılık gelen ağırlıklara sahiptir. "glVertexAttribPointer" işlevini kullanarak.Cocoa ve OpenGL, Diziyi kullanarak GLSL vertex özniteliğini nasıl ayarlayabilirim?

Sorun nerede ortaya çıkıyor ... "Tekdüzen Değişken" dizisini düzgün bir şekilde ayarlamayı başardım, bu değerleri gölgelendiricide kontrol ettiğimde, hepsi doğru şekilde içe aktarılıyor ve doğru verileri içeriyor. Ancak, ortak Endeksler değişkenini belirlemeye çalıştığımda, köşe noktaları keyfi dönüşüm matrisleriyle çarpılır! Uzayda (her seferinde farklı olan) rastgele pozisyonlara atlarlar, bu yüzden indekslerin yanlış ayarlandığını ve gölgelendiricimin eklem matris dizilimimin sonunu aşağıdaki anıya akıttığını varsayıyorum. Tam olarak neden emin değilim, çünkü konuyla ilgili bulabildiğim tüm bilgileri okuduktan sonra, örneklerinde aynı (eğer çok da benzemiyorsa) kodu görmeye şaşırdım ve onlar için işe yaramış gibiydi.

Şu an bu problemi çözmek için çok uğraştım ve gerçekten sinirlerime girmeye başlıyor ... Matrislerin doğru olduğunu ve gölgelendiricide indeks değerini manuel olarak değiştirdiğimi biliyorum tamsayı, doğru matris değerlerini okur ve gereken şekilde çalışır, tüm matrisleri o matrisle değiştirir, ama kodları kullanmaya çalıştığımda öznitelik değişkenlerini ayarlamak için yazdığımda işe yaramaz.

ben şöyle değişkenleri olduğunu belirlemek için kullanıyorum kodu ...

// this shader is supposed to transform the bones by a skeleton, a maximum of two 
// bones per vertex with varying weights... 

uniform mat4 boneMatrices[32]; // matrices for the bones 
attribute vec2 boneIndices; // x for the first bone, y for the second 

//attribute vec2 boneWeight; // the blend weights between the two bones 

void main(void) 
{ 
gl_TexCoord[0] = gl_MultiTexCoord0; // just set up the texture coordinates... 


vec4 vertexPos1 = 1.0 * boneMatrices[ int(boneIndex.x) ] * gl_Vertex; 
//vec4 vertexPos2 = 0.5 * boneMatrices[ int(boneIndex.y) ] * gl_Vertex; 

gl_Position = gl_ModelViewProjectionMatrix * (vertexPos1); 
} 

Bu

beni gerçekten boşa başlıyor
// this works properly... 
GLuint boneMatLoc = glGetUniformLocation([[[obj material] shader] programID], "boneMatrices"); 
glUniformMatrix4fv(boneMatLoc, matCount, GL_TRUE, currentBoneMatrices); 

GLfloat testBoneIndices[8] = {1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0}; 

// this however, does not... 
GLuint boneIndexLoc = glGetAttribLocation([[[obj material] shader] programID], "boneIndices"); 
glEnableVertexAttribArray(boneIndexLoc); 
glVertexAttribPointer(boneIndexLoc, 2, GL_FLOAT, GL_FALSE, 0, testBoneIndices); 

Ve tepe tarayıcı şöyle ... ve her türlü yardım,

-Andrew Gotow

cevap

2

Tamam takdir edilecektir, ben fig ettik Kırmızı OpenGL, her 9 değeri bir üçgen olarak (her biri 3 bileşenli 3 köşe) okuyarak drawArrays fonksiyonu ile üçgenler çizer. Bu nedenle, köşeler üçgenler arasında tekrarlanır, böylece iki bitişik üçgen bir köşe paylaşırsa, dizide iki kez ortaya çıkar. Bu yüzden aslında 8 köşesi olduğunu düşündüğüm küpüm aslında 36'ya sahip! Altı taraf, iki üçgen bir yan, üç köşe başına üç köşe, hepsi 8 paylaşımlı yerine toplam 36 bağımsız köşeye çıkar.

Sorunun tamamı çok az değer belirtilmesiyle ilgili bir sorundu. Test dizimi 36 değerleri içerecek şekilde genişletir bitirmez mükemmel bir şekilde çalıştı.