2011-10-28 65 views
2

情況:我使用C++ OpenGL繪圖庫。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喜歡做的事:

在設置代碼創建我的頂點(頂點包括位置和顏色)。我現在創建一個集合,但是我想創建一個(只是具有不同顏色值的相同代碼)。我這樣做了,當然可以創建它並將其綁定到輔助緩衝區(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似乎沒有采取什麼畫控制一切。

除了顏色之外,頂點/數組中的所有東西都是相同的。我只需要用另一個「顏色方案」呈現相同的對象 - 數千個點。

任何幫助將appriciated。

回答

1

所以我修好了。我最初認爲解決方案會是怎樣的。

我爲頂點(位置)創建了一個數組,並且使用顏色(C#「Color」)創建了兩個單獨的數組。

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_altCOLOR_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

我用這個能在點雲來選擇點。每個點在替代colorscheme中都會獲得一個唯一的顏色(存儲在指向點id(索引)的字典中)。

當我點擊鼠標它retreives當前像素和檢查列表。如果它找到了該組中存在的顏色,它將知道點擊了哪個點。

這是相當不錯的,因爲我不必使用光線投射或八分樹或類似的檢查。值得注意的是,這將使得無法找到屏幕上當前顯示的點背後的任何東西。

我渲染替代的顏色,選擇像素在鼠標的顏色,但我不使用「swapbuffer()」,所以它永遠不會顯示在屏幕上。然後我用corerct顏色再次渲染它。

非常漂亮。

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) 
} 

希望這可以幫助未來的人。