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

28.03.2012, 18:48

Neue Grafikkarte, Shader läuft nicht

Hi,

ich hab jetzt eine neue Grafikkarte gekauft (Radeon HD 6970) und habe dabei Probleme ein Model schlicht zu texturieren. Ich bin mir nicht sicher ob es an der Grafikkarte liegt, ob ich im Shader einen Fehler habe oder sonst wie, da ich vieles neu geschrieben habe.
Erstmal ein Bild des Problems:


(Link)


Im ersten Bild stimmen die Ausgabe-Vertices, im zweiten wie man sieht nicht.
Der Fehler tritt erst auf wenn ich versuche die Texturkoordinaten an den Fragement Shader zu senden und dort texture() aufzurufen. Die Texturkoordinaten an sich sind richtig, ich hab sie testweise ausgegeben und ich glaube nicht das der Buffer dafür falsch erstellt wird, da ich an der Stelle nichts geändert habe und es vorher lief.

Hier also beide Shader:

Quellcode

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
// VERTEX

#version 150

uniform mat4 projection, modelview;
in vec3 vertex0;
in vec2 texCoord0;

out vec2 texCoord;

void main(){
    texCoord = texCoord0; // hiermit funktioniert es nicht
    gl_Position = projection*modelview*vec4(vertex0, 1.0);
}

// FRAGMENT

#version 150

precision highp float;

uniform sampler2D texture0;
in vec2 texCoord;

void main(){
    gl_FragColor = texture(texture0, texCoord.st);
}


Kann es sein das der Vertexshader statt gl_Position texCoord als "Vertex" nimmt, es würde zumindest zum Bild passen?

(relevanter) Code für das Rendering

DeKugelschieber

Community-Fossil

  • »DeKugelschieber« ist der Autor dieses Themas

Beiträge: 2 641

Wohnort: Rheda-Wiedenbrück

Beruf: Software-Entwickler

  • Private Nachricht senden

2

28.03.2012, 22:13

Hier mal die Rendermethode, vielleicht hilfts ja :D
m_shader->enableVertexAttribArrays(); bindet alle VAAs (in diesem Fall "0" und "1").

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
void Model::render(mat4 projection, mat4 modelview){
    mat4 m = getModelview(modelview);

    m_shader->bindShader();
    m_shader->sendUniform4x4("projection", projection.getArray());
    m_shader->sendUniform4x4("modelview", m.getArray());
    m_shader->sendUniform("texture0", 0);

    glActiveTexture(GL_TEXTURE0);
    glBindTexture(GL_TEXTURE_2D, m_texture->getTextureID());

    m_shader->enableVertexAttribArrays();

    glBindBuffer(GL_ARRAY_BUFFER, m_model->getVertexBuffer());
    glVertexAttribPointer((GLint)0, 3, GL_FLOAT, GL_FALSE, 0, 0);
    glBindBuffer(GL_ARRAY_BUFFER, m_model->getTexCoordBuffer());
    glVertexAttribPointer((GLint)1, 2, GL_FLOAT, GL_FALSE, 0, 0);

    glDrawElements(GL_TRIANGLES, m_model->getIndexCount(), GL_UNSIGNED_INT, &m_model->getIndices());

    m_shader->disableVertexAttribArrays();
}

DeKugelschieber

Community-Fossil

  • »DeKugelschieber« ist der Autor dieses Themas

Beiträge: 2 641

Wohnort: Rheda-Wiedenbrück

Beruf: Software-Entwickler

  • Private Nachricht senden

3

03.04.2012, 12:46

Tja ich hätte doch ganz gerne eine Antwort, da ich inzwischen wirklich glaube es liegt an meiner Grafikkarte und nicht an mir!
Hier mal wie ich versuche ein Sprite (mit meiner alten !funktionierenden! Sprite Klasse zu rendern, "Shader" und "Texture" haben auch immer funktioniert):

depth buffer, cull face und blending sind Standard (also nicht aktiviert).

Aufsetzen des Shaders:

C-/C++-Quelltext

