我一直在尝试在OpenGL中创建一个圆圈,但我不能使用三角形粉丝,因为我已经读过它们在directx中不再可用,我也将进行直接调用。
我真的不明白三角条是如何工作的。我的所有实现都有漏洞或奇怪的怪癖,任何人都可以帮助我,我怎样才能以最好的方式实现它?
三角形条和单独的三角形之间确实存在任何性能差异,因为可以说10个圆圈各有1000个三角形。会有很大的不同吗?
答案 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)
相反,如上面所示的伪代码,在圆的一侧上下摆动,这个将在圆的中心之间锯齿形。这将有更充分的循环。