【发布时间】:2018-03-03 04:05:43
【问题描述】:
所以我已经使用这个算法创建了所有正确的球体顶点:
GLint total = 100;
GLfloat radius = 200;
GLfloat sphereVertices[30000];
for (int i = 0; i < total; i++)
{
float lon = map(i, 0, total, -M_PI, M_PI);
for (int j = 0; j < total; j++)
{
float lat = map(j, 0, total, -M_PI/2, M_PI/2);
sphereVertices[(i * 300) + (j * 3)] = radius * sin(lon) * cos(lat);
sphereVertices[(i * 300) + (j * 3) + 1] = radius * sin(lon) * sin(lat);
sphereVertices[(i * 300) + (j * 3) + 2] = radius * cos(lon);
}
}
但是当我使用 GL_TRIANGLES 和 GL_TRIANGLE_STRIP 绘制它时,我得到了这样的结果:
如您所见,正在渲染的唯一三角形是从球体中心切开的。我的数学错了吗?还是我没有以正确的方式将我的数据绘制到我的数组中,以便我的 glVertexAttribPointer 函数正确读取数据?
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 3 * sizeof(GLfloat), 0);
编辑 1:
glBindVertexArray(VAO);
glBindBuffer(GL_ARRAY_BUFFER, VBO);
glDrawArrays(GL_TRIANGLES, 0, 10000);
【问题讨论】:
-
您显示的内容不够多,而且可能是代码的错误部分。我们只看到顶点坐标的计算。它们显然是正确的,因为它们形成了一个球体。为了渲染球体,您需要成组使用这些顶点。每个顶点的使用频率都不止一次,对于它所属的每个多边形(可能是三角形)一次。被“提及”的顺序也很重要。可能实际上渲染了更多多边形,但朝向错误的方向。做一个minimal reproducible example 然后试试这个ericlippert.com/2014/03/21/find-a-simpler-problem
-
我将绘图调用添加到我的问题中,并将数据如何解析到 glVertexAttribPointer 中。我的问题是,“我的数学错了吗?还是我没有以正确的方式将我的数据绘制到我的数组中,以便我的 glVertexAttribPointer 函数正确读取数据?”
-
查找使用相同 API 的示例并将其与您的代码进行比较。检查顶点的顺序和每个顶点出现的次数。考虑简化为其他几何形状,然后扩展到具有许多顶点的球体。