2012-10-11 26 views
7

Maksimum değerleri doku tamponu içine aktardığımda, render yaparken geometriyi maksimum değerlerle çizer. GlTexBuffer() API'sini kullanırken bu sorunu buldum.texelFetch() kullanarak tekstüre etme

E.g. 255'ten küçük herhangi bir değeri geçtiğimde, doku verilerim GLubyte olduğunu varsayalım, o zaman renk, siyah ve bu renk karışımı yerine 255 ile çizilen renk ile aynıdır.
AMD ve nvidia kartında denedim, ancak sonuçlar aynı. Bana nerede yanlış gidebileceğini söyleyebilir misin?

Benim burada kodunu kopyalayarak ediyorum:

Vert shader:

in vec2 a_position; 
uniform float offset_x; 
void main() 
{ 
    gl_Position = vec4(a_position.x + offset_x, a_position.y, 1.0, 1.0); 
} 

Frag shader:

out vec4 Color; 
uniform isamplerBuffer sampler; 
uniform int index; 
void main() 
{ 
    Color=texelFetch(sampler,index); 

} 

Kodu: Bu durumda

GLubyte arr[]={128,5,250}; 
glGenBuffers(1,&bufferid); 

glBindBuffer(GL_TEXTURE_BUFFER,bufferid); 

glBufferData(GL_TEXTURE_BUFFER,sizeof(arr),arr,GL_STATIC_DRAW); 
glBindBuffer(GL_TEXTURE_BUFFER,0); 

glGenTextures(1, &buffer_texture); 

glBindTexture(GL_TEXTURE_BUFFER, buffer_texture); 
glTexBuffer(GL_TEXTURE_BUFFER, GL_R8, bufferid); 


glUniform1f(glGetUniformLocation(shader_data.psId,"offset_x"),0.0f); 
glUniform1i(glGetUniformLocation(shader_data.psId,"sampler"),0); 
glUniform1i(glGetUniformLocation(shader_data.psId,"index"),0); 

glGenBuffers(1,&bufferid1); 

glBindBuffer(GL_ARRAY_BUFFER,bufferid1); 
glBufferData(GL_ARRAY_BUFFER,sizeof(vertices4),vertices4,GL_STATIC_DRAW); 

attr_vertex = glGetAttribLocation(shader_data.psId, "a_position"); 

glVertexAttribPointer(attr_vertex, 2 , GL_FLOAT, GL_FALSE ,0, 0); 

glEnableVertexAttribArray(attr_vertex); 

glDrawArrays(GL_TRIANGLE_FAN,0,4); 

glUniform1i(glGetUniformLocation(shader_data.psId,"index"),1); 

glVertexAttribPointer(attr_vertex, 2 , GL_FLOAT, GL_FALSE ,0,(void *)(32)); 

glDrawArrays(GL_TRIANGLE_FAN,0,4); 

glUniform1i(glGetUniformLocation(shader_data.psId,"index"),2); 

glVertexAttribPointer(attr_vertex, 2 , GL_FLOAT, GL_FALSE ,0,(void *)(64)); 

glDrawArrays(GL_TRIANGLE_FAN,0,4); 

hepsi çizer koyu kırmızı col ile 3 kareler veya.

cevap

2
uniform isamplerBuffer sampler; 
glTexBuffer(GL_TEXTURE_BUFFER, GL_R8, bufferid); 

Sorununuz var: eşleşmiyorlar.

Dokümanın depolamasını, okunurken yüzer numarasına normalize edilmiş işaretsiz 8 bitlik tam sayı olarak oluşturdunuz. Ancak, shader'a, imzalı 8 bitlik bir tam sayı verdiğinizi ve tam sayı olarak okunacağını söylediniz.

OpenGL'i tutarsız olarak karıştırdınız. Doku formatlarıyla eşleşmeyen örnekleyici türleri, tanımlanmamış davranışlar verir.

Bu, isamplerBuffer değil, samplerBuffer olmalıdır.

+0

Çok teşekkür ederim .. !! Şimdi, problem şu ki, samplerBuffer tarafından isamplerBuffer'ı değiştirdiğimde, GL_R8, GL_R16, GL_R16F, GL_R32F için doğru çıktı verir, ancak diğer dahili formatlar için http://www.opengl.org/sdk/docs/man3/xhtml /glTexBuffer.xml. Tüm iç formatlar için doğru o/p nasıl elde edilebileceğini bana söyleyebilir misiniz ..? Aslında glsl hakkında çok fazla bilgim yok .. Lütfen bana yardım edin .. – debonair

+0

@ user1737197: Stack Overflow bir web-forum değil. Burada yeni bir sorunuz varsa, sormak için "Soru Sor" düğmesini kullanın. Ya da sadece [OpenGL Wiki'ye gidin ve orada okuyun] (http://www.opengl.org/wiki/GLSL_Sampler). –

+0

Üzgünüz, yeni bir soru yönettim. – debonair

İlgili konular