2017-03-04 7 views
-3

私はGL20.glUniformMatrix4fv()を呼び出すたびに、シェーダプログラムで認識されません。デバッグ後、すべてのシェーダとプログラムはエラーを返しません。GLSL 120頂点シェーダは、シェーダプログラムよりもアクティブユニフォームの表示が遅い

キューブがウィンドウに描画されます(プロジェクションがクワッドとして表示されないため)。

#version 120 
attribute vec3 position; 
uniform mat4 modelView; 
uniform mat4 proj; 
void main() 
{ 
    gl_Position = vec4(position, 1.0); // See how we directly give a vec3 to vec4's constructor 
} 

何もウィンドウに描画されません:エラーなしでコンパイルして、作品 シェーダプログラム。 シェーダプログラムはエラーなしでコンパイルが、何も画面上に示しています

#version 120 
attribute vec3 position; 
uniform mat4 modelView; 
uniform mat4 proj; 
void main() 
{ 
    gl_Position = proj * vec4(position, 1.0); // See how we directly give a vec3 to vec4's constructor 
} 

フラグメントシェーダ:

#version 120 
void main() 
{ 
    gl_FragColor = vec4(0.0, 1.0, 1.0, 1.0); 
} 

プログラム常にリンクしてコンパイルしますが、均一なprojのdoesntの仕事。

これは、均一なデータが送信されるコードである。

GL20.glUseProgram(shaderProgram); 
    int model = GL20.glGetAttribLocation(shaderProgram, "modelView");//used get attrib here instead of GL20.glGetUniformLocation(); 
    Matrix4f modelView = new Matrix4f().translate(.5f, .5f, .5f); 
    GL20.glUniformMatrix4fv(model, false, modelView.get(buffer)); 

    int proj = GL20.glGetAttribLocation(shaderProgram, "proj");//and here 
    Matrix4f projection = new Matrix4f(). 
          perspective((float)Math.toRadians(45), 1.0f, 0.1f, 100f). 
          lookAt(0.0f, 0.0f, -3.0f, //eye 
           0.0f, 0.0f, 0.0f, //center 
           0.0f, 1.0f, 0.0f);//up 
    GL20.glUniformMatrix4fv(proj, false, projection.get(buffer)); 

    //draw container 
    GL15.glBindBuffer(GL15.GL_ARRAY_BUFFER, VBO); 
    GL11.glDrawArrays(GL_TRIANGLES, 0, 36); 
    GL15.glBindBuffer(GL15.GL_ARRAY_BUFFER, 0); 

まだ何も画面に描画されていないがgluniformmatrix4fv呼び出し前gluseprogramを置く{更新します}。アイデンティティ行列がprojに送られ、次にvec4が乗算されると、キューブは消える。

チェック:頂点シェーダで

GL20.glGetShaderiv(vertexID, GL20.GL_ACTIVE_UNIFORMS, success); 

を確認しながらゼロ を返す:シェーダプログラムで

GL20.glGetProgramiv(shaderID, GL20.GL_ACTIVE_UNIFORMS, success); 

がPROJとモデルビューは、mainメソッドで使用されているときに1又は2返します。

[解決済みの問題] は、get uniform locationではなくget attrib locationを使用していました。

+0

'projection.get'とは何ですか? [lwjgl Matrix4f](http://legacy.lwjgl.org/javadoc/org/lwjgl/util/vector/Matrix4f.html)クラスではこの関数が提供されていません – BDL

+0

LWJGLバージョン3はすべての行列計算を削除しました。私はJOML、JavaのOpenGLの数学ライブラリを使用しています。行列のgetメソッドを呼び出すたびに、その行列にあったものが返され、それをバッファに入れます。これは、その関数の大部分で必要なデータ構造です。 –

+0

'buffer'は16-floatバッファですか?実際にMVCEを作成する必要があります。それ以外の場合は、問題がどこにあるかを推測できます。 – BDL

答えて

0

ユニフォームはOpenGLのプログラムの状態でです。です。すべてのglUniform*()関数は、現在アクティブなプログラムオブジェクトののユニフォームを設定します。あなたはその非常にプログラムの制服を設定する前にglUseProgramに電話する必要があります。

+0

glUseProgramを前後に配置しようとしましたが、それでも結果は変わりません。私が均一なmat4を追加し、mainメソッドでそれを掛けると、プログラムは画面に何も描画しません。すべてがエラーなしでコンパイルされ、リンクされます。どのくらいのglユニフォームがあるかチェックするとき、glgetshaderivとglgetprogramivはmat4がメインメソッドにあるときに1または2を返します。何も正しく描画されません。 –

+0

ユニフォームの設定が問題だと思いますか? – derhass

+0

設定されていても実行は変更されませんが、行列にベクトルを掛け合わせると、画面上のものは消えてしまいます。シェイダーがユニフォームを正しく受け取っていないことが問題だと思います。すべてがコンパイルされるので、ベクトルで乗算すると、mat4は空であると仮定します。 –

関連する問題