2011-07-22 21 views
5

OpenGL ile kendi gölgelendiricimi yazıyorum ve bu gölgelendiricinin neden derlenmeyeceğine şaşırdım. Başka birinin ona bakabilir mi? Bir tepe olarak geçiyorum neNeden bu GLSL Vertex Shader derlenmiyor?

bu biçimde 2 yüzer (bayt olarak ayrılmış) 'dir:

Float 1: 

Byte 1: Position X 
Byte 2: Position Y 
Byte 3: Position Z 
Byte 4: Texture Coordinate X 


Float 2: 

Byte 1: Color R 
Byte 2: Color G 
Byte 3: Color B 
Byte 4: Texture Coordinate Y 

Ve bu benim gölgelendirici geçerli:

in vec2 Data; 
varying vec3 Color; 
varying vec2 TextureCoords; 

uniform mat4 projection_mat; 
uniform mat4 view_mat; 
uniform mat4 world_mat; 

void main() 
{ 
    vec4 dataPosition = UnpackValues(Data.x); 
    vec4 dataColor = UnpackValues(Data.y); 

    vec4 position = dataPosition * vec4(1.0, 1.0, 1.0, 0.0); 
    Color = dataColor.xyz; 

    TextureCoords = vec2(dataPosition.w, dataColor.w) 

    gl_Position = projection_mat * view_mat * world_mat * position; 
} 

vec4 UnpackValues(float value) 
{ 
    return vec4(value % 255, (value >> 8) % 255, (value >> 16) % 255, value >> 24); 
} 

Daha lazım olursa bilgi, uymaktan mutluluk duyarım.

+0

Lütfen kopya mesajını yapıştırın. – tibur

+0

Hata mesajını nasıl alırım? GlGetProgramInfoLog çağırdığımda bir tane alıyorum, ancak bu sadece "Vertex shader (ler) glLinkProgram() çağrılmadan önce başarıyla derlenemedi. Bağlantı başarısız oldu." – Azzi777

+3

@ Azzi777: glCompileShader başarısız olduğunda çalışan glGetShaderInfoLog var. _always_ shader nesnelerinin ve program nesnelerini derleme durumunu kontrol etmelisiniz. –

cevap

10

bildirmeden önce UnpackValuesbildirmeniz gerekir. GLSL, C ve C++ gibidir; Adlar kullanılmadan önce bir beyanname olmalıdır.


BTW: Eğer yapmaya çalıştığını ne çalışmaz. Şamandıralar yüzüyor; GLSL 4.00 ile çalışmadığınız sürece (ve "değişken" gibi eski terimleri kullanmaya devam ettiğiniz için, sanırım), bir floattan bitleri çıkaramazsınız. Gerçekten de, sağ-shift operatörü sadece tamsayılar için tanımlanmıştır; floatlarda kullanmayı denemek bir derleyici hatasıyla başarısız olur. GLSL C veya C++ değildir (ironik olarak).

Verilerinizi paketlemek isterseniz, sizin için paketlemek üzere OpenGL kullanın. normalize işaretsiz bayt içeren iki vec4 özelliklerini Gönder:

glVertexAttribPointer(X, 4, GL_UNSIGNED_BYTE, GL_TRUE, 8, *); 
glVertexAttribPointer(Y, 4, GL_UNSIGNED_BYTE, GL_TRUE, 8, * + 4); 

Kişisel tepe tarayıcı girdi olarak iki vec4 değerlerini alacaktı. GlVertexAttrib I İşaretçi kullanmıyor olduğunuzdan, OpenGL, şamandıra olarak yorumlanacak değerleri geçtiğinizi bilir.

+0

Yardımlarınız için teşekkür ederiz, gölgelendirici şimdi derliyor. Ancak glGetVertexAttribute ile bazı sorunlar yaşıyorum. Hangi sırayla arayacağımı açıklayabilir miyim, glGenBuffer, glBindBuffer (glSetData'yı çağırmalı mıyım?) Ve vertex verilerini gerçekte gölgelendiriciye aktarmak için başka neye ihtiyacım var? Şimdiden teşekkürler – Azzi777

+0

@ Azzi777: Gösterdiğiniz işlevlerin çoğu ('glGetVertexAttribute', glSetData') mevcut değil. Orijinal sorunuz cevaplanmış gibi görünüyor. Vertex verilerinin nasıl gönderileceğiyle ilgili bir sorunuz varsa, bunu yeni bir soru olarak sormalısınız. –