Kann nicht integer-vertex-Parametern arbeiten in GLSL 1.5

Ich bin mit einer OpenGL 3.2 Zusammenhang mit GLSL 1.5 und für einige Grund-integer-Attribute (Datentyp "int", "uint", ivecX, oder uvecX) immer Lesen als " 0 " in die vertex-shader. Ich bin deklarieren mit:

in int name;

und ich bin die Bindung der Attribute mit glVertexAttribIPointer (man beachte das I), und nicht glVertexAttribPointer (aber das funktioniert auch nicht). Wenn ich Sie schwebt stattdessen arbeiten Sie völlig in Ordnung - der nur code, der Unterschied besteht in der Art in der vertex-Struktur, die Art, in GLSL, und die IPointer Funktion aufrufen, statt einfach nur Zeiger. Ich bin nicht immer irgendwelche Fehler oder etwas, Sie sind einfach alle 0. Wenn ich hart code integer-Werte anstelle, es funktioniert gut, und ganze Uniformen funktionieren. Auch, gebaut in Ganzzahlen wie gl_VertexID einwandfrei, nur benutzerdefinierte nicht. Ich bin mit einer ATI Mobility Radeon HD 5870. Ich habe versucht, auf einem anderen computer mit einer anderen GPU (leider bin ich mir nicht sicher was GPU zwar nicht, aber es war anders als meins) mit dem gleichen Ergebnis. Irgendwelche Ideen, warum dies der Fall ist? Danke.

EDIT: Eigentlich sieht es aus wie Sie nicht 0, wahrscheinlicher, Sie sind zufällige große initialisierten Werte... es ist schwer zu sagen, da ich finde keine Möglichkeiten zum Debuggen von GLSL-Shadern. Trotzdem, ein paar mehr Infos. Hier ist meine vertex Struktur:

struct TileVertex {
    float pos[2];
    float uv[2];
    float width;
    float pad;
    int animFrames;
    int animFrameLength;
};

animFrames und animFrameLength sind die beiden integer-Werte, die ich versuche zu senden, um die shader. Mein Aufruf glVertexAttribIPointer für animFrames ist folgende:

glVertexAttribIPointer( attribute.location, attribute.typeSize, attribute.baseType, (GLsizei)stride, bufferOffset( bufOffset + attribOffset ) );

wo:

