2

状況:ライブラリ OpenTK を使用して、C# で OpenGL を使用して描画しています。

.

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

.

セットアップ機能:

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();

.

やりたいこと:

セットアップ コードでは、頂点を作成します (頂点には位置と色が含まれます)。現在 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 は、何を描画するかを制御せずにすべてを取得するようです。

頂点/配列のすべては、色を除いて同一です。同じオブジェクト (何千ものポイント) を別の「配色」でレンダリングするだけです。

どんな助けでも感謝します。

4

2 に答える 2

2

だから私はそれを修正しました。私が当初考えていた解決策のようなものです。

頂点 (位置) 用に 1 つの配列を作成し、色 (C# "Color") を含む 2 つの個別の配列を作成しました。

  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」に注意してください。これらは Render() で使用されます

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);
于 2011-11-02T10:19:46.037 に答える
0

これを使用して、点群内の点を選択できるようにしました。すべてのポイントは、代替カラースキームで一意の色を取得します (ポイント ID (インデックス) を指すディクショナリに格納されます)。

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

レイキャスティングや octtrees などのチェックを使用する必要がなかったため、これは非常に優れています。ただし、これにより、現在画面に表示されているポイントの背後にあるものを見つけることができなくなることに注意してください。

私は代替色をレンダリングし、ピクセルアンダーマウスカラーを選択しますが、「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)
}

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

于 2011-11-02T10:34:56.880 に答える