java - GLSL 不受支持的版本

标签 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;
        }
    }

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

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

最佳答案

你好,我不是 Java 专家,我使用 JOGL 做了一些实验,所以我可能无法给你提示以在正确的方向上工作。

MAC 上换行的问题 How to append a newline to StringBuilder

第二个:

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

The #version directive must occur in a shader before anything else, except for comments and white space.

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

关于java - GLSL 不受支持的版本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47255057/

相关文章:

c++ - 纹理splat opengl的最有效方法?

c++ - 将 WGL 与 GLUT 结合起来,以实现 Windows 7 OpenGL 下的形状。缺少 GLUT INIT?

java - 读取图像宽度和高度的非常奇怪的问题(Java)

macos - Visual Studio Preview for Mac 2017 .NET Core 生成错误

java - OSX 上 JVM 的 Zombie http.proxyHost 设置

c - osx 上的 malloc() 类型转换错误

c++ - OpenGL - 如果是 alpha,不要写深度

java - 尽管程序一次扫描一个元素,但程序仍在无限地获取输入

java - 灰熊 PRESERVE_HEADER_CASE

java - 如何将元素列表添加到二叉搜索 TreeMap 中?