2016-12-06 23 views
1

joglを使用して基本的なゲームエンジンを組み合わせて、シェーダコードのユニフォーム変数にアクセスしたり更新したりするのにかなり大きな道のりがありました。ここでユニフォーム変数joglを使用して黒い画面を表示

は、私はマトリックスと関連するバッファを割り当てています方法です。ここで

protected float[] test_matrix = { 
    1.0f, 0.0f, 0.0f, 1.0f, 
    0.0f, 1.0f, 0.0f, 1.0f, 
    0.0f, 0.0f, 1.0f, 1.0f, 
    0.0f, 0.0f, 0.0f, 1.0f 
}; 
protected int matrix_size = test_matrix.length; 

FloatBuffer matrix_buffer = Buffers.newDirectFloatBuffer(test_matrix, 0, matrix_size); 

は、問題のコードです:

shaderProgram = gl.glCreateProgram(); 
gl.glAttachShader(shaderProgram, vertShader); 
gl.glAttachShader(shaderProgram, fragShader); 

pmvmatrix = new PMVMatrix(); 
transmatrix_location = gl.glGetUniformLocation(shaderProgram, "transformationMatrix"); 
gl.glUniformMatrix4fv(transmatrix_location, 400, false, matrix_buffer); 

pmvmatrix.glMatrixMode(GLMatrixFunc.GL_MODELVIEW); 
pmvmatrix.glLoadIdentity(); 

gl.glBindAttribLocation(shaderProgram, 0, "position"); 
gl.glBindAttribLocation(shaderProgram, 1, "color"); 

gl.glLinkProgram(shaderProgram); 

そしてここでは、私の頂点シェーダです:

#version 400 core 

in vec3 position; 

out vec3 color; 

uniform mat4 transformationMatrix; 

void main(void){ 
    gl_Position = transformationMatrix * vec4(position,1.0); 
    color = vec3(position.x+0.5,1.0,position.y+0.5); 
} 

シェーダは正常にコンパイルされています。頂点シェーダで「transformationMatrix *」を削除すると、オブジェクトは正しくレンダリングされます。

私のマトリックスは、4X4ではなく1X16マトリックスとして渡されていますか? glUniformMatrix4fv関数を正しく使用していますか?

+0

「transmatrix_location」はゼロ未満ですか? – genpfault

答えて

2
transmatrix_location = gl.glGetUniformLocation(shaderProgram, "transformationMatrix"); 
... 
gl.glLinkProgram(shaderProgram); 

間違った方向です。 Link, then Get:プログラム・オブジェクトが正常にリンクされるまで均一な変数に代入

...実際の場所は 知られていません。 のリンクが発生した後、コマンドglGetUniformLocationを使用して、均一変数の場所 を取得できます。 ...

+0

空白の画面が表示され、周囲のものを切り替えました。私のtransmatrix_location変数が '0'を返しています。それはゼロ以外の数字ですか? –

+0

@PeterHope:いいえ、ゼロは完全に有効です。 – genpfault

+0

ええと、今私はglLinkProgram、glGetUniformLocation、glUniformMatrix4fvを呼んでいます。そして、マトリックスモードとロードアイデンティティを設定しています。あれは正しいですか? –

関連する問題