attribute.location = 1 (as determined by OpenGL)
attribute.typeSize = 1 (since it's a single int, not a vector)
attribute.baseType = 5124, which is GL_INT
stride = 32, which is sizeof( TileVertex )
bufferOffset() converts to a void pointer relative to NULL
bufOffset = 0 (my vertices start at the beginning of the VBO), and
attribOffset = 24, which is the offset of animFrames in the TileVertex struct

EDIT: Danke für die Hilfe so weit Jungs. Also habe ich versucht, mit Hilfe von transform feedback und die Dinge machen jetzt mehr Sinn. Wenn ich die int attrib der Wert 1, in der shader ist es:

1065353216 = 0x3F800000 = 1.0 in floating point

Wenn ich es auf 10, in der shader, den ich bekommen:

1092616192 = 0x41200000 = 10.0 in floating point

So scheint es, dass die int attrib konvertiert wird, zu schwimmen, dann diese bits werden interpretiert als int in der shader, obwohl ich die Angabe GL_INT und mit IPointer statt Zeiger! Wie ich es verstehe, IPointer soll, lassen Sie einfach die Daten in integer-form und nicht konvertieren, um ein float.

EDIT:

Hier sind einige weitere tests. Für jeden test bin ich versucht, übergeben Sie den ganzzahligen Wert 1, um einen integer-Eingabe im shader:

glVertexAttribIPointer with GL_INT: shader values are 0x3F800000, which is 1.0 in floating point

scheint anzudeuten, dass die ganze Zahl 1 konvertiert wird, um Gleitkomma-1.0, dann interpretiert als ganze Zahl. Dies bedeutet, dass OpenGL entweder denkt, dass die Quelle die Daten im floating-point-form (wenn es sich tatsächlich in integer-form), oder Sie denkt, dass die shader-Eingaben sind floating point (wenn Sie überhaupt int-Werte).

glVertexAttribIPointer with GL_FLOAT: shader values are valid but weird floating point values, such as 0.0, 1.0, 4.0, 36.0... what the hell!?

keine Ahnung, was das bedeutet. Der einzige Wert, den ich leite ist ganze Zahl 1, so dass ich nicht herausfinden können, warum die einzelnen Werte anders sein würde, oder warum Sie wäre gültig schwimmt! Meine Logik versucht, das war, dass, wenn OpenGL war der Konvertierung der Ganzzahlen zu Fließkommazahlen vielleicht sagen, dass Sie schon schweben würde vermeiden, aber anscheinend nicht.

glVertexAttribPointer with GL_INT: same result as glVertexAttribIPointer with GL_INT

dies ist das erwartete Ergebnis. OpenGL wandelt die int-Werte zu schwimmt, dann geht Sie auf die shader. Dies ist, was passieren soll, da ich nicht die I-version.

glVertexAttribPointer with GL_FLOAT: integer values 1 (the correct result)

dies funktioniert, weil OpenGL 1) denkt, dass die Quelle die Daten im floating-point-form und 2) meint, der shader-Eingaben sind auch in Gleitkomma-form (Sie sind eigentlich " int " und "int"), so gilt daher nicht für jede Konvertierung, verlassen den int-Datentyp als int (bzw. float als float, wie es denkt). Dies funktioniert, aber es scheint sehr hacky und unzuverlässig, da ich nicht denke, es ist eine Garantie, dass die CPU float-GPU-float wird nicht verlangen, eine Umwandlung (nicht einige GPUs verwenden 16-bit-floats? Vielleicht ist das nur pre-OpenGL-3 aber noch) - es funktioniert einfach nicht auf meiner GPU.

  • Gib uns mehr Informationen. Zeigen Sie uns den Aufruf glVertexAttribIPointer, und zeigen Sie uns, welche Daten Sie versuchen, zu übergeben.
  • Sie können die debug-GLSL vertex Shader durch die Verwendung von Transform Feedback und das Lesen der target-buffer zurück in den Hauptspeicher.
  • Ist das Attribut mit dem index 0, durch ändern? Der erste Wert übergeben glVertexAttribIPointer? Was passiert, wenn du manuell zuweisen auf einen anderen Wert? Auch, was passiert, wenn Sie die Treiber aktualisieren? Die Tatsache, dass Ihre Karte ist in der Lage 3.3 (die ATI hat Treiber für), aber Sie bekommen 3.2 deutet darauf hin, dass Sie out-of-date.
  • Ich bin vorbei an zwei integer-Attribute tatsächlich, so zumindest einer von Ihnen ist nicht mit dem index 0. Auch jemand mit einer ATI HD 4870 mir gesagt, Sie sind mit dem gleichen problem. Momentan bin ich am einrichten eines 3.2 Kontext, aber ich werde versuchen es mit 3,3 (kein besonderer Grund für 3,2 sowieso). In Bezug auf die Aktualisierung von Treibern, die das sehr gut das problem sein kann. Leider jedes mal, wenn ich versuche zu aktualisieren, bekomme ich BSOD und Abstürze - manchmal sogar während der Installation! >:( Aber das ist ein anderes Problem völlig, ich lese, ich das update VBIOS ersten (die ehrlich klingt erschreckend). Ich werde geben, dass ein weiterer Schuss und Bericht zurück.
  • OMG ich bin nicht die einzige ... zu Sehen, die genau die gleiche Sache: die Hex-zahlen darstellen, die vermeintliche int-Werte als Fließkommazahlen.
InformationsquelleAutor Gumgo | 2011-07-05
Schreibe einen Kommentar