2017-02-27 17 views
0

画面にレンダリングするのに問題があります。シェーダ付き頂点バッファオブジェクト/頂点配列オブジェクト

private void initVBO() { 
    vao = GL30.glGenVertexArrays(); 
    GL30.glBindVertexArray(vao); 

    float[] vertices = { 
      -0.5f, 0.5f, 0f, 
      0.5f, 0.5f, 0f, 
      0.5f, -0.5f, 0f, 
      -0.5f, -0.5f, 0f 
    }; 
    FloatBuffer vertBuffer = BufferUtils.createFloatBuffer(vertices.length); 
    vertBuffer.put(vertices); 
    vertBuffer.flip(); 

    this.vboID = GL15.glGenBuffers(); 
    GL15.glBindBuffer(GL15.GL_ARRAY_BUFFER, this.vboID); 
    GL15.glBufferData(GL15.GL_ARRAY_BUFFER, vertBuffer, GL15.GL_STATIC_DRAW); 
    positionAttribute = GL20.glGetAttribLocation(getMaterial().getShader() 
      .getProgram(), "position"); 
    GL20.glEnableVertexAttribArray(positionAttribute); 
    GL20.glVertexAttribPointer(positionAttribute, 3, GL11.GL_FLOAT, false, 0, 
      0); 

    Color c = getMaterial().getColor(); 
    float[] colors = { 
     c.red, c.green, c.blue, c.alpha, 
     c.red, c.green, c.blue, c.alpha, 
     c.red, c.green, c.blue, c.alpha, 
    }; 
    FloatBuffer colorBuffer = BufferUtils.createFloatBuffer(colors.length); 
    colorBuffer.put(colors); 
    colorBuffer.flip(); 

    this.vbocID = GL15.glGenBuffers(); 
    GL15.glBindBuffer(GL15.GL_ARRAY_BUFFER, this.vbocID); 
    GL15.glBufferData(GL15.GL_ARRAY_BUFFER, colorBuffer, GL15.GL_STATIC_DRAW); 
    colorAttribute = GL20.glGetAttribLocation(getMaterial().getShader().getProgram 
      (), "color"); 
    GL20.glEnableVertexAttribArray(colorAttribute); 
    GL20.glVertexAttribPointer(colorAttribute, 4, GL11.GL_FLOAT, false, 0, 0); 

    byte[] indices = { 
      0, 1, 2, 
      2, 3, 0 
    }; 
    ByteBuffer indicesBuffer = BufferUtils.createByteBuffer(indices.length); 
    indicesBuffer.put(indices); 
    indicesBuffer.flip(); 

    this.vboiID = GL15.glGenBuffers(); 
    GL15.glBindBuffer(GL15.GL_ELEMENT_ARRAY_BUFFER, this.vboiID); 
    GL15.glBufferData(GL15.GL_ELEMENT_ARRAY_BUFFER, indicesBuffer, 
      GL15.GL_STATIC_DRAW); 

    GL30.glBindVertexArray(0); 

    GL20.glDisableVertexAttribArray(positionAttribute); 
    GL20.glDisableVertexAttribArray(colorAttribute); 

    GL15.glBindBuffer(GL15.GL_ARRAY_BUFFER, 0); 
    GL15.glBindBuffer(GL15.GL_ELEMENT_ARRAY_BUFFER, 0); 
} 

public void render() { 
    GL20.glUseProgram(getMaterial().getShader().getProgram()); 

    GL30.glBindVertexArray(this.vao); 
    GL20.glEnableVertexAttribArray(positionAttribute); 
    GL20.glEnableVertexAttribArray(colorAttribute); 

    GL15.glBindBuffer(GL15.GL_ELEMENT_ARRAY_BUFFER, this.vboiID); 

    GL11.glDrawElements(GL11.GL_TRIANGLES, 6, GL11.GL_BYTE, 0); 

    GL15.glBindBuffer(GL15.GL_ELEMENT_ARRAY_BUFFER, 0); 
    GL20.glDisableVertexAttribArray(colorAttribute); 
    GL20.glDisableVertexAttribArray(positionAttribute); 
    GL30.glBindVertexArray(0); 
    GL20.glUseProgram(0); 
} 

