2017-11-14 21 views
0

OpenGLのプログラムIDにバインドするシェーダプログラムを作成できません。 次のように私のShaderProgramクラスが見えます:シェーダプログラムを作成できませんOpenGL LWJGL3

public abstract class ShaderProgram { 

private int programID; 
private int vertexShaderID; 
private int fragmentShaderID; 

public ShaderProgram(String vertexFile, String fragmentFile) {     // Constructor takes the file names for both shaders and loads them into memory 
                       // --- Vertex shader does points in 3d space --- fragment shader does colour --- 



    if (programID == -1) {              // Error checking for shader program 
     programID = GL20.glCreateProgram(); 
    } 
    if (programID == 0) { 
     System.out.println("Could not create shader program"); 
     System.exit(-1); 
    }  

    vertexShaderID = loadShader(vertexFile, GL20.GL_VERTEX_SHADER); 
    fragmentShaderID = loadShader(fragmentFile, GL20.GL_FRAGMENT_SHADER); 

    GL20.glAttachShader(programID, vertexShaderID);        // Bind shader to programID 
    GL20.glAttachShader(programID, fragmentShaderID); 
    bindAttributes(); 
    GL20.glLinkProgram(programID); 
    GL20.glValidateProgram(programID); 
} 

protected abstract void bindAttributes(); 

protected void bindAttribute(String variableName, int attribute) {    // Takes vao to bind to vertex shader 
    GL20.glBindAttribLocation(programID, attribute, variableName); 

} 

public void start() {               // Start shader program bound to programID 
    GL20.glUseProgram(programID); 
} 

public void stop() {               // Stop shader program 
    GL20.glUseProgram(0); 
} 

public void cleanUp() {               // Unbind shaderID's and delete program from memory 
    stop(); 
    GL20.glDetachShader(programID, vertexShaderID); 
    GL20.glDetachShader(programID, fragmentShaderID); 
    GL20.glDeleteShader(vertexShaderID); 
    GL20.glDeleteShader(fragmentShaderID); 
    GL20.glDeleteProgram(programID); 
} 

private int loadShader(String file, int type) {         // Read shader file input by filename and shader type 
                       //  and store it in a string buffer 
    StringBuilder shaderSource = new StringBuilder(); 

    InputStream in = Class.class.getResourceAsStream(file); 
    BufferedReader reader = new BufferedReader(new InputStreamReader(in)); 

    String line; 
    try { 
     while((line = reader.readLine()) != null) { 
      shaderSource.append(line).append("//\n"); 
     } 
     reader.close(); 
    } catch (IOException e) { 
     e.printStackTrace(); 
     System.err.println("Could not Load Shader File"); 
     System.exit(-1); 
    } 

    int shaderID = GL20.glCreateShader(type); 
    GL20.glShaderSource(shaderID, shaderSource);       // Creates shader by file and loads it into a new id 
    GL20.glCompileShader(shaderID); 

    if (GL20.glGetShaderi(shaderID, GL20.GL_COMPILE_STATUS) == GL11.GL_FALSE) {    // Get gl compile status of shader 

     System.out.println(GL20.glGetShaderInfoLog(shaderID, 1000));    // In case of error, force close and print what went wrong 
     System.err.println("Could not compile shader!"); 
     System.exit(-1); 
    } 

    return shaderID; 

} 

} 

次のようにJavaヒープエラーで戻っている: error

私は、添付のコードのすべてのための私のGitHubリポジトリへのリンクを添付しています。私はそれがglfwとうまくいかないと信じています。すべてのエンジンファイルは、renderEngineの境界パッケージ内にあります。前もって感謝します! GitHub KR0N05

+0

シェーダの作成時に有効なOpenGLコンテキストがありますか?デスクトップOpenGLやOpenGL-esを使用しているものを決定し、それに応じてタグを調整する必要があります。 – BDL

+0

私はopenGLを初めて使っていますので、私の無知をお詫び申し上げます。 init()上のディスプレイマネージャのディスプレイマネージャでOpenGLコンテキストを作成すると思います。しかし、私はこれを間違ってやっているかもしれません。どんな提案もありがとうございます。 @BDLの提案をありがとう! – KR0N05

+0

私はこの問題を解決しました。 @BDLは正しいですが、シェーダーの作成を呼び出す前に、render.prepareにコンテキストをロードしていませんでした。ありがとう! – KR0N05

答えて

0

私はこの問題を解決しました。 @BDLは正しいですが、シェーダーの作成を呼び出す前に、render.prepareにコンテキストをロードしていませんでした。ありがとう!

関連する問題