2015-10-25 2 views
6

私は特定の場所に均一な変数をバインドしようとしていますが、私は現在、どのようにうまくいかないことができます。GLSLで一様な場所をバインドするにはどうすればよいですか?

をバインドするには、(その例頂点/ノーマルデータ用)属性、私は次のコードを使用します。

Override 
protected void bindAttributes() { 
    super.bindAttribute(1, "position"); 
    super.bindAttribute(2, "textureCoords"); 
    super.bindAttribute(3, "normal"); 
} 
protected void bindAttribute(int attribute, String variableName){ 
    GL20.glBindAttribLocation(programID, attribute, variableName); 
} 

私は統一変数について同じことをしたいと思います。

現在、私はこのように自動的に割り当てられた場所を取得しています:

public int location_transformationMatrix; 
public int location_lightPosition; 
public int location_lightColour; 

@Override 
public void getAllUniformLocations(){ 
    location_transformationMatrix = super.getUniformLocation("transformationMatrix"); 
    location_lightPosition = super.getUniformLocation("lightPosition"); 
    location_lightColour = super.getUniformLocation("lightColour"); 
} 

をしかし、私はその後、属性を結合おりますので、このような照明やなどのデータが失われ、最高の状態で、ありますそして最悪の場合、それをプレイしようとする人々の約60%がゲームをクラッシュさせています。

答えて

2

シェーダユニフォームは、OpenGLの4.3から出発して、レイアウト修飾子を使用して設定することができる。

layout(location = 2) uniform mat4 modelToWorldMatrix; 

意志例えば詳しくは位置2に均一modelToWorldMatrixのlocationnに結合するルックhereを有します。

4.3より前(またはARB_explicit_uniform_location拡張がないというよりも)には、制服の場所を修正する方法がありませんでした。

+0

シェーダの上部で '#version 130'を使用してもこれは機能しますか? – Joehot200

+0

いいえ、私が言ったように、OpenGL 4.3以上が必要です。これは '#version 430'を意味します。または、特定の内線番号を使用できます。 – BDL

関連する問題