Opengl 为什么此GLSL着色器会产生语法错误?

Opengl 为什么此GLSL着色器会产生语法错误?,opengl,glsl,Opengl,Glsl,我对使用/编写着色器相当陌生,因此可能缺少一些内容,但下面的GLSL片段着色器产生了语法错误 复古框架glsl #version 440 uniform sampler2D texture; uniform ivec3 precision; // A syntax error happens on this line for some reason void main() { vec3 prec_fac = vec3(float(1 << precision.x), fl

我对使用/编写着色器相当陌生,因此可能缺少一些内容,但下面的GLSL片段着色器产生了语法错误

复古框架glsl

#version 440

uniform sampler2D texture;
uniform ivec3 precision; // A syntax error happens on this line for some reason

void main() {
    vec3 prec_fac = vec3(float(1 << precision.x), float(1 << precision.y), float(1 << precision.z));
    vec3 factor_adjust = 1.0f / (prec_fac - 1.0f);
    vec4 color = texture2D(texture, gl_TexCoord[0].xy);
    vec4 low_color = vec4(
        floor(color.x * (prec_fac.x + 0.01f)) * factor_adjust.x,
        floor(color.y * (prec_fac.y + 0.01f)) * factor_adjust.y,
        floor(color.z * (prec_fac.z + 0.01f)) * factor_adjust.z,
        1.0f);

    gl_FragColor = low_color;
}
#version 440 compatibility

uniform sampler2D texture;
uniform ivec3 bit_precision; // A syntax error happens on this line for some reason

void main() {
    vec3 prec_fac = vec3(float(1 << bit_precision.x), float(1 << bit_precision.y), float(1 << bit_precision.z));
    vec3 factor_adjust = 1.0f / (prec_fac - 1.0f);
    vec4 color = texture2D(texture, gl_TexCoord[0].xy);
    vec4 low_color = vec4(
        floor(color.x * (prec_fac.x + 0.01f)) * factor_adjust.x,
        floor(color.y * (prec_fac.y + 0.01f)) * factor_adjust.y,
        floor(color.z * (prec_fac.z + 0.01f)) * factor_adjust.z,
        1.0f);

    gl_FragColor = low_color;
}
< >编辑2:添加加载着色器的C++代码。< /P> 编辑3:已解决。更正的GLSL着色器如下所示:

复古框架glsl

#version 440

uniform sampler2D texture;
uniform ivec3 precision; // A syntax error happens on this line for some reason

void main() {
    vec3 prec_fac = vec3(float(1 << precision.x), float(1 << precision.y), float(1 << precision.z));
    vec3 factor_adjust = 1.0f / (prec_fac - 1.0f);
    vec4 color = texture2D(texture, gl_TexCoord[0].xy);
    vec4 low_color = vec4(
        floor(color.x * (prec_fac.x + 0.01f)) * factor_adjust.x,
        floor(color.y * (prec_fac.y + 0.01f)) * factor_adjust.y,
        floor(color.z * (prec_fac.z + 0.01f)) * factor_adjust.z,
        1.0f);

    gl_FragColor = low_color;
}
#version 440 compatibility

uniform sampler2D texture;
uniform ivec3 bit_precision; // A syntax error happens on this line for some reason

void main() {
    vec3 prec_fac = vec3(float(1 << bit_precision.x), float(1 << bit_precision.y), float(1 << bit_precision.z));
    vec3 factor_adjust = 1.0f / (prec_fac - 1.0f);
    vec4 color = texture2D(texture, gl_TexCoord[0].xy);
    vec4 low_color = vec4(
        floor(color.x * (prec_fac.x + 0.01f)) * factor_adjust.x,
        floor(color.y * (prec_fac.y + 0.01f)) * factor_adjust.y,
        floor(color.z * (prec_fac.z + 0.01f)) * factor_adjust.z,
        1.0f);

    gl_FragColor = low_color;
}
#版本440兼容性
二维纹理均匀;
均匀ivec3位_精度;//由于某种原因,此行发生语法错误
void main(){

vec3 prec_fac=vec3(float(1该行将给出一个错误:

uniform ivec3 precision;
因为
precision
是一个关键字,不能将关键字用作变量名。它用于精度限定符。虽然精度限定符在桌面OpenGL着色器中没有任何功能,但它们已添加到语法中,以便与OpenGL ES中的着色器兼容

还请注意,您在此处使用的
texture2D()
函数在core配置文件中已被弃用:

vec4 color = texture2D(texture, gl_TexCoord[0].xy);
在核心配置文件中,这将替换为重载的
texture()
函数:

vec4 color = texture(texture, gl_TexCoord[0].xy);
实际上,如果您使用
gl_TexCoord
,您仍然需要使用兼容性配置文件。这在核心配置文件中不可用。因此,除非您完全转换到核心配置文件,否则代码中的第一行需要是:

#version 440 compatibility

发生了什么错误?@Nicolas对此表示抱歉。现在添加了错误消息。这是您从OpenGL返回的实际信息日志,还是其他原因?此外,我怀疑您的加载代码有问题;让我们获取完整信息。这是在Windows 10上使用msys2中的mingw64调试Eclipse CDT时的输出,但我将尝试显示更多com请举个例子。顺便说一句,着色器是使用SFML 2.4加载的。好的,谢谢。是的,它应该是一个兼容性配置文件。正如我所说,我对GLSL相当陌生。当人们在互联网上找到的示例不清楚它们用于哪个版本的OpenGL以及是否用于兼容性时,学习技术是很困难的或核心配置文件。