2016-09-01 65 views
0

我目前正在使用的片段着色器有一些非常奇怪的行爲,這使得我很瘋狂。我有一個我正在渲染的幀緩衝區對象。Xamarin OpenGL片段着色器使用制服工作時出現奇怪的行爲

vec4 texelFetch(sampler2D tex, ivec2 size, ivec2 coord) 
{ 
    vec2 texCoord= vec2((2.0*float(coord.x) + 1.0)/(2.0*float(size.x)), (2.0*float(coord.y) + 1.0)/(2.0*float(size.y))); 
    return texture2D(tex, texCoord); 
} 

這意味着我還需要了解大小:在片段着色器我也是從相同的紋理用我自己寫的「texelFetch」(因爲我使用OpenGL ES,其默認情況下不執行)閱讀當我調用此函數時渲染的紋理。紋理的大小爲1440×900,其由一個統一的着色器我代表:

uniform vec2 screenImageSize; 

我把我的程序該值,如下所示:

if (imageProgram != null) 
      imageProgram.Use(); 

screenImageSizeUniform = imageProgram.GetUniformIndex("screenImageSize"); 
GL.Uniform2(screenImageSizeUniform, 1440.0f, 900.0f); 


// Draw triangles that represents frame buffer rectangle 
GL.DrawArrays(BeginMode.Triangles, 0, 6); 

奇怪的是,我不當我使用這套制服時會收到正確的輸出。但是,當硬編碼值時,我確實收到了正確的輸出。另外,如果我執行檢查,看看有什麼值,我看到均勻設置正確:

//Following line does not give me the correct result as it seems to shift pixel values 
//ivec2 test=ivec2(int(screenImageSize.x),int(screenImageSize.y)); 

//Following line does give me the correct result 
ivec2 test=ivec2(1440,900); 

if(test.x==1440 && test.y==900) 
    gl_FragColor=texelFetch(previousFullImage,test,ivec2(gl_FragCoord.x,gl_FragCoord.y)); 
else 
    gl_FragColor=vec4(1.0,0.0,0.0,1.0); 

有人能看到我在做什麼錯?任何幫助是極大的讚賞

Different rendered images

注:中央圖像稍微旋轉但那是因爲我誤將截圖。

+0

什麼是「正確結果」,什麼是「錯誤結果」?你正在從浮動轉換爲int很多,這取決於默認的精度,這可能會「抵消」東西 –

+0

感謝您的回覆!我在文章中包含了這些圖片,並使得較低的代碼塊更加清晰。 據我所見,這不是由於轉換。我只做了一次轉換,我嘗試過: - 對所有值使用highp - 將屬性更改爲GL.Uniform2(screenImageSizeUniform,1440.5f,900.5f);' 兩者似乎都沒有效果 –

+0

你是否讀寫相同的紋理? – solidpixel

回答

0

根據@ Isogen74提供的信息,我得出結論,它確實可能是GPU堆棧某處的錯誤。因此,我決定尋找解決方法並更新到opengl es 3.0。已經在那裏實現了texelFetch,而不需要紋理的尺寸。現在它就像一個魅力!感謝所有的幫助=)!它真的很感激!

相關問題