2012-10-11 15 views
7

Khi tôi chuyển giá trị không lớn nhất vào bộ đệm kết cấu, trong khi hiển thị nó vẽ hình học với màu sắc ở giá trị lớn nhất. Tôi đã tìm thấy vấn đề này trong khi sử dụng API glTexBuffer().texturing bằng cách sử dụng texelFetch()

Ví dụ: Giả sử dữ liệu kết cấu của tôi là GLubyte, khi tôi chuyển bất kỳ giá trị nào nhỏ hơn 255, thì màu sắc giống như màu vẽ 255, thay vì kết hợp màu đen và màu đó.
Tôi đã thử trên thẻ AMD và nvidia, nhưng kết quả cũng giống nhau. Bạn có thể cho tôi biết nơi nào có thể xảy ra không?

Tôi sao chép mã của tôi ở đây:

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

Trong trường hợp này nó lôi kéo mọi 3 ô vuông có màu đỏ đậm hoặc là.

Trả lời

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

Có vấn đề của bạn: chúng không khớp.

Bạn đã tạo bộ nhớ của kết cấu là số nguyên 8 bit không dấu, được chuẩn hóa thành float khi đọc. Nhưng bạn đã nói với trình đổ bóng rằng bạn đã cho nó đã ký các số nguyên 8 bit sẽ được đọc là số nguyên, không phải là nổi.

Bạn đã nhầm lẫn OpenGL do không nhất quán. Các kiểu lấy mẫu không khớp với định dạng kết cấu mang lại hành vi không xác định.

Đó phải là samplerBuffer, không phải là isamplerBuffer.

+0

Cảm ơn bạn rất nhiều .. !! Bây giờ, vấn đề là khi tôi thay thế isamplerBuffer bởi samplerBuffer sau đó nó cho đầu ra chính xác cho GL_R8, GL_R16, GL_R16F, GL_R32F nhưng đối với các định dạng nội bộ khác được đưa ra trên http://www.opengl.org/sdk/docs/man3/xhtml /glTexBuffer.xml. bạn có thể cho tôi biết làm thế nào có thể đạt được đúng o/p cho tất cả các định dạng nội bộ ..? Thực ra tôi không có nhiều kiến ​​thức về glsl .. Hãy giúp tôi với điều đó .. – debonair

+0

@ user1737197: Stack Overflow không phải là một diễn đàn trên web. Ở đây, nếu bạn có câu hỏi mới, hãy sử dụng nút "Đặt câu hỏi" để hỏi. Hoặc bạn có thể chỉ cần [đi đến OpenGL Wiki và đọc về nó ở đó] (http://www.opengl.org/wiki/GLSL_Sampler). –

+0

xin lỗi về điều đó, tôi đã tạo câu hỏi mới. – debonair

Các vấn đề liên quan