2012-10-11 4 views
7

Wenn ich nicht-Max-Werte in Textur-Puffer übergeben, zeichnet es beim Rendern Geometrie mit Farben bei maximalen Werten. Ich habe dieses Problem bei der Verwendung der glTexBuffer() API gefunden.Texturierung mit TexelFetch()

z. Nehmen wir an, meine Texturdaten sind GLubyte, wenn ich einen Wert kleiner als 255 übergebe, dann ist die Farbe dieselbe wie die mit 255 gezeichnet, anstelle einer Mischung aus Schwarz und dieser Farbe.
Ich habe versucht, AMD und Nvidia-Karte, aber die Ergebnisse sind gleich. Können Sie mir sagen, wo es schief gehen könnte?

Ich kopiere meinen Code hier:

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); 

} 

Code:

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); 

In diesem Fall zieht sie alle die 3 Quadrate mit dunkelrotem Col oder.

Antwort

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

Es gibt Ihr Problem: Sie stimmen nicht überein.

Sie haben den Speicher der Textur als vorzeichenlose 8-Bit-Integer erstellt, die beim Lesen auf Floats normalisiert werden. Aber Sie haben dem Shader gesagt, dass Sie ihm signiert haben 8-Bit-Ganzzahlen, die als ganze Zahlen gelesen werden, nicht schwebt.

Sie haben OpenGL durch Inkonsistenzen verwirrt. Nicht übereinstimmende Sampler-Typen mit Texturformaten führen zu undefiniertem Verhalten.

Das sollte ein samplerBuffer sein, kein isamplerBuffer.

+0

Vielen Dank .. !! Nun, das Problem ist, dass, wenn ich isamplerBuffer durch samplerBuffer ersetzen dann gibt es richtige Ausgabe für GL_R8, GL_R16, GL_R16F, GL_R32F aber für andere interne Formate auf http://www.opengl.org/sdk/docs/man3/xhtml gegeben /glTexBuffer.xml. können Sie mir sagen, wie kann das richtige O/P für alle internen Formate erreichen ..? Eigentlich habe ich nicht viel Wissen über GLSL .. Bitte helfen Sie mir .. – debonair

+0

@ user1737197: Stack Overflow ist kein Web-Forum. Wenn Sie eine neue Frage haben, verwenden Sie die Schaltfläche "Frage stellen", um sie zu stellen. Oder du könntest einfach [ins OpenGL Wiki gehen und dort darüber lesen] (http://www.opengl.org/wiki/GLSL_Sampler). –

+0

Entschuldigung, ich habe eine neue Frage erstellt. – debonair