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);
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
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
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