2017-02-13 16 views
-2

私の3Dエンジンのプログラミングに悩まされています。私は多くのシェーダーが働いていて、ちょうど新しいシェーダーを作りました。しかし何らかの理由で、私の統一変数は奇妙な行動を示しています。GLSLのユニフォームが消える

ユニフォームを使用しないと、その変数の位置は-1に設定されます。しかし私は私の制服が使用されていることを知っています。これが私の気持ちです。 (すなわち、シェーダは意味をなさないが、それはまだ動作しなければならない)

頂点シェーダ:

#version 150 

in vec3 position; 
in vec2 texCoords; 

out mat4 hilf; 

uniform mat4 projectionMatrix; 
uniform mat4 viewMatrix; 

uniform float radius; 

void main(void){ 
    hilf = projectionMatrix; 
    gl_Position = projectionMatrix * vec4(position,1.0); 
} 

は「半径」の位置は次のように設定され-1(それが使用されていないため)。 viewmatrixと同じです。しかし私の "projectionMatrix"の位置も-1に設定されています!それは私には意味がありません。今、おかしな部分が来る。私が行:gl_Position = projectionMatrix * vec4(position,1.0);を削除すると、投影行列の位置は-1より大きくなります。

私のJavaの呼び出しは次のようになります。

location_projectionMatrix = super.getUniformLocation("projectionMatrix"); 
location_viewMatrix = super.getUniformLocation("viewMatrix"); 
location_radius = super.getUniformLocation("radius"); 

//----------------- 
protected int getUniformLocation(String uniformName){ 
    return GL20.glGetUniformLocation(programID, uniformName); 
} 

これはバグですか?私は何かが欠けていたか?ここで何が起こっているのですか?

+0

あなたのOpenGLコードも表示してください。 – eldo

+2

あなたのセット/所在地コードを取得しないと、これはちょうど推測に過ぎません。あなたは何か(たとえば同じ場所)を2回設定しようとしています。 – Ripi2

答えて

0

変数radiusを使用していないので、シェーダをコンパイルすると省略されます(最適化されます)。したがって、コンパイル後のシェーダにはその変数は含まれません。そのため、場所は無効な値-1に設定されています。

シェイダーの半径をmain関数内で使用すると、有効な位置値が返されます。

関連する問題