2014-04-12 69 views
-1

我有一个在CUDA上运行的波束形成程序,我必须在Opengl中显示光束的输出,我必须在Opengl中绘制一个矩形,它由24x12的小数组组成squares.I必须根据来自CUDA程序的输出进行波束形成,使用不同颜色对这些正方形进行着色。我已经能够使用VBO绘制矩形,我使用以下结构传递一个包含正方形顶点和每个顶点颜色的数组。我面临的问题的总体概述是我无法正确地将颜色分配给每个正方形。从代码的一些摘录:从Opengl中的不同颜色的方块绘制矩形

struct attributes { 
GLfloat coords[2]; //co-ordinates of the vertices 
GLfloat color[3]; //color of the vertices 
}; 

glGenBuffers(1, &vbo_romanis); // vbo_romanis is the VBO for drawing the frame 
glBindBuffer(GL_ARRAY_BUFFER, vbo_romanis); 
glBufferData(GL_ARRAY_BUFFER, sizeof(Vertices), Vertices, GL_STREAM_DRAW); 

glShadeModel (GL_SMOOTH); 
glUseProgram(program); 

glEnableVertexAttribArray(attribute_coord); 
glEnableVertexAttribArray(attribute_color); 
glBindBuffer(GL_ARRAY_BUFFER, vbo_romanis); 
glVertexAttribPointer(
attribute_coord2d, // attribute 
2,     // number of elements per vertex, here (x,y) 
GL_FLOAT,   // the type of each element 
GL_FALSE,   // take our values as-is 
sizeof(struct attributes), // next coord2 appears every 5 floats 
0     // offset of first element 
); 
glVertexAttribPointer(
attribute_color,  // attribute 
3,      // number of elements per vertex, here (r,g,b) 
GL_FLOAT,    // the type of each element 
GL_FALSE,    // take our values as-is 
sizeof(struct attributes), // stride 
(GLvoid*) offsetof(struct attributes, color) // offset 
); 

/* Push each element in buffer_vertices to the vertex shader */ 
glDrawArrays(GL_QUADS, 0, 4*NUM_SQRS); 

所以我面临着2个问题,当我画数组:

  1. 的颜色没有出现,因为我希望他们。从我读到的有关Opengl的内容来看,曾经分配过的顶点的颜色不能改变。但是由于所有的正方形在它们之间共享顶点,颜色可能会混乱。如果我给所有的顶点赋予相同的颜色,它可以很好地工作,但是当我想绘制所有不同颜色的方块时不会。所以,如果有人能指出我可以给每个方格分配一种不同的颜色,那真的很有帮助。

  2. 如何更新每个帧的顶点颜色,我是否需要重新绘制整个框架,或者是否有方法仅更新顶点的颜色。

我对OpenGL编程完全陌生,任何帮助都将不胜感激。

回答

2

目前还不清楚是什么你的顶点数据实际上是,但这:

但因为所有它们之间的广场份额顶点,颜色 可能搞砸了。

意味着对我说,你要使用两个相邻的广场下面的数据(AF是顶点):

A---B---C 
| | | 
| | | 
D---E---F 

然而,在OpenGL中,顶点是所有属性,不只是位置。你在这里得到的是颜色将平滑插值在方块之间。因此,从技术上讲,需要将顶点B和E复制到B1/B2和E1/E2中,其中B1,E1使用正方形的颜色,B2和E2使用正方形的颜色,但使用相同的坐标。

但是,对于您的问题,可能会有一个快捷方式,以flat shading的形式声明您的vaertex着色器输出为flat。顶点着色器输出(变化)为默认情况下在整个图元内插。但是,将它们定义为flat将会阻止插值。相反,来自的一个顶点的值用于整个图元。 OpenGL使用的conecpt激发顶点来定义基元的哪个顶点将是定义这种flat输出值的那个顶点。

命令glProvokingVertex()可能用于指定要选择顶点的一般规则,您可以选择第一个和最后一个。如果巧妙地构建顶点数据,可以为一个正方形的两个三角形共享一个顶点,这两个三角形将成为两者的激发顶点,因此您可以使用一个角的颜色为每个“网格单元格”定义颜色单元的顶点,并且不需要复制顶点。

附注:您的代码中包含逗号glShadeModel(GL_SMOOTH);。正如你的意见所暗示的那样,当你使用可编程管道时,这是不推荐的,也完全没有用处。但是,从概念上讲,这与我在此建议的平面着色方法完全相反。

如何更新的顶点为每一帧的颜色,我是否需要 重绘整个框架还是有办法只有更新的颜色只有顶点 。

OpenGL不是场景图库。它不记得过去您绘制了哪些对象,并且不允许更改它们的属性。 OpenGL是一个渲染API,所以如果你想让不同的东西出现在屏幕上,你必须让它再次绘制。如果您打算更新颜色而不更改方块本身的位置,则最好使用两个未交错的VBO来分割颜色和位置数据。这样,您可以将位置静态地放在一个缓冲区中,并且只将颜色更新流传送到另一个缓冲区中。

+0

非常感谢指针@derhass ...他们一直很有帮助 – anshu