2017-12-19 17 views
2

Folgende GLSL Fragment-Shader kompiliert fragmentieren und wie erwartet funktioniert:OpenGL GLSL erwarten "::" bei Token "<int-const>", wenn Klemme Hinzufügen() Shader

#version 330 core 
out vec3 color; 
in float U; 
in vec4 vertexNormal_worldSpace; 
uniform sampler1D TextureSampler; 
uniform vec4 LightPos; 
void main() 
{ 
    float cosT = dot(normalize(vertexNormal_worldSpace.xyz),normalize(LightPos.xyz)); 
    color = cosT * texture(TextureSampler,U).rgb; 
} 

Allerdings, wenn ich Zeile ändern 9 bis Klemme der Wert von "Kosten" zwischen 0 und 1:

float cosT = clamp(dot(normalize(vertexNormal_worldSpace.xyz),normalize(LightPos.xyz)),0.0,1.0); 

ich die Fehler:

0(1) : error C0000: syntax error, unexpected integer constant, expecting "::" at token "<int-const>" 
0(10) : error C7532: global function texture requires "#version 130" or later 

Dies scheint zu sagen, dass der Fehler in der ersten Zeile erscheint, aber dort hat sich nichts geändert. Außerdem deutet der zweite Fehler darauf hin, dass es ein Problem mit der Version von GLSL gibt, die ich verwende, jedoch sollte #version 330 core eine spätere Version als #version 130 sein, wie die Fehlermeldung angibt.

EDIT: Das ist mein Code in Shadern zum Laden ist:

static GLuint LoadShaders(const char* vertex_file_path, const char* frag_file_path){ 
    GLuint VertID = glCreateShader(GL_VERTEX_SHADER); 
    GLuint FragID = glCreateShader(GL_FRAGMENT_SHADER); 

    char const* VertPointer = ReadShaderFile(vertex_file_path); 
    char const* FragPointer = ReadShaderFile(frag_file_path); 
    glShaderSource(VertID,1,&VertPointer,NULL); 
    glCompileShader(VertID); 


    GLint Result = GL_FALSE; 
    int InfoLogLength; 
    glGetShaderiv(VertID, GL_COMPILE_STATUS, &Result); 
    glGetShaderiv(VertID, GL_INFO_LOG_LENGTH, &InfoLogLength); 
    if (InfoLogLength > 0){ 
     std::vector<char> VertexShaderErrorMessage(InfoLogLength+1); 
     glGetShaderInfoLog(VertID, InfoLogLength, NULL, &VertexShaderErrorMessage[0]); 
     printf("%s\n", &VertexShaderErrorMessage[0]); 
    } 


    glShaderSource(FragID,1,&FragPointer,NULL); 
    glCompileShader(FragID); 
    glGetShaderiv(FragID, GL_COMPILE_STATUS, &Result); 
    glGetShaderiv(FragID, GL_INFO_LOG_LENGTH, &InfoLogLength); 
    if (InfoLogLength > 0){ 
     std::vector<char> FragmentShaderErrorMessage(InfoLogLength+1); 
     glGetShaderInfoLog(FragID, InfoLogLength, NULL, &FragmentShaderErrorMessage[0]); 
     printf("%s\n", &FragmentShaderErrorMessage[0]); 
    } 



    GLuint ProgramID = glCreateProgram(); 
    glAttachShader(ProgramID,VertID); 
    glAttachShader(ProgramID,FragID); 
    glLinkProgram(ProgramID); 


    glGetProgramiv(ProgramID, GL_LINK_STATUS, &Result); 
    glGetProgramiv(ProgramID, GL_INFO_LOG_LENGTH, &InfoLogLength); 
    if (InfoLogLength > 0){ 
     std::vector<char> ProgramErrorMessage(InfoLogLength+1); 
     glGetProgramInfoLog(ProgramID, InfoLogLength, NULL, &ProgramErrorMessage[0]); 
     printf("%s\n", &ProgramErrorMessage[0]); 
    } 
    return ProgramID; 


} 
static char const* ReadShaderFile(const char* path){ 
    std::string ShaderCode; 
    std::ifstream ShaderStream(path,std::ios::in); 
    if(ShaderStream.is_open()){ 
     std::string line = ""; 
     while (std::getline(ShaderStream,line)){ 
      ShaderCode +="\n"+line; 
     } 
     ShaderStream.close(); 
     return ShaderCode.c_str(); 
    }else{ 

    return 0;} 
} 

