2017-06-06 18 views
-3

OpenGL ESシェーダコードはC文字列として定義されています。シェーダコードをより直感的に書くには、以下のようにSHADER_STRING(code)という名前のマクロを定義します。しかし、私はGCCの警告unknown escape sequence: '\#'に遭遇し、それを抑止したり修正したりする方法を知らない。 #versionは、OpenGL ES 3.0でサポートされているプリプロセッサですのでGCC:警告を修正または抑制する方法:未知のエスケープシーケンス: '#'

のコード例では、それ以外のコードは

\#version 300 es 
void main() { } 

になるだろう、\\#\#を置き換えるために無効だ、

#include <stdio.h> 

int main(void) 
{ 
#define _SHADER_STRING(code) #code 
#define SHADER_STRING(code) _SHADER_STRING(code) 
    // OpenGL ES Shader codes 
    char vShaderStr[] = SHADER_STRING(
     \#version 300 es \n 

     void main() 
     { 
      // ... some OpenGL ES codes. 
     }); 
    printf("%s\n", vShaderStr); 
    return 0; 
} 

を下回っていますOpenGLシェーダコンパイラは、\#versionについて何も知らないと不平を言うでしょう。

+2

単に「#version ...」とは何ですか? – xanoetux

+4

あなたの[mcve]はコンパイルされず、あなたの質問は明確ではありません。 – Stargateur

+3

'TS_SHADER_STRING'とは何ですか?コードフラグメントには 'SHADER_STRING'しか定義されていません。 '\#'は単に上記の警告とともに '#'になります。なぜ逃げるのか?私はあなたがこのコードを別の場所からコピーして貼り付け、その間に構文解析のコンテキストを取り出すという感覚を持っています。 – dhke

答えて

4

this answerによると、次のコードは動作するはずです:

#define GLSL(version, shader) "#version " #version "\n" #shader 

const GLchar* vShaderStr_30 = GLSL(300, 
    void main() { 
     … 
    } 
); 
+0

文字列はOpenGL ESシェーダコードです。 '#version'はOpenGL ES 3.0ではサポートされているが、2.0ではサポートされていないマクロです。したがって、実装を使用する場合、私は 'SHADER_STRING'の2つのバージョンを定義する必要があります。 –

+0

'SHADER_STRING'の2つのバージョン、つまり' SHADER_STRING2'と 'SHADER_STRING3'を定義している解決策は1つしかないようです。 –

1
#define _SHADER_STRING(str) #str 
#define SHADER_STRING(str) _SHADER_STRING(str) 
// OpenGL ES Shader codes 
char vShaderStr_30[] = SHADER_STRING(#version 300 es \n 

    void main() 
    { 
     // ... 
    }); 

しかし、良いMinimal, Complete, and Verifiable exampleせずに、それは、より良い答えを持ってするのは難しいです。

関連する問題