シェーダは正しくコンパイルされており、位置と色の属性を正しくバインドしています。私はglOrthoを使っています。イミディエイトモードでの描画はうまく動作するので、正しく設定されています。私は、問題がインデックスを作成したものか、glVertexAttribPointer内の問題かどうかはわかりません。私はちょうど画面に描画された色の四角形を取得しようとしています。

更新: バーテックスシェーダ:

#version 150 

in vec3 position; 
in vec4 color; 

out vec4 passColor; 

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

フラグメントシェーダ:

#version 150 

in vec4 passColor; 

out vec4 outColor; 

void main(void) { 
    outColor = vec4(1.0, 1.0, 1.0, 1.0); 
} 

私もINITを更新し、上記のコードをレンダリングします。また、ここではシェーダのロードコードは次のとおりです。

private void load(File vertex, File fragment) { 
     this.vertexID = FileUtility.loadShader(vertex, GL20.GL_VERTEX_SHADER); 
     this.fragmentID = FileUtility.loadShader(fragment, GL20.GL_FRAGMENT_SHADER); 

     programID = GL20.glCreateProgram(); 
     GL20.glAttachShader(programID, vertexID); 
     GL20.glAttachShader(programID, fragmentID); 

     GL20.glBindAttribLocation(programID, 0, "position"); 
     GL20.glBindAttribLocation(programID, 1, "color"); 

     GL30.glBindFragDataLocation(programID, 0, "outColor"); 

     GL20.glLinkProgram(programID); 
     GL20.glValidateProgram(programID); 

     int status = GL20.glGetProgrami(programID, GL20.GL_LINK_STATUS); 
     if (status != GL11.GL_TRUE) { 
      Log.print(LogLevel.Error, GL20.glGetProgramInfoLog(programID)); 
     } 
    } 
+0

に表示される何かをしなければなりませんか? –

+0

私は、 'GL11.glViewport(0、0、Configuration.getInstance()を使って正字行列を作成していますが、' glOrtho'は '#110 'と' gl_ProjectionMatrix'などを使用しない限り、 ).getWindowWidth()、 Configuration.getInstance()。getWindowHeight()); GL11.glMatrixMode(GL11.GL_PROJECTION); GL11.glLoadIdentity(); i GL11.glOrtho(-1,1,1、-1,1、-1); GL11.glMatrixMode(GL11.GL_MODELVIEW); シェーダ内に投影行列を設定しません。私は頂点の色を設定しています。 – Greymouth

+0

拡張されていない '#version 120'シェーダで' in'/'out'をどのように使う予定ですか? – genpfault

答えて

0

問題の多くは、あなたのVBOが実際にバインドされていないということで主なものは、ここにあります。

VAOを作成し、バインドしてすぐにバインドを解除します。したがって、glBindVertexArray(0)へのコールを削除するか、initVBOの下部にプッシュします。また、VAOをバインド解除するまでは、VBOをバインド解除しないでください。そうしないと、VAOはVBOにバインドされません。

あなたはシェーダーを投稿していませんが、少なくともGLSL 1.30にアクセスできるVAOを使用しています。シェーダ付きのglOrthoは簡単にサポートされ、GLSL 1.20で廃止され、コアプロファイルで削除されました。私は、固定機能マトリックススタックからできるだけ早く離れることを強く勧めます。 LWJGLには独自の行列クラスがあり、スイッチは本当にシンプルでなければなりません。

シェーダ内の他の問題がなければ、最初の事はあなたの射影行列が頂点シェーダに設定なっているどのように画面

+0

'GL30.glBindVertexArray(0);を更新しました。 GL20.glDisableVertexAttribArray(positionAttribute); GL20.glDisableVertexAttribArray(colorAttribute); GL15.glBindBuffer(GL15.GL_ARRAY_BUFFER、0); GL15.glBindBuffer(GL15.GL_ELEMENT_ARRAY_BUFFER、0); 私はこの順番ですべてを下に移動しましたが、まだ何も描画していません。 – Greymouth

+0

シェイダーで質問を更新できますか?また、バックフェースカリングが無効になっていない場合は無効にしてください。顔がカリングされていないことを確認してください。 –

+0

コードを更新して追加しました。 – Greymouth

関連する問題