【发布时间】:2011-12-18 22:13:23
【问题描述】:
我正在尝试使用 GL_TRIANGLES 在 OpenGL 中渲染一个球体。 这是我使用下面的代码得到的图像.. Bad Sphere
这应该是一个单位球体。
我从基本球体近似值中推导出顶点 wikipedia.
这是我创建的用于渲染单位球体的代码.. 请让我知道我哪里出错了
void createGreenSphere(mat4 modelView){
std::vector< Vertex > v;
int numSphereSlices = 12;
int numSphereSegments = 12;
float theta = 0;
float phi = 0;
float phiDelt = (2*PI) / numSphereSegments;
float thetaDelt = PI / numSphereSlices;
float* vertices = new float[numSphereSlices*numSphereSegments*4];
float* normals = new float[numSphereSlices*numSphereSegments*4];
float* colors = new float[numSphereSlices*numSphereSegments*3];
int colorCnt = 0;
int vertCnt = 0;
for(int heightCnt = 0; heightCnt < numSphereSlices; heightCnt++){
theta += thetaDelt;
phi = 0;
for(int widthCnt = 0; widthCnt < numSphereSegments; widthCnt++){
phi += phiDelt;
vertices[vertCnt] = sin(theta)*cos(phi);
normals[vertCnt] = vertices[vertCnt];
vertCnt++;
vertices[vertCnt] = sin(theta)*sin(phi);
normals[vertCnt] = vertices[vertCnt];
vertCnt++;
vertices[vertCnt] = cos(theta);
normals[vertCnt] = vertices[vertCnt];
vertCnt++;
vertices[vertCnt] = 1.0;
normals[vertCnt] = vertices[vertCnt];
vertCnt++;
colors[colorCnt] = 0.0;
colorCnt++;
colors[colorCnt] = 1.0;
colorCnt++;
colors[colorCnt] = 0.0;
colorCnt++;
}
}
glBindBuffer(GL_ARRAY_BUFFER, vbo);
glBufferData(GL_ARRAY_BUFFER, vertCnt-1 * sizeof(float), vertices, GL_STATIC_DRAW);
glBindBuffer(GL_ARRAY_BUFFER, cbo);
glBufferData(GL_ARRAY_BUFFER, colorCnt-1 * sizeof(float), colors, GL_STREAM_DRAW);
glBindBuffer(GL_ARRAY_BUFFER, nbo);
glBufferData(GL_ARRAY_BUFFER, vertCnt-1 * sizeof(float), normals, GL_STATIC_DRAW);
unsigned short* indices = new unsigned short[numSphereSlices*numSphereSegments*6];
int indexCnt = 0;
for (int i=0;i<numSphereSlices;i++){
for(int j=0;j<numSphereSegments;j++){
indices[indexCnt] = j + numSphereSegments*i;
indexCnt++;
indices[indexCnt] = j+1 + numSphereSegments*i;
indexCnt++;
indices[indexCnt] = numSphereSegments+j + numSphereSegments*i;
indexCnt++;
indices[indexCnt] = numSphereSegments+j+1 + numSphereSegments*i;
indexCnt++;
indices[indexCnt] = numSphereSegments+j + numSphereSegments*i;
indexCnt++;
indices[indexCnt] = j+1 + numSphereSegments*i;
indexCnt++;
}
}
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, ibo);
glBufferData(GL_ELEMENT_ARRAY_BUFFER, (numSphereSlices*numSphereSegments*6) * sizeof(unsigned short), indices, GL_STATIC_DRAW);
delete [] indices;
glUniformMatrix4fv(u_modelMatrixLocation, 1, GL_FALSE, &modelView[0][0]);
glDrawElements(GL_TRIANGLES, numSphereSlices*numSphereSegments, GL_UNSIGNED_SHORT, 0);
glDisableVertexAttribArray(positionLocation);
glDisableVertexAttribArray(colorLocation);
glDisableVertexAttribArray(normalLocation);
}
我不确定问题出在创建顶点还是链接索引..
【问题讨论】:
-
一切看起来都很好。我猜你的视图矩阵有问题。首先,尝试使用您现在使用的视图矩阵的转置。
-
我也不认为这是问题所在,我只是在制作其他形状,例如立方体。
标签: c++ opengl geometry indices vertices