Du bist nicht angemeldet.

Werbeanzeige

the[V]oid

Alter Hase

  • »the[V]oid« ist der Autor dieses Themas

Beiträge: 778

Wohnort: Aachen

  • Private Nachricht senden

1

21.03.2015, 17:44

OpenGL: Verwirrung ob der maximalen Ausgabegrößen von Geometry-Shadern

Hallo zusammen,

ich hätte da folgendes Problem. Im OpenGL-Wiki steht bzgl. der maximalen Ausgabegrößen von Geometry-Shadern:

Zitat

The first limit, defined by GL_MAX_GEOMETRY_OUTPUT_VERTICES​, is the maximum number that can be provided to the max_vertices​ output layout qualifier. [...] The other limit, defined by GL_MAX_GEOMETRY_TOTAL_OUTPUT_COMPONENTS​ is [...] the total number of output values (a component, in GLSL terms, is a component of a vector. So a float​ is one component; a vec3​ is 3 components).


Der deklarative Teil meines Geometry-Shaders sieht wie folgt aus:

HLSL-Quelltext

1
2
3
layout( triangles ) in;
layout( triangle_strip, max_vertices = 300 ) out;
out vec4 var1;


Mein Vertex-Format besteht aus nur 4 Floats für die Position. Also ist es doch so, dass ich die 4 Komponenten vom Varying "var1" plus der 4 Komponenten von der Position hätte, also 8 Komponenten insgesamt pro Vertex.

Ich habe die beiden oben erwähnten Konstanten mal abgefragt:

C-/C++-Quelltext

1
2
GL_MAX_GEOMETRY_OUTPUT_VERTICES = 36320
GL_MAX_GEOMETRY_TOTAL_OUTPUT_COMPONENTS = 36321


Mit "max_vertices" auf 300 gesetzt würden insgesamt 8*300 = 2400 Komponenten geschrieben werden. Es ist ziemlich eindeutig, dass dieser Wert weit unter dem Limit von 36321 liegt, ebenso wie der Wert 300 für "max_vertices" weit unter 36320. Also sollte alles klappen, oder?

Wenn ich den Shader aber bauen will, scheitert das Linken:

Zitat

error C6033: Hardware limitation reached, can only emit 128 vertices of this size


Kann mir jemand erklären was hier falsch läuft?
<< an dieser Stelle ist eine Signatur verstorben >>

Beiträge: 1 235

Wohnort: Deutschland Bayern

Beruf: Schüler

  • Private Nachricht senden

2

21.03.2015, 18:00

Drei Dinge:
  1. Die Anzahl "max_vertices" solltest du auf Nvidia Hardware so niedrig wie möglich setzen. 300 ist ziemlich viel. Bei AMD ist es angeblich egal.
  2. Du liest die Werte nicht richtig. Bereits die IDE sollte dir sagen, dass es sich um eine Compile Time Konstanten handelt. Es handelt sich dabei bloß um einen Enumerationswert. Dir sollten doch bereits die willkürlichen Werte seltsam vorkommen. Den richtigen Wert kannst du mit glIntegerv auslesen.
  3. Um einfach schnell den Wert von deiner Grafikkarte zu erfahren, oder auf welche Werte man sich in der Praxis allgemein verlassen kann, solltest du ein Programm wie den CapsViewer und dessen Datenbank verwenden.

dot

Supermoderator

Beiträge: 9 833

Wohnort: Graz

  • Private Nachricht senden

3

22.03.2015, 01:58

Was genau hast du mit diesem Geometry Shader vor, dass du so viele Output Vertices brauchst?

Werbeanzeige