1
2
3
4
shader.push_back(new Shader("res/shader/sa_model.vsh", "res/shader/sa_model.fsh")); // vector (hier nur ein Shader enthalten)
shader[0]->bindAttrib(SHADER_VERTEX, 0, "vertex0", 2); // Verwendungszweck (unwichtig), Index (für glEnable...), Name, Größe
shader[0]->bindAttrib(SHADER_TEXCOORD, 1, "texCoord0", 2);
shader[0]->initialize();


Laden der Textur.
Erstellen des Sprites (new Sprite(50, 50, vec2(100), 0, 0, wndSize[0], wndSize[1], shader[0], textures[0]) // Breite, Höhe, Position, Fenster (4 Werte), Shader und Textur), Projection und Modelview werden in "Sprite" gehalten.

Reshape:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
void reshape(int w, int h){
    wndSize[0] = w;
    wndSize[1] = h;

    glViewport(0, 0, wndSize[0], wndSize[1]); // Viewport anpassen

    // Sprites anpassen
    sprites[0]->setViewport(0, 0, w, h); // <- passt Projection an
}


Hauptrenderfunktion:

C-/C++-Quelltext

1
2
3
4
5
6
glClearColor(0.0, 0.0, 0.0, 0.0);
glClear(GL_COLOR_BUFFER_BIT); // kein depth buffer (GL_DEPTH_BUFFER_BIT) weil orthogonal
    
sprites[0]->render();

glutSwapBuffers();


Rendermethoden von Sprite:

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
void Sprite::render(){ // <- wird in Hauptrenderfunktion aufgerufen
    if(m_haveShader && m_haveTexture){ // muss Shader und Textur haben (hat es)
        render(m_projection, getModelview(), m_shader, m_texture);
    }
}

void Sprite::render(mat4 projection, mat4 modelview, Shader *shader, Texture *texture){ // wird von render() aufgerufen     
    shader->bindShader();
    shader->sendUniform4x4("projection", projection.getArray());
    shader->sendUniform4x4("modelview", modelview.getArray());
    shader->sendUniform("texture0", 0);
                    
    glActiveTexture(GL_TEXTURE0);
    glBindTexture(GL_TEXTURE_2D, texture->getTextureID());

    glEnableVertexAttribArray(0);
    glEnableVertexAttribArray(1);
                        
    glBindBuffer(GL_ARRAY_BUFFER, m_vertexBuffer);
    glVertexAttribPointer((GLint)0, 2, GL_FLOAT, GL_FALSE, 0, 0);               
    glBindBuffer(GL_ARRAY_BUFFER, m_texCoordBuffer);
    glVertexAttribPointer((GLint)1, 2, GL_FLOAT, GL_FALSE, 0, 0);
    
    glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_INT, &m_indices[0]);
    
    glDisableVertexAttribArray(0);
    glDisableVertexAttribArray(1);
}


Vertexshader:

Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
13
#version 150

uniform mat4 projection;
uniform mat4 modelview;
in vec2 vertex0;
in vec2 texCoord0;

out vec2 texCoord;

void main(){
    texCoord = texCoord0; // <- hier liegt der Fehler, denke ich!
    gl_Position = projection*modelview*vec4(vertex0, 0.0, 1.0);
}


Fragmentshader:

Quellcode

1
2
3
4
5
6
7
8
9
10
#version 150

precision highp float;

uniform sampler2D texture0;
in vec2 texCoord;

void main(){
    gl_FragColor = texture(texture0, texCoord.st);
}


Ausgabe: ein leeres schwarzes Fenster!

Und ich hoffe jemand kann mir mal meinen Fehler aufzeigen. Wahrscheinlich ist irgendwo nur minimal was falsch! Aber ich vermute es liegt an den Shader + meine Grafikkarte.

Wichtige Ergänzung:

Wenn ich im Vertexshader die Texturkoordinate nicht weitergebe:

Quellcode

1
2
3
4
5
6
7
8
[...]

//out vec2 texCoord;

