Es sind keine Escapezeichen oder explizite Zeilenumbrüche erforderlich. Diese Zeichenfolgen beginnen mit einem R (oder r). Sie benötigen ein Trennzeichen (ich habe END gewählt) zwischen dem Anführungszeichen und der ersten Klammer, um der Klammer zu entkommen, die Sie im Code-Snippet haben.
Dies dient hauptsächlich der Rationalisierung SSCCE Programme/Beispiele hier auf SO, also möchte ich im Interesse der Portabilität C++11 vermeiden.
– Genpfault
14. Dezember 12 um 5:03 Uhr
Ausgezeichneter Vorschlag. GLSL-Shader und OpenCL-Kernel sind einer der besten Anwendungsfälle für rohe Zeichenfolgenliterale. Beachten Sie jedoch, dass das Trennzeichen nicht unbedingt erforderlich ist, es kann nur leer sein, nur das R"()" ist obligatorisch.
– Christian Rau
14. Dezember 2012 um 8:50 Uhr
@ChristianRau Du hast recht. Ich brauche das END nur, um einem wörtlichen )” zu entkommen, nicht nur ).
– Emsr
14. Dezember 2012 um 12:21 Uhr
@genpfault Oder beginne einfach mit const GLchar* vert = R"END(#version 120 ohne Zeilenumbruch. Ich habe meine Antwort nur so geschrieben, damit sie schöner aussieht. (Mir).
– Emsr
19. Februar 19 um 23:01 Uhr
@genpfault: Klingt so, als würden sie die Spezifikation nicht genau befolgen, da sie besagt: “Die Direktive #version muss vor allem anderen in einem Shader vorkommen, außer bei Kommentaren und Leerzeichen.”, und Zeilenumbrüche sind Leerzeichen.
– Chris Dodd
23. September 19 um 17:50 Uhr
Leider ist das Vorhandensein von Präprozessordirektiven im Argument eines Makros nicht definiert, sodass Sie dies nicht direkt tun können. Aber solange keiner Ihrer Shader andere Präprozessordirektiven benötigt als #version, könntest du so etwas tun:
Ich ziele gerne auf nicht erweitertes GLSL ab, also funktioniert das großartig! Danke!
– Genpfault
14. Dezember 12 um 18:59 Uhr
Um diesen Zweck zu erreichen, habe ich sed verwendet. Ich habe separate Dateien mit GLSL, die ich bearbeite (mit richtiger Syntaxhervorhebung), und gleichzeitig ist GLSL in C++ eingebettet. Nicht sehr plattformübergreifend, aber mit msys funktioniert es unter Windows.
Im C++-Code:
const GLchar* vert =
#include "shader_processed.vert"
;
Das Problem liegt an gcc-Vorverarbeitungsmakros, die für GLSL gedacht sind. Die Verwendung von Standard-Stringify- und Escaping-Präprozessordirektiven mit neuen Zeilen im GLSL-Code hat für mich funktioniert.
Obwohl ich in meinen glsl-Dateien ein wenig C-Code übersehen muss, erhalte ich auf diese Weise das Beste aus der glsl-Syntaxhervorhebung, ohne die Datei dynamisch laden zu müssen.
.
6767600cookie-checkGCC, Stringifizierung und Inline-GLSL?yes