2017-11-12 14 views
1

OpenGLでLWJGLで使用するためにGLSLシェーダをコンパイルしようとしています。私はmacOS Sierraにいる。GLSLサポートされていないバージョン

シェーダをコンパイルしようとしたとき、私は次のエラーを取得する:

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全体を検索しましたが、誰もが私が持っている改行なしでそれをコンパイルしていると言います。私はなぜこれが起こっているのか混乱しています。

+3

なぜ、ファイルを1行ずつ読むのがファイルを読むのに良いと思うのですか? [簡単な方法があります。](https://stackoverflow.com/a/326440/734069) –

+0

@NicolBolasまあ、それは手近な質問に役立つわけではありませんが、Files.readAllBytes(パフォーマンスは賢明です)と違いはありません一行ずつ読むだけで、それを書くのが本当に短くて済みます。 – Erouax

+3

'glGetString(GL_SHADING_LANGUAGE_VERSION)'(またはそれに相当するJWJGL)の値は何ですか?コンテキストがGLSL 4.0をサポートしていない可能性がありますか? – MuertoExcobito

答えて

1

こんにちは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); 
+0

オリジナルのポスターで使用されているJOGLとライブラリは、シェーダのソースコードを多少異なる方法で扱うかもしれません。 – gouessej

+0

は、少なくともそのOpenGLの:) – Nabr

+0

はいしかし、私が覚えている限りでは、終端文字「\ 0」を処理する際のそれらの間の差がある、私は私がLibGDXのJOGLのバックエンドを復活させたときにの世話をしなければなりませんでした。 – gouessej

0

もう1つ答えても問題が解決しない場合は、誤ったOpenGLバージョンのOpenGLコンテキストを作成している可能性があります。 create a context with the Core Profileにする必要があります。これは、従来の関数と機能がではなく、であることを意味しています。そのいずれかを使用している場合は、より新しい同等関数で置き換える必要があります。 (コアプロファイルは下位互換性がありません)

関連する問題