GLSL不支持的版本

时间:2017-11-12 23:11:48

标签: java macos opengl glsl

我正在尝试编译GLSL着色器,以便在OpenGL中使用LWJGL。我在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;
        }
    }

print语句返回正确的输出,但它仍然给我错误。

我已经在遍布stackoverflow上搜索了一个解决方案,但是每个人都说他们正在编译它而没有换行符,我有。我很困惑为什么会这样。

2 个答案:

答案 0 :(得分:2)

你好,不是这里的java专家,我做了一些使用JOGL的实验,所以也许我不能给你一个正确的方向工作的提示。

MAC新线路问题 How to append a newline to 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);

答案 1 :(得分:1)

如果其他答案没有为您解决问题,我怀疑您是否正在使用错误的OpenGL版本创建OpenGL上下文。您需要create a context with the Core Profile - 这也意味着旧版功能和功能支持,因此,如果您已使用其中任何一项,则需要更换它们更新的等价物。 (核心配置文件不向后兼容。)