void main(){
    //texCoord = texCoord0;
    gl_Position = projection*modelview*vec4(vertex0, 0.0, 1.0);
}


Und im Fragmentshader dann z.B. einfach rot ausgebe (gl_FragColor = vec4(1.0, 0.0, 0.0, 0.0)) wird mir ein rotes Quadrat an der Stelle angezeigt an der das Sprite ist (also x100 y100 siehe Shader(...)).

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »DeKugelschieber« (03.04.2012, 12:56)


BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

4

03.04.2012, 12:48

Laufen andere Spiele mit Shadern auf Deinem System? Wenn ja, dann liegt es an Dir und/oder Deinem Treiber. Wenn nein, liegt es am Treiber und/oder an der Karte.
Werden die Shader überhaupt fehlerfrei kompiliert und gebunden?
Teamleiter von Rickety Racquet (ehemals das "Foren-Projekt") und von Marble Theory

Willkommen auf SPPRO, auch dir wird man zu Unity oder zur Unreal-Engine raten, ganz bestimmt.[/Sarkasmus]

DeKugelschieber

Community-Fossil

  • »DeKugelschieber« ist der Autor dieses Themas

Beiträge: 2 641

Wohnort: Rheda-Wiedenbrück

Beruf: Software-Entwickler

  • Private Nachricht senden

5

03.04.2012, 12:55

Shader geben keine Fehler oder Warnungen (würde die Shader Klasse sonst in die Konsole schreiben) und sie werden korrekt gebunden (immerhin bekomm ich ja irgendwas gerendert).

Zitat

aufen andere Spiele mit Shadern auf Deinem System?


Hmm naja wenn ich z.B. hier (unten in blau "demo") die Demo lade stürzt das Programm ab, allerdings steht in der Konsole schon das die Shader compiliert wurden.

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

6

03.04.2012, 12:58

Hast Du keine Games, die Du einfach mal starten kannst? Solche Uni-Programme sind oft nicht sonderlich up to date oder kompatibel.
Teamleiter von Rickety Racquet (ehemals das "Foren-Projekt") und von Marble Theory

Willkommen auf SPPRO, auch dir wird man zu Unity oder zur Unreal-Engine raten, ganz bestimmt.[/Sarkasmus]

DeKugelschieber

Community-Fossil

  • »DeKugelschieber« ist der Autor dieses Themas

Beiträge: 2 641

Wohnort: Rheda-Wiedenbrück

Beruf: Software-Entwickler

  • Private Nachricht senden

7

03.04.2012, 13:07

Bin mir da nicht so sicher was alles geeignet ist, Spiele hab ich natürlich aber alle DX ^^

Aber das hier läuft z.B.: http://www.billardgl.de/

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

8

03.04.2012, 13:09

Ob DX oder GL dürfte da so ziemlich egal sein, das ist schließlich nur die Treiber-Schnittstelle, die Hardware darunter ist ja schließlich die selbe für beide Varianten.
Teamleiter von Rickety Racquet (ehemals das "Foren-Projekt") und von Marble Theory

Willkommen auf SPPRO, auch dir wird man zu Unity oder zur Unreal-Engine raten, ganz bestimmt.[/Sarkasmus]

DeKugelschieber

Community-Fossil

  • »DeKugelschieber« ist der Autor dieses Themas

Beiträge: 2 641

Wohnort: Rheda-Wiedenbrück

Beruf: Software-Entwickler

  • Private Nachricht senden

9

03.04.2012, 13:13

Ja wenn du so willst läuft alles bei mir, aber evt. hab ich ja irgendeine Eigenart übersehen?

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

10

03.04.2012, 13:20

Hast Du mal Shader mit niedrigeren Versionen probiert? Und mit was für einem Profile lässt Du das Teil laufen, Compatibility oder Core?
Teamleiter von Rickety Racquet (ehemals das "Foren-Projekt") und von Marble Theory

Willkommen auf SPPRO, auch dir wird man zu Unity oder zur Unreal-Engine raten, ganz bestimmt.[/Sarkasmus]

Werbeanzeige