2016-07-25 4 views
1

Ich baue ein Shader-Programm, um eine einfache Bitmap-Schriftart in GLSL zu rendern.Inhalt von uniform int [8] Bereich immer Null?

Meine Programmierumgebung ist C#, also verwende ich OpenTK, um OpenGL 4.0 zu kapseln, aber die Syntax ist sehr ähnlich zu allen Beispielen in C und C++.

Mein Problem ist, dass ich versuche, ein Array von Ganzzahlen an den Fragment-Shader zu übergeben, aber wenn ich das tue, sind alle Array-Elemente am Ende Null. Die Ganzzahlen sollten zwischen 0 und 255 liegen und ich habe die Werte vor und nach dem Senden überprüft. Es ist ärgerlich.

Derzeit mein Programm ich verbindlich, dann die int [] Array an den Shader mithilfe der folgenden Anweisungen versuchen, senden:

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

Mein Fragment und ein paar Funktionen verwendet, um zu bestimmen, welcher Teil des Quads, welche Charaktere platzieren. Ich habe diese Funktionen mit statischen Zahlen und Arrays getestet, die ich manuell im Shader erstellt habe und sie funktionieren genau so, wie ich es von ihnen erwarte. Aus irgendeinem Grund ist die Syntax oben einfach nicht tatsächlich alle Daten am Ende zu senden - alle Elemente bewerten auf 0

In meinem Shader wird das Array bezeichnet und wie folgt verwendet:

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

Der Rest Mein Code scheint zu funktionieren, wenn er isoliert getestet wird - er fällt nur auseinander, wenn er zusammenkommt, und die obigen Codeblöcke sind, wo er zusammenkommt. Habe ich irgendeinen albernen Anfängerfehler gemacht, oder ist da noch etwas verrückteres passiert? Jede Hilfe sehr geschätzt.

Antwort

2

Sie haben die falsche Version von glUniform*() mit Was Sie zum Senden eines 1D-Array von ints verwenden möchten ist glUniform1iv().

Beachten Sie, wie die i ist für Int, f für Float. Die Zahl repräsentiert die Anzahl der Elemente. Jetzt für Arrays Suffix v und Zahl stellt die Dimensionen.

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

Hier ist ein Link zu Referenz https://www.opengl.org/sdk/docs/man/docbook4/xhtml/glUniform.xml

+0

Leider ist dies nicht. Uniform1iv existiert nicht in OpenTK - es ist in GL.Uniform1 in einer Methodenüberladung gebündelt. http://i.imgur.com/GFIk6OD.png – user2312610

+0

Ja, Sie haben Recht, OpenTK bündelt sie zu 'Uniform1()'. @ user2312610 können Sie überprüfen, ob Ihre ArrayLocation korrekt ist? Verwenden Sie 'arrayLocation = GL.GetUniformLocation (programLocation, String (" characters "));' Inkorrekte 'arrayLocation' könnte der Grund sein, dass Ihre Werte nicht an den Shader übergeben werden. – Harish

+0

Meine Uniform-Adressen für den Shader, den ich verwende, erscheinen wie folgt. http://i.imgur.com/dXC96lP.png wobei "Zeichen" das int-Array ist, das ich zuweisen möchte, und die anderen Attribute und Uniformen sind. Nach meinem Wissen sollte das in Ordnung sein - keiner von ihnen scheint -1 zu sein, also nehme ich an, dass sie zumindest existieren. Danke, dass du dir die Zeit genommen hast. – user2312610