2016-04-12 18 views
0

LWJGLを使用してJavaでゲームエンジンを作成する際のチュートリアルに従っていました。私はGLSLにフラグメントシェーダを書き、それがbasicFragment.fs呼ば:OpenGLフラグメントシェーダのコンパイルの問題

#version 330 

out vec4 fragColor; 

void main() 
{ 
    fragColor = vec4(0,0, 1.0, 1.0, 1.0); 
} 

は今、私はシェーダーをコンパイルする方法を記述するためにチュートリアルを踏襲し、それは私がエラーを取得することをここにあります。まず、Shaderクラスがあります。

package com.base.engine; 

import static org.lwjgl.opengl.GL20.*; 
import static org.lwjgl.opengl.GL21.*; 
import static org.lwjgl.opengl.GL32.*; 

public class Shader 
{ 
    private int program; 

    public Shader() 
    { 
     program = glCreateProgram(); 

     if(program == 0) 
     { 
      System.err.println("Shader creation failed: Could not find valid memory location in constructor"); 
      System.exit(1); 
     } 
    } 

    public void bind() 
    { 
     glUseProgram(program); 
    } 

    public void addVertexShader(String text) 
    { 
     addProgram(text, GL_VERTEX_SHADER); 
    } 

    public void addGeometryShader(String text) 
    { 
     addProgram(text, GL_GEOMETRY_SHADER); 
    } 

    public void addFragmentShader(String text) 
    { 
     addProgram(text, GL_FRAGMENT_SHADER); 
    } 

    public void compileShader() 
    { 
     glLinkProgram(program); 

     if(glGetProgrami(program, GL_LINK_STATUS) == 0) 
     { 
      System.err.println(glGetShaderInfoLog(program, 1024)); 
      System.exit(1); 
     } 

     glValidateProgram(program); 

     if(glGetProgrami(program, GL_VALIDATE_STATUS) == 0) 
     { 
      System.err.println(glGetShaderInfoLog(program, 1024)); 
      System.exit(1); 
     } 
    } 

    private void addProgram(String text, int type) 
    { 
     int shader = glCreateShader(type); 

     if(shader == 0) 
     { 
      System.err.println("Shader creation failed: Could not find valid memory location when adding shader"); 
      System.exit(1); 
     } 

     glShaderSource(shader,text); 
     glCompileShader(shader); 

     if(glGetShaderi(shader, GL_COMPILE_STATUS) == 0) 
     { 
      System.err.println(glGetShaderInfoLog(shader, 1024)); 
      System.exit(1); 
     } 

     glAttachShader(program, shader); 
    } 
} 

次に、私のゲームクラスで私は次のことを行います。 (うまくいけば、コードは自明である私はどこか不明確だなら、私に教えてください。):

public class Game 
{ 
    private Mesh mesh; 
    private Shader shader; 

    public Game() 
    { 
     mesh = new Mesh(); 
     shader = new Shader(); 

     Vertex[] data = new Vertex[] {new Vertex(new Vector3f(-1,-1,0)), 
             new Vertex(new Vector3f(-1,1,0)), 
             new Vertex(new Vector3f(0,1,0))}; 

     mesh.addVertices(data); 

     shader.addVertexShader(ResourceLoader.loadShader("basicVertex.vs")); 
     shader.addFragmentShader(ResourceLoader.loadShader("basicFragment.fs")); 
     shader.compileShader(); 
    } 

    public void render() 
    { 
     shader.bind(); 
     mesh.draw(); 

    } 

私は関数を呼び出すときに、基本的には、

shader.addFragmentShader(ResourceLoader.loadShader("basicFragment.fs")); 

機能は私に、このエラーを与える:

3.3.0 - Build 8.15.10.2712 
ERROR: 0:7: 'constructor' : too many arguments 

頂点シェーダを実装するだけでエラーは発生しないため、フラグメントシェーダと判断しました。

そのエラー

はシェーダクラスのこの部分から投げされています。問題は、いくつかのコンストラクタはあまりにも多くの引数を持っているので、シェーダがコンパイルされていないことであると信じて私をリード

if(glGetShaderi(shader, GL_COMPILE_STATUS) == 0) 
{ 
    System.err.println(glGetShaderInfoLog(shader, 1024)); 
    System.exit(1); 
} 

を。私はそれがどのコンストラクタを指しているのか正確にはわかりません。

ご協力いただければ幸いです。

答えて

0

I don't know exactly what constructor it is referring to.

あなたのシェーダコードで1:

fragColor = vec4(0,0, 1.0, 1.0, 1.0); 

vec4コンストラクタです。そしてあなたはそれに5つのパラメータを与えました。 "0,0"はそのうちの2つです。むしろカンマではなくピリオドを使うことを意図していると思われます。

+0

ありがとうございます。私は私の質問を投稿した後少しそれを考え出したが、私はその応答に感謝する。うまくいけば、他の人たちを助けることでしょう。 –