Shader in XProfan bzw. Debug von call() von glShaderSource

  • Gerne möchte ich in XProfan Shader einsetzen für grafische Effekte aber auch für mathematische Berechnungen, welche dann parallel auf tausenden Kernen der Grafikkarte ausgeführt werden können.

    In C++ habe ich es hinbekommen, in XProfan versperrt sich eine Funktion aus mir unbekannten Gründen. Es ist üblich, dass ich OpenGL Funktionen, die nicht zum Basisumfang gehören per wglGetProcAddress verfügbar machen muss und diese dann mit call() ausführe. Ich denke nicht, dass wir hier ein 32/64 Bit Parameterproblem haben, dennoch stürzt der Aufruf immer ab, unter Verdacht immer der übergebene String bzw. die Adresse davon aber dort habe ich schon alles probiert... Ich bekomme glShaderSource nur ausgeführt, wenn ich ihm sage, dass er 0 Quelltexte verarbeiten soll (3. Parameter in Call, 2. der Funktion) oder absichtlich eine nicht existente Shader-ID übergebe (2. Parameter in Call, 1. der Funktion).

    Es sollten eigentlich keine OpenGL spezifischen Probleme sein, sobald OpenGL initialisiert ist sollte es klappen - oder selbst bei einem Fehler nicht abstürzen. Der Absturz deutet darauf hin, dass etwas mit den Parametern oder der Stringverarbeitung nicht klappt.

    Einmal editiert, zuletzt von SvenB (16. November 2023 um 13:06)

    • Anzeige

    Hallo!

    Wenn du gerade an deiner Website arbeitest oder dein aktuelles Hosting überdenkst: Wir betreiben mit NetzLiving eine Hosting-Plattform, die speziell auf Performance, Sicherheit und einfache Verwaltung ausgelegt ist.

    • ✔️ Schnelle Ladezeiten (optimiert für WordPress, WoltLab & Co.)
    • ✔️ Deutsche Server & DSGVO-konform
    • ✔️ Persönlicher Support (kein 0815-Ticket-System)

    Mehr erfahren

  • Mit CALL ist es beim Absturz immer übel.

    Hast du auch diese Fehlermeldung, wie angehängt bekommen

    oder nur reiner Absturz ?

    Muß man mal weiter probieren. Es hängt ja nur an dem einen CALL hinter Waitkey.

    Hast du auch schon mal

    glCreateShader&, glShaderSource&

    als POINTER übergeben ? Klar, Nummer ist Nummer. Probieren kann man ja mal.

    Ich hatte mal vor Jahren auch so was, wo ich dann einen Pointer übergab.

    Weiß aber jetzt nicht mehr bei welcher API oder wo.

    Oder gibt es Unterschiede zwischen deinem eof$ und "...\n" ? Oder vielleicht nur ein

    Chr$(0) ?

    Bereich statt vertexShaderSource$ hast du auch schon probiert ? Gerade bei der API

    hatte ich schon öfter erlebt, daß ein String ($) nicht ging, aber dafür ein Bereich.

    Hat RGH auch irgendwo in der Hilfe geschrieben, daß bei API Bereiche besser sind.

    Dateien

    Wir sind die XProfaner.

    Sie werden von uns assimiliert.

    Widerstand ist zwecklos!

    Wir werden alle ihre Funktionen und Algorithmen

    den unseren hinzufügen.

  • Danke für deine Antwort. Andere Pointer waren es nicht aber eine zusätzlicher am vorhandenen.

    Auf den ersten Blick sieht es gut aus, ich brauche einen Pointer auf einen Pointer bzw die Speicheradresse des Integers mit der Speicheradresse...

    statt:
    call(glShaderSource&, vertexShader&, 1, Addr(vertexShaderSource$),0)

    scheint es das zu sein:
    addr& = Addr(vertexShaderSource$)
    addrAddr& = Addr(addr&)
    call(glShaderSource&, vertexShader&, 1,addrAddr&,0)


    Es ist wohl unüblich einen Pointer auf einen String direkt zu verwenden... wieder etwas gelernt und mir ist nun auch klar, warum in der Definitionsbeschreibung zwei Sternchen vor dem Parameter waren.

    Das eof$ hatte ich nur verwendet, da ich es testweise mit $chr(10) und/oder $chr(13) befüllt hatte.

    Ich poste hier gerne weitere Fortschritte aber es wird noch ein längerer Weg :)

  • Es ist wohl unüblich einen Pointer auf einen String direkt zu verwenden... wieder etwas gelernt und mir ist nun auch klar, warum in der Definitionsbeschreibung zwei Sternchen vor dem Parameter waren.

    Das mit den 2 Sternchen ist wohl C/C++ - Manier.

    Weis ich noch von damals, daß das ein Zeiger auf einen Zeiger ist. Ich glaube, PureBasic

    hat auch so was ähnliches : normaler Zeiger = * , Adrresse darauf = @* glaube ich.

    Es ist aber auch üblich, daß die API gerne einen Bereich mit Strings + jeweils Chr$(0)

    zurück gibt. Also wäre die saubere Methode :

    Code
    Dim Bereich, 256
    String Bereich, 0 = "#version 330 core", "layout (location = 0) in vec3 aPos;",\
    "layout (location = 1) in vec2 aTexCoord;", "out vec2 TexCoords;", "out vec3 FragPos;"\
    "void main() {",  "gl_Position = vec4(aPos, 1.0);",  "TexCoords = aTexCoord;", \
    "FragPos = aPos;", +"}"
    call(glShaderSource&, vertexShader&, 1,Addr(Bereich),0)

    Würde mich interessieren, ob das auch geht.

    Aber da war ich mit der Vermutung mit der Stringvariablen auf dem halben Weg.

    Aber klasse, daß es jetzt funktioniert.

    Wir sind die XProfaner.

    Sie werden von uns assimiliert.

    Widerstand ist zwecklos!

    Wir werden alle ihre Funktionen und Algorithmen

    den unseren hinzufügen.

    Einmal editiert, zuletzt von H.Brill (16. November 2023 um 17:48)

  • Genau, das war C++. Deine Schreibweise für die Strings funktioniert.Ich habe die Shader-Skripte aber nun in Dateien ausgelagert.

    Ich lasse testweise Perlin-Noise generieren. Dafür hatte ich zuvor einen CPU-Code für XProfan, welcher mehrere Minuten pro Bild gebraucht hat, jetzt sind 1000 Bilder pro Sekunde möglich ebenso ziemlich jeder andere Bildeffekt wie Weichzeichnen, Schwarzweiß, Sättigung, Kontrast usw.

    Der Inhalt kann nicht angezeigt werden, da Sie keine Berechtigung haben, diesen Inhalt zu sehen.

    Der Inhalt kann nicht angezeigt werden, da Sie keine Berechtigung haben, diesen Inhalt zu sehen.

Jetzt mitmachen!

Sie haben noch kein Benutzerkonto auf unserer Seite? Registrieren Sie sich kostenlos und nehmen Sie an unserer Community teil!