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

04.11.2013, 18:25

GLSL Shader Texturing

Liebe Community,

nachdem ich mich vor ein paar Wochen dazu entschlossen habe, Shader zu benutzen, habe ich angefangen, mit ihnen herumzuspielen. Bisher konnte ich alles realisieren, so auch Texturing. Nun möchte ich das in meiner Engine wieder einbauen, und stoße dabei auf folgendes Problem: Egal was ich mache, ich erhalte immer eine schwarze Textur.

Hier der VertexShader:

Quellcode

1
2
3
#version 330
attribute vec3 texcoord;attribute vec3 position;uniform mat4 mvp;
void main(void){    gl_TexCoord[0] = vec4(texcoord, 1.0);   gl_Position = mvp * vec4(position, 1.0);}



Der FragmentShader:

Quellcode

1
2
#version 330uniform sampler2D vtex;
void main(void){    gl_FragColor = texture2D(vtex, gl_TexCoord[0].st);}

Nun meine Frage: Was habe ich vergessen? Muss ich etwas besonderes mittels glEnable(...) machen, oder muss ich eine weitere Variable übergeben?

C-/C++-Quelltext

1
2
3
4
5
Mesh* pMesh = m_mesh.get<Mesh>();   m_program.bind();   pMesh->bind();      m_program.updateAttributeArray("position", 3, GL_FLOAT, false, pMesh->getStride(), (void*)(0)); m_program.updateAttributeArray("texcoord", 3, GL_FLOAT, false, pMesh->getStride(), (void*)(sizeof(float) * 6));
    glActiveTexture(GL_TEXTURE0);   glBindTexture(GL_TEXTURE_2D, 1);
    m_program.uniform1x("vtex", 0); m_program.uniformMatrix4("mvp", 1, false, (pScene->getCamera()->getProjection() * pScene->getCamera()->getView() * pScene->getTransform()).get());      glDrawElements(pMesh->getRenderMode(), pMesh->getNumIndices(), GL_UNSIGNED_INT, 0);
    m_program.disableAttributeArray("texcoord");    m_program.disableAttributeArray("position");
    pMesh->unbind();    m_program.unbind();


Das Resultat:

(Link)


Liebe Grüße,
~ EuadeLuxe ~

PS.: Entschuldigt bitte den nicht formatierten Code. Wenn ich ihn in Code-Tags gesetzt habe, wurde er immer auf eine Zeile zusammengequetscht. Falls ich es hinbekommen sollte, werde ich das ändern.

Beiträge: 1 223

Wohnort: Deutschland Bayern

Beruf: Schüler

  • Private Nachricht senden

2

04.11.2013, 19:04

Deinen Programmcode kann ich leider jedoch so gut wie gar nicht nachvollziehen, weil du irgendwelche eigenen Hilfsfunktionen nutzt, die ich nicht kenne.
Die Zeile "glBindTexture(GL_TEXTURE_2D, 1)" ist falsch. Als zweiter Parameter wird eine Texture ID erwartet. Ich bin mir nicht sicher, ob du den Parameter versehentlich für die Sampler ID gehalten hast, oder du fälschlicherweise einfach davon ausgehst, dass deine Textur ID immer 1 ist.
Als Geheimtipp für AttributeArray-Einstellungen empfehle ich "offsetof" bzw. "sizeof" für den Stride.
Du solltest den Code mit glGetError auf möglicherweise geworfenen OpenGL-Fehler überprüfen. Kompiliert dein Shader überhaupt korrekt, bzw. hast du getestet, dass der Shader auch zum Zeichnen verwendet wird? Bei deinen Shadercode würde ich vermuten das er mit der Version 330 nicht mehr richtig kompiliert. So oder so solltest du besser "in" und "out" nutzen und am besten bei den Vertexattributen die Location als Layoutparameter im Shader angeben.
Ein relativ gutes & auch modernes Tutorial für GLSL findest du auch hier: "http://www.lighthouse3d.com/tutorials/glsl-core-tutorial/"
Wenn es deutsch sein soll und besonders als Übersicht und Funktionsreferenz ist auch das gut, auch wenn es nicht auf den neusten Stand ist: "http://wiki.delphigl.com/index.php/Tutorial_glsl"

Überprüfe am besten auch nochmal den Inhalt der Texture. Am Besten zb. mit dem glDebugger.

3

04.11.2013, 19:38

Also, das mit der TextureId habe ich geschrieben, da ich nur eine Textur habe, und ich sehen wollte, ob das an der Textur liegt (Evtl. bindet sie nicht richtig) doch das funktioniert. Die eigenen benutzten Hilfsfunktionen sind:
m_program.bind() => glUseProgram(...)
pMesh->bind() => Bindet den VBO und den IBO des Meshs
m_program.updateAttributeArray(...) => ruft glEnableVertexAttribArray(...) und glVertexAttribPointer(...) auf.
pMesh->getStride() => berechnet den Stride im VBO mittels sizeof()

Alle Shader kompilieren erfolgreich, die Textur wird richtig geladen, Textur-Parameter werden gesetzt. Ich habe keine Ahnung, was fehlt. Auch glEnable(GL_TEXTURE_2D) is eingeschaltet....

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »EuadeLuxe« (04.11.2013, 19:48)


Werbeanzeige