2017-08-27 13 views
0
の後に不正な非指示文

私はLWJGLを使ってJavaからopenglを学びたいと思っています。シェーダプログラムをコンパイルしようとするとエラーが発生するGLSL:#

java.lang.Exception: Error compiling shading code: 0:1(1): preprocessor error: Illegal non-directive after # 

私はCのみのJavaについて何も知らない。

#version 330 

layout (location =0) in vec3 position; 

void main() 
{ 
    gl_Position = vec4(position, 1.0); 
} 


#version 330 

out vec4 fragColor; 

main() 
{ 

    fragColor = vec4(0.0, 0.5, 0.5, 1.0); 
} 

これは私の2つのシェーダファイルです。

これはそれらをロードするコードです:

public void createVertexShader(String code) throws Exception{ 
     vertexShaderId = createShader(code,GL_VERTEX_SHADER); 
    } 

    public void createFragmentShader(String code) throws Exception{ 
     fragmentShaderId = createShader(code,GL_FRAGMENT_SHADER); 
    } 

    protected int createShader(String code, int type) throws Exception{ 
     int shaderId = glCreateShader(type); 
     if(shaderId == 0){ 
      throw new Exception("error createing shader. type: "+type); 
     } 

     glShaderSource(shaderId,code); 
     glCompileShader(shaderId); 

     if(glGetShaderi(shaderId, GL_COMPILE_STATUS) == 0){ 
      throw new Exception("Error compiling shading code: "+glGetShaderInfoLog(shaderId,1024)); 
     } 

     glAttachShader(programId, shaderId); 

     return shaderId; 
    } 



public static String loadResource(String fileName) throws Exception { 
     StringBuilder result = new StringBuilder(); 
     try (InputStream in = Utils.class.getClass().getResourceAsStream(fileName); 
       Scanner scanner = new Scanner(in, "UTF-8")) { 

      while(scanner.hasNext()){ 
       result.append(scanner.next()); 
      } 
     } 
     return result.toString(); 

私はこの単純なファイルをコンパイルするために何をする必要があるか理解していません。

StringBuilder builder = new StringBuilder(); 

     try (InputStream in = new FileInputStream(fileName); 
      BufferedReader reader = new BufferedReader(new InputStreamReader(in))) { 
      String line; 
      while ((line = reader.readLine()) != null) { 
       builder.append(line).append("\n"); 
      } 
     } catch (IOException ex) { 
      throw new RuntimeException("Failed to load a shader file!" 
             + System.lineSeparator() + ex.getMessage()); 
     } 
     String source = builder.toString(); 
     return source; 

これを別のプログラムで動作するシェーダローダーに変更しました。しかしここでも私はまだ未知の新しい識別子を取得しています。 何か?

+0

はい、それは言う:0:1(1):エラー:予期せぬ構文エラーNEW_IDENTIFIER – madmax

答えて

3

あなたがファイルを読む方法は、改行を含むすべての空白を捨てます。シェーダコンパイラは効果的に何かを読み取るため、エラーが発生します version330layout(....

glslシェーダがScannerでファイル全体を読み上げるのを止める(または少なくとも単語ごとに読み込まない)ため、空白と改行が重要です。空白を失うことなくファイル全体を読む方法についてはthis answersを見てください。

+0

ありがとう、私は別のプログラムで動作する別の方法でファイルを読み込もうとしました。私はまだ未知の新しい識別子エラーを取得しています – madmax