我正在尝试使用 GL_TRIANGLES 在 OpenGL 中渲染一个球体。这是我使用下面的代码得到的图像.. Bad Sphere
这应该是一个单位球体。
这是我为渲染单位球体而创建的代码。请让我知道我哪里出错了
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);
}
我不确定问题是在创建顶点还是链接索引..