2016-07-05 15 views
3

私はこのような方法1は、本の均一な場所を格納しますOpenGL複数のSampler2D(配列)の例?

uniform sampler2D myTextureSampler[5]; 

としてsampler2d配列の例を見つけることは困難であること、それは驚くほどイライラ見つける?:

gl.GetUniformLocation(program, "myTextureSampler") 

1は、単に使用します。

gl.GetUniformLocation(program, "myTextureSampler[0]") 
gl.GetUniformLocation(program2, "myTextureSampler[2]") 

はどのようにして、このように複数のテクスチャを使用して行くでしょう。

gl.BindTexture(gl.TEXTURE_2D, 1) 
gl.BindTexture(gl.TEXTURE_2D, 2) 

など。

gl.ActiveTexture(gl.TEXTURE0) 
gl.ActiveTexture(gl.TEXTURE1) 

など。

注:このコードは、純粋なC++ openglのではありません。それがどのように行われるかについての基本的なコンセプトを探しています。

単純な例を渡すと、sampler2d配列の一様な位置を取得することができます。誰もがこの事を経験していますか?

+0

明白な答えには何が間違っていますか? GL側からの[uniformsの配列の仕方](https://www.opengl.org/wiki/Uniform_(GLSL)#Uniform_management)は、あなたが 'sampler2D'のような不透明な型を使っているという理由だけで変わりません。 –

+0

上記は答えではありません。彼らは私がそれがうまくいくと思う方法の推測だけです。現在、私はそれをうまく動作させることに成功していません。簡単なスタックオーバーフローポイントを取得し、多くの人々を助けるかなり簡単な方法のようです:) – efel

答えて

2

私は、他のすべてのシェーダ配列がアクセスしていると、それは同じだと推測:

glGetUniformLocation(program, "myTextureSampler[0]"); 

は動作します。

あなたがアクティブ最初にであなたのテクスチャを入れたいスロットを設定する必要があり、複数のテクスチャを使用するには:

glActiveTexture(GL_TEXTURE0); 

をして、あなたのテクスチャをバインドすることができます。

glBindTexture(GL_TEXTURE_2D, texture.handle); 

2番目のパラメータglGenTextures()から取得したハンドルです。

glUniform1i(location, 0); 

を最初のパラメータは、あなたが戻ってGetUniformLocationを()の呼び出しから得た場所である:

次に、あなたが呼び出すことによって、適切なテクスチャーでsampler2Dに一致します。 2番目のパラメータは、アクティブなテクスチャスロット(この場合はGL_TEXTURE0)です。

+0

私はこれを試して、私はmyTextureSampler [1]私のフラグメントシェーダでアクセスするので、すべてが動作します。一様な場所をインデックス0に設定しているので、エラーが発生しますか?私はまだ2つの実際のテクスチャでそれを試してみました。おそらく、myTextureSampler [0]とmyTextureSampler [1]を割り当てると、それらは自動的に両方とも別々の単位として埋められますか? – efel

+0

@efelこれは、ユニフォームのデフォルト値がすでに '0'であるためです。デフォルトでは' GL_TEXTURE0'にバインドされているテクスチャを参照しています。 – Overv