DGL
https://delphigl.com/forum/

GLSL: (unsigned) char Datentyp?
https://delphigl.com/forum/viewtopic.php?f=20&t=9613
Seite 1 von 1

Autor:  mrtrain [ So Nov 28, 2010 15:29 ]
Betreff des Beitrags:  GLSL: (unsigned) char Datentyp?

Hallo und einen schönen ersten Advent!
Ich bin gerade dabei, mein Terrain zu shaderisieren (aber ohne Heightmap). Weil man dabei ja so ein schönes Gitter hat, dachte ich mir, dass ich statt zwei floats für x- und z-Koordinate einfach zwei unsigned char Werte als Vertexattribut übergebe. Per uniform float könnte ich dann angeben, wie groß der Abstand zwischen den Vertices ist. Hier mal das ganze als Code:
Code:
  1. attribute unsigned char a_x;
  2. attribute unsigned char a_z;
  3.  
  4. uniform vec2 u_vOffset;
  5. uniform float u_fStepsize;
  6.  
  7. void main(void)
  8. {
  9.   vec3 vPos;
  10.   vPos.x = u_vOffset.x + float(a_x) * u_fStepsize;
  11.   vPos.z = u_vOffset.y + float(a_z) * u_fStepsize;
  12.  
  13.   // ...
  14. }

Das Problem ist, das es offenbar kein unsigned char gibt (laut dieser Liste). Weiß jemand eine Alternative, oder gibt es sowas wirklich nicht in GLSL?

edit: In der offiziellen Doku zu GLSL 4.0, wird auch nichts in der Richtung erwähnt, schade.

Danke schonmal im Voraus!

Autor:  Coolcat [ So Nov 28, 2010 16:15 ]
Betreff des Beitrags:  Re: GLSL: (unsigned) char Datentyp?

Zitat:
Weiß jemand eine Alternative, oder gibt es sowas wirklich nicht in GLSL?

Es besteht ein Unterschied zwischen dem was zu Berechnung benutzt wird und dem was du als Input/Output benutzen kannst.

Du kannst in deinen VBO ein unsigned char packen und das dann so laden:
Code:
glVertexAttribPointer(index, 2, GL_UNSIGNED_BYTE, GL_FALSE, 0, 0);

Im Shader verarbeitest du das dann aber als Float bzw. vec2.

Die Grafikkarte kann sowieso nur Float verarbeiten, also das ist eher von Nachteil, wenn du da mit simulierten Integern (ivec2, usw.) arbeitest. Bei diesen simulierten Integern sind sowieso nur 16bit garantiert, daher sind die recht nutzlos. Eignen sich nur als Schleifenindex o.ä. Eine Ausnahme ist natürlich, wenn deine Grafikkarte echte 32bit Integer-Arithmetik anbietet. Das erfordert mindestens GLSL 1.30 oder die GL_EXT_gpu_shader4 Extension. In dem Fall ist die Verwendung von Integern durchaus sinnvoll.

Autor:  mrtrain [ So Nov 28, 2010 16:35 ]
Betreff des Beitrags:  Re: GLSL: (unsigned) char Datentyp?

Okay, wieder was gelernt. :) Wenn ich die Werte im VBO als unsigned char bzw. GL_UNSIGNED_BYTE habe und dann aber ein float als Attribute nehme: Haben die float-Variablen dann den "gleichen" Wert wie im VBO (also 16 -> 16.0) oder wird daraus ein Wert zwischen 0.0 und 1.0 (16 -> 16.0 / 255.0)?

Autor:  Coolcat [ So Nov 28, 2010 16:47 ]
Betreff des Beitrags:  Re: GLSL: (unsigned) char Datentyp?

Zitat:
Haben die float-Variablen dann den "gleichen" Wert wie im VBO (also 16 -> 16.0) oder wird daraus ein Wert zwischen 0.0 und 1.0 (16 -> 16.0 / 255.0)?

Das kannst du einstellen über den "normalized" Parameter von glVertexAttribPointer. Also im obigen Fall bedeutet das GL_FALSE eben das 16 in 16.0 konvertiert wird.

Autor:  mrtrain [ So Nov 28, 2010 16:49 ]
Betreff des Beitrags:  Re: GLSL: (unsigned) char Datentyp?

Ach dafür ist der Parameter. Danke für deine Hilfe! :)

Seite 1 von 1 Alle Zeiten sind UTC + 1 Stunde
Powered by phpBB® Forum Software © phpBB Group
https://www.phpbb.com/