圆形三角形条

时间:2013-03-08 02:59:24

标签: c++ opengl 3d

我一直在尝试在OpenGL中创建一个圆圈,但我不能使用三角形粉丝,因为我已经读过它们在directx中不再可用,我也将进行直接调用。

我真的不明白三角条是如何工作的。我的所有实现都有漏洞或奇怪的怪癖,任何人都可以帮助我,我怎样才能以最好的方式实现它?

三角形条和单独的三角形之间确实存在任何性能差异,因为可以说10个圆圈各有1000个三角形。会有很大的不同吗?

3 个答案:

答案 0 :(得分:5)

指定带有三角形条带的圆的一种方法如下:

for each step
    add next position on circle
    add circle center

这将包括圆圈的中心位置。不包括中心的另一种方式是:

add left most vertex
for each phi in (-PI/2, Pi/2) //ommit the first and last one
    x = r * sin(phi)
    y = r * cos(phi)
    add (x, y)
    add (x, -y)
add right most vertex

您可能需要根据背面剔除设置调整循环

拓扑需要不同数量的顶点。对于三角形列表,10个圆圈1000个三角形需要30,000个顶点。对于三角形条带,每个圆圈需要1002个顶点,因此总共需要10,020个顶点。这几乎要小三倍,转移到CPU时应该快一点。如果这反映在FPS中取决于几件事情。

答案 1 :(得分:3)

这是使用VAO / VBO的代码和最小点数。与目前发布的其他答案不同,它只需要一次cos()和一次sin()来电。

设定:

// Number of points used for half circle.
const unsigned HALF_PREC = 10;

const float angInc = M_PI / static_cast<float>(HALF_PREC);
const float cosInc = cos(angInc);
const float sinInc = sin(angInc);

GLfloat* coordA = new GLfloat[2 * HALF_PREC * 2];
unsigned coordIdx = 0;

coordA[coordIdx++] = 1.0f;
coordA[coordIdx++] = 0.0f;

float xc = 1.0f;
float yc = 0.0f;
for (unsigned iAng = 1; iAng < HALF_PREC; ++iAng) {
    float xcNew = cosInc * xc - sinInc * yc;
    yc = sinInc * xc + cosInc * yc;
    xc = xcNew;

    coordA[coordIdx++] = xc;
    coordA[coordIdx++] = yc;

    coordA[coordIdx++] = xc;
    coordA[coordIdx++] = -yc;
}

coordA[coordIdx++] = -1.0f;
coordA[coordIdx++] = 0.0f;

GLuint vaoId = 0;
glGenVertexArrays(1, &vaoId);
glBindVertexArray(vaoId);

GLuint vboId = 0;
glGenBuffers(1, &vboId);
glBindBuffer(GL_ARRAY_BUFFER, vboId);
glBufferData(GL_ARRAY_BUFFER, 2 * HALF_PREC * 2 * sizeof(GLfloat),
             coordA, GL_STATIC_DRAW);

delete[] coordA;

glEnableVertexAttribArray(0);
glVertexAttribPointer(0, 2, GL_FLOAT, GL_FALSE, 0, 0);

glBindBuffer(GL_ARRAY_BUFFER, 0);
glBindVertexArray(0);

绘制:

glBindVertexArray(vaoId);
glDrawArrays(GL_TRIANGLE_STRIP, 0, 2 * HALF_PREC);
glBindVertexArray(0);

答案 2 :(得分:1)

for each phi in (-PI, Pi) //ommit the first and last one
    x1 = r * sin(phi)
    y1 = r * cos(phi)

    x2 = r * sin(phi + Pi)
    y2 = r * cos(phi + Pi)

    add (x1, y1)
    add (x2, y2)

相反,如上面所示的伪代码,在圆的一侧上下摆动,这个将在圆的中心之间锯齿形。这将有更充分的循环。