Diese im Grunde direkt aus dem Tutorial ist verfolge ich link, ist nur ändern Sie die Datei in der ReadShaderFile Funktion Lesen setzen.

EDIT 2: Mein OpenGL-Kontext mit der folgenden Version erstellt:

glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR,3); 
glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR,3); 
+0

Versuchen Sie, den Rückgabewert von 'dot()' an 'double' zu ​​übergeben oder' 0.0f' und '1.0f' für' clamp() '' 'minVal' /' maxVal' Argumente zu verwenden. Ich sehe keine ['clamp()' Überladung] (https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/clamp.xhtml), die '(genType, double, double)' braucht . – genpfault

+0

Das gibt '0 (9): Fehler C7502: OpenGL erlaubt Typ-Suffix 'f' nicht für konstante Literale in Versionen unter 120 '. Ich folge einem Tutorial [link] (http://www.opengl-tutorial.org/beginners-tutorials/tutorial-8-basic-shading/) und dort verwenden sie nur 0 und 1 und es funktioniert gut – jcg

+4

Warten, aren nimmst du '#version 330 core'? Typensuffixe sind im '330 Kern' perfekt cromulent. Bearbeiten Sie in einem [mcve], das Ihren Shader Loader demonstriert, es scheint, als würde Ihre '# version' Direktive irgendwie abgeschnitten. – genpfault

Antwort

2

Das Problem ist in der Tat die Shader-Loader. Sie fügen mit dieser Aussage

ShaderCode +="\n"+line; 

ein Newline-Zeichen (\ n) vor jede Zeile, die nach unten im Vergleich zu Ihrer Eingabe alles einer Zeile bewegt.

Da die Versionsanweisung in der ersten Zeile eines Shaders sein muss und Sie es in die zweite verschieben, scheint die Anweisung von Ihrem Treiber ignoriert zu werden. Mein NVIDIA-Treiber zum Beispiel heißt es:

error C0204: version directive must be first statement and may not be repeated 

Eine einfache Lösung wäre, Newline-Zeichen nach jeder Zeile hinzufügen anstatt vor, aber ich würde Sie dringend ermutigen, nicht ganze Dateien Zeile für Zeile, da dies zu lesen gib dir eine schreckliche Leistung. Zum Beispiel wird die Variable ShaderCode für jede Zeile in der Größe geändert, was bedeutet, dass Sie eine Speicherzuweisung und eine Kopieroperation für die gesamte Zeichenfolge erhalten. Schauen Sie sich this question on how to read complete files an.

Edit:

Ein weiteres Problem ist, dass Sie die c_str() Zeiger von lokalen Variablen sind zurück. Wenn die ReadShaderFile-Methode endet, wird die std::string ShaderCode-Variable nicht mehr im Gültigkeitsbereich (wodurch der Inhalt freigegeben wird) und der zurückgegebene Zeiger verweist auf eine ungültige Speicheradresse.

Lösung: Rückgabe des std :: string-Objekts anstelle des const char-Zeigers an seinen Inhalt.

+0

Das Ändern dieser Zeile in 'ShaderCode + = Zeile +" \ n ";' führt zum gleichen Fehler – jcg

+0

Ich habe ein anderes Problem mit Ihrem Code gefunden. Ich werde die Antwort in ein paar Minuten aktualisieren, aber im Grunde geben Sie einen Zeiger auf ein freigegebenes Speichersegment zurück. – BDL

+0

Ich kann Ihnen auch versichern, dass das Problem höchstwahrscheinlich nicht in Ihrem Shader selbst liegt. Es kompiliert gut für mich auf NVIDIA, AMD und Intel. – BDL