Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

DeKugelschieber

Community-Fossil

  • »DeKugelschieber« ist der Autor dieses Themas

Beiträge: 2 641

Wohnort: Rheda-Wiedenbrück

Beruf: Software-Entwickler

  • Private Nachricht senden

1

31.07.2012, 19:39

Array in GLSL aus VBO

Hallo,

ich bin gerade entweder zu doof zum Googlen oder ich habe irgendwas vergessen, auf jeden Fall bekomme ich es gerade nicht hin 3 ints pro Vertex aus einem VBO im Shader zu verwenden.
Folgendes will ich also tun:

Quellcode

1
2
3
4
5
6
7
8
9
10
11
// Daten:
data[0] = 0;
data[1] = 0;
data[2] = 0;

data[3] = 0;
data[4] = 0;
// ...

// im Shader:
in int data[3];


In data stehen pro Vertex also 3 ints. Jetzt kommen diese nur leider nicht in das Array, also für das erste Vertex von 0-2, für das zweite 3-5 usw. Gesendet wird der Buffer so:

C-/C++-Quelltext

1
glVertexAttribIPointer(m_shader->getAttribLocation("data"), 3, GL_INT, 0, 0);


bei addVertexAttrib... steht auch eine 3 drin.

Was muss ich also tun?

Beiträge: 1 223

Wohnort: Deutschland Bayern

Beruf: Schüler

  • Private Nachricht senden

2

31.07.2012, 20:15

Ich bin mir gerade nicht sicher, ob du das suchst.
Aber schau mal nach "TBO". ;)

DeKugelschieber

Community-Fossil

  • »DeKugelschieber« ist der Autor dieses Themas

Beiträge: 2 641

Wohnort: Rheda-Wiedenbrück

Beruf: Software-Entwickler

  • Private Nachricht senden

3

31.07.2012, 20:33

Was soll ich damit? Das hat überhaupt nichts mit meinem Problem zu tun ^^

Beiträge: 1 223

Wohnort: Deutschland Bayern

Beruf: Schüler

  • Private Nachricht senden

4

31.07.2012, 21:26

Was genau willst du denn anstellen?
Ich habe das so verstanden:
Du hast ein VBO mit Integerdaten auf die du im Shader indexorientiert zugreifen willst.
Die Lösung wäre dafür: TBO

DeKugelschieber

Community-Fossil

  • »DeKugelschieber« ist der Autor dieses Themas

Beiträge: 2 641

Wohnort: Rheda-Wiedenbrück

Beruf: Software-Entwickler

  • Private Nachricht senden

5

31.07.2012, 21:28

Nein die ints sind die Indices.

Quellcode

1
2
3
4
5
6
7
uniform mat4 matrizen[123];

in int indices[3];

void main(){
    blablabla matrizen[indices[1]];
}


Wie ich einen Buffer erstelle und binde so das ich in int index; benutzen kann weiß ich, also ein int in einem Buffer. Aber ich brauche pro vertex drei indices aus einem Buffer. Und ich weiß nicht wie ich OpenGL sage das doch bitte jeweils 3 ints aus dem Buffer übergeben werden sollen, in das array indices[3]. Quasi das was mit einem float buffer gemacht wird, der nimmt ja auch 3 floats aus einem array von floats und packt sie in ein vec3. Nur dass das mit ints so nicht funktioniert.

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

6

01.08.2012, 00:29

Funktioniert das mit glGetAttribLocation() überhaupt so? iirc müsstest du das eigentlich für jedes Element extra machen, also einmal für "data[0]", einmal für "data[1]" etc.

DeKugelschieber

Community-Fossil

  • »DeKugelschieber« ist der Autor dieses Themas

Beiträge: 2 641

Wohnort: Rheda-Wiedenbrück

Beruf: Software-Entwickler

  • Private Nachricht senden

7

01.08.2012, 09:28

Zitat

Funktioniert das mit glGetAttribLocation() überhaupt so? iirc müsstest du das eigentlich für jedes Element extra machen, also einmal für "data[0]", einmal für "data[1]" etc.


Das weiß ich ja gerade nicht, ich find auch nichts dazu. Bei uniform Variablen ist es so dass man diese so übergeben muss. Also z.B. für das "matrizen". shader->sendUniform("matrizen[0]", matrix);

Oder meinst du für jeden der 3 Indices die ich brauche einen Buffer? Das kommt mir komisch vor, es muss doch auch so gehen. structs gehen übrigens auch nicht für in bzw. out Buffer...

Übrigens meckert der auch nicht beim kompilieren des Shaders. Sollte also gar nicht so falsch sein.

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »DeKugelschieber« (01.08.2012, 09:36)


dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

8

01.08.2012, 09:32

Das weiß ich ja gerade nicht, ich find auch nichts dazu.

Ich konnte nichts finden, das dafür spricht, dass das so gehen sollte; aber auch nichts, das explizit dagegen spricht. Ist auch egal, was gibt die Funktion denn zurück? Gibt es irgendwo Fehler?

Oder meinst du für jeden der 3 Indices die ich brauche einen Buffer?

Nein, das mein ich nicht. Aber du brauchst für jeden der drei Indices vermutlich einen eigenen Aufruf von glVertexAttribPointer()...

DeKugelschieber

Community-Fossil

  • »DeKugelschieber« ist der Autor dieses Themas

Beiträge: 2 641

Wohnort: Rheda-Wiedenbrück

Beruf: Software-Entwickler

  • Private Nachricht senden

9

01.08.2012, 09:45

Zitat

Aber du brauchst für jeden der drei Indices vermutlich einen eigenen Aufruf von glVertexAttribPointer()...


So?

C-/C++-Quelltext

1
2
3
4
glBindBuffer(GL_ARRAY_BUFFER, buffer);
glVertexAttribIPointer(m_shader->getAttribLocation("data0"), 1, GL_INT, sizeof(int)*2, 0);
glVertexAttribIPointer(m_shader->getAttribLocation("data1"), 1, GL_INT, sizeof(int), 0);
glVertexAttribIPointer(m_shader->getAttribLocation("data2"), 1, GL_INT, 0, 0);


Oder wie stellst du dir das vor?

Zitat

Gibt es irgendwo Fehler?


Nein, außer das nichts gerendert wird da ich im Shader einmal mit if teste ob eine "5" in data[0] steht (einfach nur so zum testen).

[Edit]

Das funktioniert... ok, ich dachte es ginge "schöner".

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

10

01.08.2012, 10:06

Ja genau so, wobei ich davon ausgegangen wäre, dass es "data[0]" und nicht "data0" etc. heißen müsste. Und ich bin mir sicher, dass es Fehler gab. glGetVertexAttribLocation() hat vermutlich -1 zurückgegeben und in weiterer Folge wird auch glVertexAttribPointer() fehlgeschlagen haben...

EDIT: Ok, doch nicht genau so. Sicher dass das funktioniert? Imo sollte der stride bei allen drei gleich sein und der pointer unterschiedlich...

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »dot« (01.08.2012, 10:41)


Werbeanzeige