2016-07-25 25 views
1

我正在構建一個着色器程序來渲染GLSL中的一個簡單的位圖字體。統一int [8]區域的內容始終爲零?

我的編程環境是C#,所以我使用OpenTK來封裝OpenGL 4.0,但其語法與C和C++中的任何示例非常相似。

我的問題是,我試圖將一個整數數組傳遞給片段着色器,但每當我這樣做時,所有數組元素都會變爲零。整數應該在0到255之間,我在發送前後檢查了這些值。真氣。

目前我結合我的程序,然後嘗試使用下面的說明發送INT []數組着色器:

int[] ints = new int[] { 33, 34, 35, 36, 37, 38, 39, 40 }; 
GL.UseProgram(programLocation); 
GL.Uniform1(arrayLocation, ints.Length, ints); 

我的片段着色器取數組,並使用一對夫婦的功能,以確定四角的哪一部分放置哪些字符。我用靜態數字和陣列測試了這些函數,我在着色器中手動構建了它們,並且它們的工作方式與我所期望的相同。出於某種原因,上述簡單地將語法不實際上最終發送任何數據 - 所有元素評價爲0。

以我着色器,該陣列表示,並且像這樣使用:

uniform int characters[8]; 
.... 
gl_FragColor = texture2D(bitmapFontTex, GetBitmapFontStart(characters[0...8etc])); 

的其餘部分我的代碼在隔離測試時似乎可以工作 - 它只有在它們結合在一起時纔會分崩離析,上面的代碼塊就是它們合在一起的地方。我做了一些愚蠢的菜鳥錯誤,還是有更棘手的事情發生?任何幫助不勝感激。

回答

2

您正在使用錯誤的版本glUniform*() 你想用來發送一維數組的整數是glUniform1iv()

請注意i是如何用於int的,f用於float。數字表示元素的數量。 現在爲數組後綴v和數字代表尺寸。

GL.Uniform1iv(arrayLocation, ints.Length, ints); 

這裏是參考 https://www.opengl.org/sdk/docs/man/docbook4/xhtml/glUniform.xml

+0

鏈接不幸的是,這不是它。 Uniform1iv在OpenTK中不存在 - 它在方法重載中綁定到GL.Uniform1中。 http://i.imgur.com/GFIk6OD.png – user2312610

+0

是的,你說的沒錯,OpenTK會將它們綁定到'Uniform1()'。 @ user2312610你可以檢查你的arrayLocation是否正確?你使用'arrayLocation = GL.GetUniformLocation(programLocation,String(「characters」));''arrayLocation'不正確可能是你的值沒有被傳遞給着色器的原因。 – Harish

+0

我使用的着色器的統一地址如下所示。 http://i.imgur.com/dXC96lP.png 其中'characters'是我想要分配給的int數組,其他'屬性'和'制服'一樣。據我所知,這應該沒問題 - 它們都不是-1,所以我認爲它們至少存在。 感謝您抽出時間。 – user2312610