2011-10-28 6 views
2

状況:私はOpenTKライブラリでOpenGLをC#で描画しています。OpenTK:VBOで異なる色を使用する

問題:私のバッファ/描画する頂点のセットを選択できません。

セットアップ-機能:

var vertices = new Vertex[..]; 

は頂点

foreach(..) 
{ 
Byte4 color = new Byte4(); 
color.R  = 255; 
color.G  = 0; 
color.B  = 0; 
color.A  = 100; 

Vertex vertex; 
vertex.Position = new Vector3(.....); 
vertex.Color = color; 

vertices[index] = vertex; 
} 

/バインド・バッファの生成を作成します。これが重要な場合

vbo_size = vertices.Length; 
GL.GenBuffers(1, out vbo_id); 
GL.BindBuffer(BufferTarget.ArrayBuffer, vbo_id); 
GL.BufferData<Vertex>(BufferTarget.ArrayBuffer, (IntPtr)(vbo_size * Vertex.SizeInBytes), vertices, BufferUsageHint.StaticDraw); 
GL.InterleavedArrays(InterleavedArrayFormat.C4ubV3f, 0, IntPtr.Zero); 

* Vertex.SizeInBytesは16です。

レンダリングコード:

GL.Enable(EnableCap.DepthTest); 
GL.Clear(ClearBufferMask.ColorBufferBit | ClearBufferMask.DepthBufferBit); 
.. 
GL.Enable(EnableCap.ColorArray); 
GL.DrawArrays(BeginMode.Points, 0, vbo_size); 
GL.Disable(EnableCap.ColorArray); 
.. 
glControl1.SwapBuffers(); 

。私は私の頂点を作成し、セットアップコードで

(頂点の位置や色などが):何のidやりたい

。私は今、1つのセットを作成しますが、私はもう1つ(異なる色の値を持つ同じコード)を作成したいと思います。私はこれを行いました。もちろん、それを作成して二次バッファ(vbo_id/vbo_secondary_id)にバインドしても問題ありません。しかし、どうやってそれを描くのですか?このような

何かが私が探していますものです:

RenderNormalColors() 
{ 
    GL.UseVboId(vbo_id); 
    GL.DrawArrays(BeginMode.Points, 0, vbo_size); 
} 

RenderAlternativeColors() 
{ 
    GL.UseVboId(vbo_id_secondary); 
    GL.DrawArrays(BeginMode.Points, 0, vbo_size); 
} 

GL.DrawArrays描画するかの制御せずにすべてを取るように見えます。

頂点/配列内のすべてが色とは別になります。私はちょうど別の "colorscheme"と同じオブジェクト(数千点)をレンダリングする必要があります。

どのようなヘルプもうまくいくでしょう。

答えて

1

だから私はそれを修正しました。私が元々解決策を考えていた種類。

私は、頂点(位置)と色(C# "色")を持つ2つの別々の配列のための1つの配列を作成しました。

vertices = new Vector3[evaluations.Count]; 
    colors = new int[evaluations.Count]; 
    altcolors = new int[evaluations.Count]; 

次に、それらを別のバッファにバインドしました。

vbo_size = vertices.Length; // Necessary for rendering later on 
    GL.GenBuffers(1, out vbo_id); 
    GL.BindBuffer(BufferTarget.ArrayBuffer, vbo_id); 
    GL.BufferData(BufferTarget.ArrayBuffer, 
       new IntPtr(vertices.Length * BlittableValueType.StrideOf(vertices)), // strideof means what? 
       vertices, BufferUsageHint.StaticDraw); 

    GL.GenBuffers(1, out vbo_color_id); 
    GL.BindBuffer(BufferTarget.ArrayBuffer, vbo_color_id); 
    GL.BufferData(BufferTarget.ArrayBuffer, 
       new IntPtr(colors.Length * BlittableValueType.StrideOf(vertices)), 
       colors, BufferUsageHint.StaticDraw); 

    GL.GenBuffers(1, out vbo_color_id_alt); 
    GL.BindBuffer(BufferTarget.ArrayBuffer, vbo_color_id_alt); 
    GL.BufferData(BufferTarget.ArrayBuffer, 
       new IntPtr(altcolors.Length * BlittableValueType.StrideOf(vertices)), 
       altcolors, BufferUsageHint.StaticDraw); 

"vbo_color_id"と "vbo_color_id_alt"に注目してください。これらは私がポイントクラウド内の点を選択することができるようにこれを使用するレンダリング()

selected_vbo = color_id_alt又はいずれかCOLOR_ID

GL.BindBuffer(BufferTarget.ArrayBuffer, selected_vbo); 
    GL.ColorPointer(4, ColorPointerType.UnsignedByte, sizeof(int), IntPtr.Zero); 
    GL.EnableClientState(ArrayCap.ColorArray); 

    GL.EnableClientState(ArrayCap.VertexArray); 
    GL.BindBuffer(BufferTarget.ArrayBuffer, vbo_id); 
    GL.VertexPointer(3, VertexPointerType.Float, Vector3.SizeInBytes, new IntPtr(0)); 
    GL.DrawArrays(BeginMode.Points, 0, vbo_size); 
0

に使用されています。各点は、代替の色彩標本において、固有の色(点id(指数)を指す辞書に記憶されている)を得る。

マウスをクリックすると、現在のピクセルが取得され、リストがチェックされます。セットに存在する色が見つかった場合、クリックされた点がわかります。

これは、レイキャスティングやオクツリーまたは類似のチェックを使用する必要がなかったので、これはかなり良いことです。ただし、画面上に現在表示されているポイントの後ろに何かを見つけることが不可能になるということに気付く価値があります。

代替色をレンダリングし、マウスアンダーカラーのピクセルを選択しますが、「swapbuffer()」は使用しませんので、画面には表示されません。それから、コアリングの色でもう一度レンダリングします。

かなりきれいです。

public void RenderAlternativeColorsAndPick(int x, int y) 
{ 
    GL.BindBuffer(BufferTarget.ArrayBuffer, vbo_color_id_alt); 
    GL.ColorPointer(4, ColorPointerType.UnsignedByte, sizeof(int), IntPtr.Zero); 
    GL.EnableClientState(ArrayCap.ColorArray); 

    GL.EnableClientState(ArrayCap.VertexArray); 
    GL.BindBuffer(BufferTarget.ArrayBuffer, vbo_id); 
    GL.VertexPointer(3, VertexPointerType.Float, Vector3.SizeInBytes, new IntPtr(0)); 
    GL.DrawArrays(BeginMode.Points, 0, vbo_size); 

    // Psuedo code sorry 
    GL.GetPixelColor(x,y) 
    SelectedPoint = dictionary<color,int>.findValuebyKey(thePixelsColor) 
} 

これは将来的に誰かに役立つことを願っています。

関連する問題