2016-05-28 20 views
1

マルチテクスチャの地形を作ろうとしています。 しかし、3つのテクスチャをバインドしようとすると、1つのテクスチャしか表示されません。ここ C#コード:OpenTKシェーダで複数のテクスチャをバインドする

GL.UseProgram(program); 
//Active textures, glId - is texture id, generated by GL.GenTexture() 
GL.BindTextures(0,3,new int[3]{grass.glId,grass_normal.glId,stone.glId}); 
//Set shaders uniform, diffuse is a shader class 
diffuse.SetUniform("mainTexture",grass.glId); 
diffuse.SetUniform("gNormalMap",grass_normal.glId); 
diffuse.SetUniform("stoneTexture",stone.glId);  
//Just some render code, for example 
GL.BindVertexArray(mesh.vao); 
GL.DrawElements(PrimitiveType.Triangles, 
mesh.triangles.Count,DrawElementsType.UnsignedInt, IntPtr.Zero);   
//Unbind all 
GL.UseProgram(0); 
GL.BindVertexArray(0); 
GL.BindBuffer(BufferTarget.ArrayBuffer, 0); 
GL.BindBuffer(BufferTarget.ElementArrayBuffer,0); 
GL.BindTextures(0,3,new int[3]{0,0,0}); 

シェーダーフラグメントプログラムがあります:

#version 140 
uniform sampler2D mainTexture;//grass 
uniform sampler2D gNormalMap;//grass normal 
uniform sampler2D stoneTexture;//stone 
out vec4 FragColor; 
//hide other uniforms and inputs 

void main (void){ 
//Some light code 
vec4 x = texture2D(stoneTexture, fract(vTexCoord.st * texSize)); 
vec4 y = texture2D(mainTexture, fract(vTexCoord.st * texSize)); 
vec4 tex = x;//display stone, but i want to mix textures later 
//I don't know why, but there is no difference, 
//if i use stone - 'tex = x', or grass - 'tex = y' 
//in both cases, only grass is displayed 
FragColor = color*tex*(diffuse+ambient);//Color 
} 

私は、草を石をバインドするために最初に試み、それは草なしで石を表示しています。つまり、次のような意味です:

テクスチャは1つのみ表示されます。

+0

私はちょうど私が理解していることを確認したい。なぜこれが起こっているのか聞いてきますよね? –

+0

はい、今は修正しています(次の記事を読んでください) –

答えて

2
​​

この関数は理にかなっている場合、それはあなたのglIdフィールドは、OpenGLオブジェクト名であることを意味します。

意味:

diffuse.SetUniform("mainTexture",grass.glId); 
diffuse.SetUniform("gNormalMap",grass_normal.glId); 
diffuse.SetUniform("stoneTexture",stone.glId); 

このコードは今意味がありません。

サンプラーの統一値は、実際のOpenGLテクスチャ名ではありません。結局のところ、もしそうであれば、それらを文脈に結びつける必要はないだろう。

サンプラーユニフォームは、テクスチャーユニットインデックスに設定されています。したがって、サンプラは、与えられたテクスチャユニットにバインドされているテクスチャからフェッチします。あなたのglBindTextures呼び出しが[0,2]、あなたの均一な設定はそれを反映すべきテクスチャ画像ユニットを使用しているので:

diffuse.SetUniform("mainTexture", 0); 
diffuse.SetUniform("gNormalMap", 1); 
diffuse.SetUniform("stoneTexture", 2); 

、これは一つのケースのために働くように見えた理由として私の推測では、あなたは幸運ということでしょう。多くのOpenGL実装では、1から始まるテクスチャ名が返されます。ちょうどそのようになったテクスチャ名は、テクスチャをバインドしたテクスチャユニットにも一致する可能性があります。

関連する問題