GLSL不支持的版本

3

我正在尝试使用OpenGL和LWJGL编译GLSL着色器。我使用的操作系统是macOS Sierra。

在尝试编译着色器时,我遇到了以下错误:

ERROR: 0:1: '' :  version '400' is not supported
ERROR: 0:1: '' : syntax error: #version

这段着色器代码在Windows上可以工作,但在macOS上测试时无法正常运行。 以下为该着色器代码:

#version 400 core

in vec3 position;
in vec2 textureCoords;

out vec2 pass_textureCoords;

uniform mat4 projectionMatrix;
uniform mat4 viewMatrix;

void main(void)
{
    gl_Position = projectionMatrix * viewMatrix * vec4(position, 1.0);
    pass_textureCoords = textureCoords;
}

这是我如何加载着色器的过程...

    private static int loadShader(String file, int type) throws IOException {
        StringBuilder shaderSource = new StringBuilder();
        try (BufferedReader reader = new BufferedReader(new InputStreamReader(
                    ShaderProgram.class.getClassLoader().getResourceAsStream("shaders/" + file))
            )) {

            String line;
            while ((line = reader.readLine()) != null) {
                shaderSource.append(line).append('\n');
            }

            System.out.println(shaderSource.toString());

            int shaderID = GL20.glCreateShader(type);

            GL20.glShaderSource(shaderID, shaderSource);
            GL20.glCompileShader(shaderID);

            if (GL20.glGetShaderi(shaderID, GL20.GL_COMPILE_STATUS) == GL11.GL_FALSE) {
                System.out.println(GL20.glGetShaderInfoLog(shaderID, 500));
                System.err.println("Error compiling shader " + file);
                System.exit(-1);
            }

            return shaderID;
        }
    }

打印语句返回了正确的输出结果,但仍然出现错误。

我在stackoverflow上搜索了很久,但每个人都说他们没有换行符而可以编译成功,而我也没有。我对此感到困惑。


3
为什么人们总认为逐行读取文件是一种好的读取方式?实际上,有更简单的方法。 - Nicol Bolas
@NicolBolas 嗯,我的意思是这并没有帮助到问题的解决,然而从性能上来看,Files.readAllBytes和逐行读取没有什么区别,只是前者更简洁易写。 - Erouax
3
glGetString(GL_SHADING_LANGUAGE_VERSION)的值是什么(或在JWJGL中的等效函数)?也许上下文不支持GLSL 4.0? - MuertoExcobito
@Erouax:问题在于逐行读取具有可怕的性能。每次调用append时,字符串将被重新分配和复制。 - BDL
@Erouax:如果你没有明确创建一个向前兼容的核心配置上下文,那么在OSX上你将被限制在GL2.1 / GLSL1.20上。 - derhass
@MuertoExcobito 它打印出1.20,我尝试使用#version 120,但仍然出现语法错误。 - Erouax
2个回答

2

你好,我不是Java专家,但我使用JOGL进行了一些实验,也许我可以给你一些方向提示。

MAC上的换行问题:如何将换行符附加到StringBuilder

第二:

https://www.khronos.org/registry/OpenGL/specs/gl/GLSLangSpec.4.00.pdf

#version指令必须在着色器中出现在任何其他内容之前,除了注释和空格。

这是在JOGL中RAW的样子,你可以看到版本指令后面需要换行,其他语句需要分号作为语句分隔符。

  // 
  // create fragment Shader
  int fragShader = gl4.glCreateShader(GL4.GL_FRAGMENT_SHADER);
  gl4.glShaderSource(fragShader, 1, 
    new String[]{"#version 420 \n"
    +"out vec4 fragColor;"
    +"void main(void) {"
    +"fragColor = vec4(0.2, 0.2, 0.5, 1.0);}" }, null);
    gl4.glCompileShader(fragShader);

JOGL和原始发布者使用的库可能会稍微不同地处理着色器源代码。 - gouessej
至少是OpenGL :) - nabr
是的,但据我所记,它们在处理终止字符'\0'方面有所不同,当我复活LibGDX的JOGL后端时,我必须注意这一点。 - gouessej
我几天后读到这篇文章,现在我认为他必须为Mac设置向前兼容模式:OpenGL: glfwWindowHint(GLFW_OPENGL_FORWARD_COMPAT, GL_TRUE);Java: https://stackoverflow.com/questions/19870053/linking-and-compiling-shaders-for-opengl-3-3-and-2-1-using-lwjgl - nabr

1
如果其他答案无法解决您的问题,我怀疑您正在使用错误的OpenGL版本创建OpenGL上下文。您需要创建核心配置文件的上下文 - 这也意味着不支持旧函数和功能,因此如果您使用了任何旧函数和功能,则需要将它们替换为更新的等效项。(核心配置文件不向后兼容。)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接