2017-05-19 8 views
-1

フラグメントシェイダーをコンパイルする際に、このフラストレーションエラーを試しています。私はシェーダをコンパイルしようとした場合は、そのまま:$エンドを期待して、GLSL UNEXPECTED NEW_IDENTIFIER:

#version 450 core 
in vec2 tex_coord; 
in flat int vertex_id; 
out vec4 color; 
layout (binding = 20) uniform sampler2D buildingTex; 
layout (binding = 21) uniform sampler2D groundTex; 
const int cube_vertices = 36; 
const int ground_vertices = 4; 
void main(void) 
{ 

    if(vertex_id < cube_vertices) 
    { 
     float scaleF = .5f; 
     vec2 scale = vec2(scaleF,scaleF); 
     color = texture(buildingTex,tex_coord*scale); 
    } 
    if(vertex_id >= cube_vertices) 
    { 
     color = texture(groundTex,tex_coord); 
    } 


} 

compailerはと文句を言います。

しかし、私は、私は別のファイルに持っていたことを、私のフラグメントシェーダに別のフラグメントシェーダを追加し、以下のように、私はそのすべての行をコメントする場合:シェーダーがコンパイルされ、この場合

// #version 450 core 

// in vec2 tex_coord; 
// in flat int vertex_id; 
// out vec4 color; 

// layout (binding = 20) uniform sampler2D buildingTex; 
// layout (binding = 21) uniform sampler2D groundTex; 

// int cube_vertices; 
// int ground_vertices; 


// void main(void) 
// { 

// if(vertex_id < cube_vertices) 
//  { 
//  float scaleF = .5f; 
//  vec2 scale = vec2(scaleF,scaleF); 
//  color = texture(buildingTex,tex_coord*scale); 
//  //color = vec4(1.0,1.0,1.0,1.0); 
//  } 
// if(vertex_id >= cube_vertices) 
//  { 
//  color = texture(groundTex,tex_coord); 
//  //color = vec4(1.0,0.0,0.0,1.0); 
//  } 




#version 450 core 
in vec2 tex_coord; 
in flat int vertex_id; 
out vec4 color; 
layout (binding = 20) uniform sampler2D buildingTex; 
layout (binding = 21) uniform sampler2D groundTex; 
const int cube_vertices = 36; 
const int ground_vertices = 4; 
void main(void) 
{ 

    if(vertex_id < cube_vertices) 
    { 
     float scaleF = .5f; 
     vec2 scale = vec2(scaleF,scaleF); 
     color = texture(buildingTex,tex_coord*scale); 
    } 
    if(vertex_id >= cube_vertices) 
    { 
     color = texture(groundTex,tex_coord); 
    } 


} 

を! 古いコードのコメント行を削除しようとしましたが、一部しか削除できないようですが、触れられないものもあれば、シェイダーをコンパイルすることもできます。

この瞬間シェーダは以下のとおりです。

// #version 450 core 

// in vec2 tex_coord; 
// in flat int vertex_id; 
// out vec4 color; 

// layout (binding = 20) uniform sampler2D buildingTex; 
// layout (binding = 21) uniform sampler2D groundTex; 

// int cube_vertices; 
// if(vertex_id < cube_vertices) 


#version 450 core 
in vec2 tex_coord; 
in flat int vertex_id; 
out vec4 color; 
layout (binding = 20) uniform sampler2D buildingTex; 
layout (binding = 21) uniform sampler2D groundTex; 
const int cube_vertices = 36; 
const int ground_vertices = 4; 
void main(void) 
{ 

    if(vertex_id < cube_vertices) 
    { 
     float scaleF = .5f; 
     vec2 scale = vec2(scaleF,scaleF); 
     color = texture(buildingTex,tex_coord*scale); 
    } 
    if(vertex_id >= cube_vertices) 
    { 
     color = texture(groundTex,tex_coord); 
    } 


} 

と私がコメントしたコードからもう削除することはできませんようです。

これは私の人生の中で最も非合理的な問題であると思われ、この同じエラー警告を持つ他の質問が私の場合と一致しない方法で解決されたので、私は新しいクエストを開きます。

ps:私は完全に新しいシェーダを作ろうとしましたが、動作しませんでした。

pps:emacsのメジャーモードを変更してから(emacsのinitファイルを変更しないで!)、私がcppファイルで使用する通常のショートカットを使用するために問題が発生します。シェーダファイル.vert、.frag ...)でも、デフォルトモードを復元してemacsを再起動しても、シェーダはコンパイルされません!

EDIT:これは私はOPからシェーダ

const char* Shader::loadShader(std::string shaderPath) 
    { 
    std::ifstream temp_ss(shaderPath,std::ifstream::in); 
    if(temp_ss) 
     { 
    char c; 
    char *ss = new char[shader_size]; 

    unsigned i = 0 ; 
    while(temp_ss.get(c)) 
     { 

     ss[i++] = c; 
     } 

    std::cout<<std::ends; 
    //ends adds a null, and then flushes the buffer 
    //if i don't use it , often, the window does not show anything 
    //I could use std::cout<<std::endl; in place of ends, 
    //but ends seem a more polite solution to me 



//CHECK SHADER 
    for(int i = 0; i < shader_size; i++) 
     if(ss[i] == '\0') 
     std::cout<<"shader.cpp::ERROR: NULL CHARACTER FOUND ON SHADER "<< 
      shaderPath<<std::endl; 

    return ss; 

     } 
    else 
     std::clog<<"shader.cpp::loadShader() : ERROR ::: no shaders found at the path : "<<shaderPath<<std::endl; 



    } 
+0

このテキストをシェーダーに取り込むために使用しているコードを確認する必要があります。確かにそこにバグがあります。 –

+0

コピー&ペーストには、不要な文字(大体は目に見えないもの)が含まれていることがあります(何も表しません)。コンパイラはそれを検出します。 – Ripi2

+0

コンパイラは通常、エラーの行を指示します。 – Ripi2

答えて

1

をロードするために使用する方法である:

要約すると:シェーダファイルがnullで終了しなければならない、私はシェーダのソースをロードする機能を変更します

const char* Shader::loadShader(std::string shaderPath) 
    { 
    std::ifstream temp_ss(shaderPath,std::ifstream::in); 
    if(temp_ss) 
     { 
    char c; 
    char *ss = new char[shader_size]; 

    unsigned i = 0 ; 
    while(temp_ss.get(c)) 
     { 

     ss[i++] = c; 
     } 

    //CHECK SHADER 
     bool nullTerminated = false; 
    for(int i = 0; i < shader_size; i++) 
     if(ss[i] == '\0') 
     nullTerminated = true; 

    if(!nullTerminated) 
     ss[shader_size++] = '\0'; 

    return ss; 

     } 
    else 
     std::clog<<"shader.cpp::loadShader() : ERROR ::: no shaders found at the path : "<<shaderPath<<std::endl; 



    } 

とフラグメントシェーダがコンパイルされます。

関連する問題