2012-10-11 65 views
7

當我將非最大值傳遞到紋理緩衝區時,渲染時繪製幾何圖形的顏色爲最大值。我在使用glTexBuffer()API時發現了這個問題。使用texelFetch進行紋理編輯()

E.g.假設我的紋理數據是GLubyte,當我傳遞小於255的任何值時,那麼顏色與用255繪製的顏色相同,而不是黑色和那種顏色的混合。
我試過AMD和nvidia顯卡,但結果是一樣的。 你能告訴我哪裏可能出錯嗎?

我在這裏複製我的代碼:

韋爾着色器:

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

破片着色器:

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

} 

代碼:

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

在這種情況下,它把一切與暗紅色col的3個正方形要麼。

回答

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

這是你的問題:他們不匹配。

您創建了紋理的存儲爲無符號8位整數,這些整數在讀取時標準化爲浮點數。但你告訴着色器,你給它簽署 8位整數將被讀作整數,而不是浮動。

由於不一致,您會混淆OpenGL。使用紋理格式不匹配採樣器類型會產生未定義的行爲。

這應該是samplerBuffer,而不是isamplerBuffer

+0

非常感謝你.. !! 現在,問題是,當我通過samplerBuffer替換isamplerBuffer時,它給出了GL_R8,GL_R16,GL_R16F,GL_R32F的正確輸出,但對於http://www.opengl.org/sdk/docs/man3/xhtml上給出的其他內部格式/glTexBuffer.xml。 你能告訴我如何實現所有內部格式正確的o/p ..? 其實我沒有太多有關glsl的知識..請幫助我.. – debonair

+0

@ user1737197:堆棧溢出不是一個網絡論壇。在這裏,如果您有新問題,請使用「提問」按鈕來提問。或者你可以[去OpenGL Wiki並在那裏閱讀](http://www.opengl.org/wiki/GLSL_Sampler)。 –

+0

對不起,我已經創建了新的問題。 – debonair