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

K-Bal

Alter Hase

  • »K-Bal« ist der Autor dieses Themas

Beiträge: 703

Wohnort: Aachen

Beruf: Student (Elektrotechnik, Technische Informatik)

  • Private Nachricht senden

1

27.11.2009, 13:29

Geometry Shader Confusion

Moin,

weiß jemand, warum folgender Geometry Shader keine vernünftigen Quads sondern merkwürdige Polygone (siehe Screenshot unten) rendert?

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
#version 120
#extension GL_EXT_geometry_shader4 : enable
void main()
{
    float length = 0.3;
    vec4 disp[8];
    disp[0] = vec4(length, length, length, 0.0);
    disp[1] = vec4(length, length, -length, 0.0);
    disp[2] = vec4(length, -length, length, 0.0);
    disp[3] = vec4(length, -length, -length, 0.0);
    disp[4] = vec4(-length, length, length, 0.0);
    disp[5] = vec4(-length, length, -length, 0.0);
    disp[6] = vec4(-length, -length, length, 0.0);
    disp[7] = vec4(-length, -length, -length, 0.0);

    int i=0;

    for(i=0; i < gl_VerticesIn; ++i)
    {
        vec4 point=gl_PositionIn[i];
        vec4 color = vec4 (1,1,1,1);



        gl_FrontColor=vec4(1,0,0,1)*color;
        gl_Position = gl_ModelViewProjectionMatrix*(point+disp[0]);
        // disp[0] = vec4(length, length, length, 0.0);

        EmitVertex();

        gl_FrontColor=vec4(1,0,0,1)*color;
        gl_Position = gl_ModelViewProjectionMatrix*(point+disp[2]);
        // disp[2] = vec4(length, -length, length, 0.0);

        EmitVertex();

        gl_FrontColor=vec4(1,0,0,1)*color;
        gl_Position = gl_ModelViewProjectionMatrix*(point+disp[6]);
        // disp[6] = vec4(-length, -length, length, 0.0);

        EmitVertex();

        gl_FrontColor=vec4(1,0,0,1)*color;
        gl_Position = gl_ModelViewProjectionMatrix*(point+disp[4]);
        // disp[4] = vec4(-length, length, length, 0.0);

        EmitVertex();

        EndPrimitive();
    }
}



Screenshot
http://www.pitload.org/show/1886

Gruß,
Marius

K-Bal

Alter Hase

  • »K-Bal« ist der Autor dieses Themas

Beiträge: 703

Wohnort: Aachen

Beruf: Student (Elektrotechnik, Technische Informatik)

  • Private Nachricht senden

2

27.11.2009, 15:26

GL_POINTS rein, GL_QUADS raus.

Wenn ich den 3. und 4. Vertex vertausche kriege ich übrigens das richtige Ergebnis :roll: Das wäre ja dann die Vertexreihenfolge wie bei GL_QUAD_STRIP.

Edit: Wo ist dann Davip_pb's Post hin? :D

David_pb

Community-Fossil

Beiträge: 3 886

Beruf: 3D Graphics Programmer

  • Private Nachricht senden

3

27.11.2009, 15:33

Zitat von »"K-Bal"«


Edit: Wo ist dann Davip_pb's Post hin? :D


Ich hab gesehen das als Output nur GL_POINTS, GL_LINE_STRIP und GL_TRIANGLE_STRIP möglich sind, daher war die Frage egtl hinfällig. Das Problem was du hast ist, das du die Vertices in der falschen Reihenfolge emmitierst. Wenn das erste Dreieck aus Vertex 0 - 1 - 2 CW besteht dann besteht das zweite Dreieck aus Vertex 2 - 3 - 4 CCW. Die gemeinsame Kante bei deinen Dreiecken ist somit V2 - V3.
Das Ganze lässt sich aber einfach durch umsotieren beheben.

K-Bal

Alter Hase

  • »K-Bal« ist der Autor dieses Themas

Beiträge: 703

Wohnort: Aachen

Beruf: Student (Elektrotechnik, Technische Informatik)

  • Private Nachricht senden

4

27.11.2009, 16:11

Danke. Wo hast du die Info mit den drei Ausgabeprimitiven her?

Mit ein wenig Trial & Error hab ich nun meinen Points to Cubes Shader fertig ;) Siehe Video:

http://www.youtube.com/watch?v=eBHyakKZU80

David_pb

Community-Fossil

Beiträge: 3 886

Beruf: 3D Graphics Programmer

  • Private Nachricht senden

5

27.11.2009, 16:26

Steht in der Spezifikation. :)

Werbeanzeige