Я пытаюсь визуализировать сферу в OpenGL, используя GL_TRIANGLES.
Вот изображение того, что я получаю с кодом ниже ..
Плохая Сфера
Предполагается, что это единичная сфера.
Я вывел вершины из приближений основных сфер из
википедии.
Вот код, который я создал для рендеринга сферной сферы.
Пожалуйста, дайте мне знать, где я иду не так
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);
}
Я не уверен, что проблема заключается в создании вершин или связывании индексов ..