2011-10-31 97 views
1

我想使用GL_TRIANGLES在OpenGL中渲染一個球體。 這裏是我用下面的代碼得到的圖像.. Bad Sphere連接球體頂點OpenGL

這應該是一個單位球體。

我都來源於基本近似球體的頂點從 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); 
} 

我不確定問題出在創建頂點還是鏈接索引上。

+0

一切看起來都很好。我猜你的視圖矩陣有問題。首先,嘗試使用您現在使用的視圖矩陣的轉置。 –

+0

我不相信這是問題,我正在製作其他形狀,例如立方體。 – Kyle

回答

3

複製和粘貼供您參考一些我最初編寫的代碼Creating a 3D sphere in Opengl using Visual C++

class SolidSphere 
{ 
protected 
    std::vector<GLfloat> vertices; 
    std::vector<GLfloat> normals; 
    std::vector<GLfloat> texcoords; 
    std::vector<GLushort> indices; 

public: 
    void SolidSphere(float radius, unsigned int rings, unsigned int sectors) 
    { 
     float const R = 1./(float)(rings-1); 
     float const S = 1./(float)(sectors-1); 
     int r, s; 

     sphere_vertices.resize(rings * sectors * 3); 
     sphere_normals.resize(rings * sectors * 3); 
     sphere_texcoords.resize(rings * sectors * 2); 
     std::vector<GLfloat>::iterator v = sphere_vertices.begin(); 
     std::vector<GLfloat>::iterator n = sphere_normals.begin(); 
     std::vector<GLfloat>::iterator t = sphere_texcoords.begin(); 
     for(r = 0; r < rings; r++) for(s = 0; s < sectors; s++) { 
       float const y = sin(-M_PI_2 + M_PI * r * R); 
       float const x = cos(2*M_PI * s * S) * sin(M_PI * r * R); 
       float const z = sin(2*M_PI * s * S) * sin(M_PI * r * R); 

       *t++ = s*S; 
       *t++ = r*R; 

       *v++ = x * radius; 
       *v++ = y * radius; 
       *v++ = z * radius; 

       *n++ = x; 
       *n++ = y; 
       *n++ = z; 
     } 

     sphere_indices.resize(rings * sectors * 4); 
     std:vector<GLushort>::iterator i = sphere_indices.begin(); 
     for(r = 0; r < rings; r++) for(s = 0; s < sectors; s++) { 
       *i++ = r * sectors + s; 
       *i++ = r * sectors + (s+1); 
       *i++ = (r+1) * sectors + (s+1); 
       *i++ = (r+1) * sectors + s; 
     } 
    } 
} 
+0

嗯,我仔細檢查了我是如何創建索引的,其似乎與您的完全相同,除了有點不同之外,因爲它使用的是三角形而不是四邊形。以這種方式實現它,我仍然獲得相同的輸出。我不斷思考創建頂點,但它看起來也和你一樣,除了可能有點語法差異。任何其他建議? – Kyle