2016-07-25 10 views
1

私はGLSLでシンプルなビットマップフォントをレンダリングするシェーダープログラムを構築しています。uniform 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); 

は私のフラグメントシェーダは、配列を受け取り、決定するための機能のカップルを使用していますクワッドのどの部分をどの文字に置きますか。私はこれらの関数を静的な数値と配列でテストしました。シェーダで手動で構築した配列は、私が期待したとおりに動作します。の

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

残り: - 単に上記の構文は、実際にデータを送信するまで終わらない何らかの理由で、すべての要素が私のシェーダーは0

に、配列が示され、このように使用評価します私のコードは孤立してテストされたときに動作するように見えます - それが一緒になるとばらばらになり、上記のコードブロックは一緒に来ます。私はいくつかの馬鹿なルーキーミスをしたことがありますか?どんな助けでも大歓迎です。

答えて

2

間違ったバージョンのglUniform*()を使用しています 1Dの整数の配列を送信するために使用するものはglUniform1iv()です。

floatの場合はiがintの場合、fは注意してください。数字は要素の数を表します。 配列サフィックス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

関連する問題