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

1

16.04.2013, 22:13

[SOLVED] OpenGL / GLSL spielt verrückt....

Hallo allerseits,
ich habe eine simple OpenGL-Anwendung auf meinem Linux-Laptop geschrieben, in welcher ein simples farbiges Dreieck gerendert werden soll.
Es sollen keine Funktionen der FFP verwendet werden.
Leider kommt dabei etwas Müll raus, mehr dazu weiter unten.
Relevanter C++-Code:

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
48
49
50
51
52
GLuint VertexArrayID;
    glGenVertexArrays(1, &VertexArrayID);
    glBindVertexArray(VertexArrayID);

    GLuint vbo_triangle;
    GLuint colors_triangle;
    GLfloat triangle_vertices[] = {
        -1.0f, -1.0f, 0.0f,
        1.0f, -1.0f, 0.0f,
        0.0f,  1.0f, 0.0f
    };
    GLfloat triangle_colors[] = {
        1.0f, 0.0f, 0.0f, 1,
        0.0f, 1.0f, 0.0f, 1,
        0.0f,  0.0f, 1.0f, 1
    };
    glGenBuffers(1, &vbo_triangle);
    glBindBuffer(GL_ARRAY_BUFFER, vbo_triangle);
    glBufferData(GL_ARRAY_BUFFER, sizeof(triangle_vertices), triangle_vertices, GL_STATIC_DRAW);
    glGenBuffers(1, &colors_triangle);
    glBindBuffer(GL_ARRAY_BUFFER, colors_triangle);
    glBufferData(GL_ARRAY_BUFFER, sizeof(triangle_colors), triangle_colors, GL_STATIC_DRAW);

    while(win.isOpen()) {
        win.draw();

        glBindAttribLocation(normal.getID(),0,"vertexPosition_modelspace");
        glBindBuffer(GL_ARRAY_BUFFER, vbo_triangle);
        glVertexAttribPointer(
            0,
            3, 
            GL_FLOAT, 
            GL_FALSE, 
            0, 
            (void*)0
        );

        glBindAttribLocation(normal.getID(),1,"vertexColor");
        glBindBuffer(GL_ARRAY_BUFFER, colors_triangle);
        glVertexAttribPointer(
            1, 
            4,              
            GL_FLOAT,
            GL_FALSE,
            0, 
            (void*)0 
        );

        glEnableVertexAttribArray(0);
        glEnableVertexAttribArray(1);
        glDrawArrays(GL_TRIANGLES,0,3);
    }

Vertex-Shader (GLSL):

HLSL-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#version 130

in vec3 vertexPosition_modelspace;
in vec4 vertexColor;

varying vec4 vertex_color;

uniform int screenWidth;
uniform int screenHeight;

void main(){
  vertex_color = vertexColor;
            
  gl_Position.xyz = vertexPosition_modelspace;
  gl_Position.w = 1.0;
}

Fragment-Shader (GLSL):

HLSL-Quelltext

1
2
3
4
5
6
7
#version 130

varying vec4 vertex_color;
 
void main(){
    gl_FragColor = vertex_color;
}


Als Resultat erhalte ich das hier:


Wenn ich jedoch im Vertex-Shader die Zeile

HLSL-Quelltext

1
vertex_color = vertexColor;

durch

HLSL-Quelltext

1
vertex_color = vec4(1,0,0,1);

ersetze, dann erhalte ich das Dreieck in der Form, welche es haben sollte:


Ich hoffe, ihr könnt mir helfen und bedanke mich im voraus,
Soundi

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »Sound~Wave« (17.04.2013, 13:34)


2

17.04.2013, 00:25

Sieht eigentlich größtenteils richtig aus. Aber vielleicht ist das hier was: "Any attribute binding that occurs after the program object has been linked will not take effect until the next time the program object is linked."
Zeig mal den Code zum Shader Laden/Kompilieren/Linken, und wie er in Relation zu dem bisherigen steht.

Es sieht jedenfalls so aus, als würden die Farbwerte die Positionswerte überschreiben. Das kann gewiss irgendwie durch das manuelle Binden kommen. Vielleicht solltest du nach dem Linken GetLocation benutzen, statt alles festzulegen, aber gut, so wie jetzt muss es ja auch irgendwie gehen.
Wenn du dann jedenfalls die Farbwerte ignorierst, wird alles was mit Farben zu tun hat wegoptimiert, insofern sind die gezeigten Bilder durchaus sinnvoll.
Lieber dumm fragen, als dumm bleiben!

DeKugelschieber

Community-Fossil

Beiträge: 2 641

Wohnort: Rheda-Wiedenbrück

Beruf: Software-Entwickler

  • Private Nachricht senden

3

17.04.2013, 08:24

varying ist deprecated, nimm da schon mal:

Quellcode

1
2
3
4
5
// vertex shader:
out vec4 vertex_color;

// fragment:
in vec4 vertex_color;


Der Rest sieht eigentlich gut aus, vielleicht übersehen wir auch was ^^

4

17.04.2013, 13:33

Hallo,
danke für eure Antworten.
Es lag tatsächlich daran, dass ich an der falschen Stelle gelinkt habe.
Das mit dem varying hatte ich nur noch eingebaut, weil ich verschiedenes ausprobiert habe.
Danke für eure Hilfe!

Werbeanzeige