在Opengl中从不同颜色的正方形中绘制矩形

时间:2014-04-12 08:57:42

标签: c++ opengl cuda

我有一个在CUDA上运行的波束成形程序,我必须在Opengl中显示波束的输出,我必须在Opengl中绘制一个由24x12小方块组成的矩形。我必须为这些中的每一个着色基于进行波束成形的CUDA程序的输出,具有不同颜色的正方形。我已经能够使用VBO绘制反应角,我使用以下结构传递包含正方形顶点和每个顶点颜色的数组。我面临的问题的总体概要是我无法正确地为每个方块分配颜色。代码中的一些摘录:

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

因此,当我绘制数组时,我面临两个问题:

  1. 颜色没有像我想要的那样出现。根据我读到的关于Opengl的内容,一旦分配了顶点的颜色就无法改变。但由于所有正方形都在它们之间共享顶点,因此颜色可能会混乱。如果我为所有顶点赋予相同的颜色,它可以正常工作,但是当我想绘制不同颜色的所有正方形时,它不会。所以,如果有人可以指出我如何为每个真正有用的方块分配不同的颜色。

  2. 如何更新每个帧的顶点颜色,是否需要重绘整个帧,或者只是更新顶点的颜色。

  3. 我对OpenGL编程完全陌生,我们非常感谢任何帮助。

1 个答案:

答案 0 :(得分:2)

目前尚不清楚你的顶点数据究竟是什么,但是这个:

  

但是因为所有的正方形都在它们之间共享顶点,所以颜色是   可能搞砸了。

向我暗示您正在尝试将以下数据用于两个相邻的正方形(A-F是顶点):

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

但是,在OpenGL中,顶点所有属性的集合,而不仅仅是位置。你得到的是颜色将在正方形之间平滑插值。所以从技术上讲,你需要将顶点B和E复制到B1 / B2和E1 / E2中,其中B1,E1是平方的颜色,B2,E2是右方的颜色,但是相同的坐标。

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

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

作为旁注:您的代码中包含逗号glShadeModel(GL_SMOOTH);。当您使用可编程管道时,这已被弃用并且完全无用,正如您的评论所暗示的那样。然而,从概念上讲,这与我在此提出的平面着色方法完全相反。

  

如何更新每个帧的顶点颜色,我是否需要   重绘整个帧或有没有办法只更新颜色   仅顶点。

OpenGL不是场景图库。它不记得您过去绘制的对象,也不允许更改其属性。 OpenGL是一个渲染API,所以如果你想在屏幕上显示不同的东西,你必须告诉它再次绘制。如果您计划更新颜色而不改变方块本身的位置,那么使用两个非交错的VBO来分割颜色和位置数据可能会更好。这样,您可以将位置静态地放在一个缓冲区中,并仅将颜色更新流式传输到另一个缓冲区中。