2012-05-06 17 views
2

球を描くのに何か問題があります。OpenGL VBOs:球を描く

std::vector<GLfloat> ballVerts; 

for(int i = 0; i <= 40; i++) 
{ 
    double lat0 = M_PI * (-0.5 + (double) (i - 1)/40); 
    double z0 = sin(lat0); 
    double zr0 = cos(lat0); 

    double lat1 = M_PI * (-0.5 + (double) i/40); 
    double z1 = sin(lat1); 
    double zr1 = cos(lat1); 

    for(int j = 0; j <= 40; j++) 
    { 
     double lng = 2 * M_PI * (double) (j - 1)/40; 
     double x = cos(lng); 
     double y = sin(lng); 

     ballVerts.push_back(x * zr0); //X 
     ballVerts.push_back(y * zr0); //Y 
     ballVerts.push_back(z0);  //Z 

     ballVerts.push_back(0.0f); 
     ballVerts.push_back(1.0f); 
     ballVerts.push_back(0.0f); 
     ballVerts.push_back(1.0f); //R,G,B,A 

     ballVerts.push_back(x * zr1); //X 
     ballVerts.push_back(y * zr1); //Y 
     ballVerts.push_back(z1);  //Z 

     ballVerts.push_back(0.0f); 
     ballVerts.push_back(1.0f); 
     ballVerts.push_back(0.0f); 
     ballVerts.push_back(1.0f); //R,G,B,A 
    } 
} 

glGenBuffers(1, &ballVbo); 
glBindBuffer(GL_VERTEX_ARRAY, ballVbo); 

GLuint sphereSize = 3200*7*4; //3200 vertixes * 7 floats 
glBufferData(GL_VERTEX_ARRAY,sphereSize, &ballVerts, GL_STATIC_DRAW); 



/* 
    Draw a ball 
*/ 
glBindBuffer(GL_VERTEX_ARRAY, ballVbo); 
glEnableClientState(GL_VERTEX_ARRAY); 
glVertexPointer(3, GL_FLOAT, 7*4, 0); 
glEnableClientState(GL_COLOR_ARRAY); 
glColorPointer(4, GL_FLOAT, 7*4, (void*)(3*4)); 

glDrawArrays(GL_TRIANGLE_STRIP, 0, 3200); 

glBindBuffer(GL_ARRAY_BUFFER, 0); 

球を生成するためのコードは、即時モードでは正常に動作しますが、私はVBOに入れたとき、私はglDrawArraysからアクセス違反の例外を取得しておきます。助言がありますか?

答えて

7
glBufferData(GL_VERTEX_ARRAY,sphereSize, &ballVerts, GL_STATIC_DRAW); 

ballVertsない配列です。それはstd::vectorです。 std::vectorのアドレスをとっても、の配列のアドレスはvectorになりません。 &ballVerts[0]を使用する必要があります。プレリサイズベクター

+0

これはソート済みです。ありがとうございます。私はそれがそれのような小さなものであることを知っていました... – user1378179

+2

C++ 11にアクセスできる場合は、std :: vectorの.data()メソッドも可能です。これは空の配列に対してアドレス演算子を使用することの問題を回避すると私は信じています。 – luke

0

良く、それによって、このような もの掃引するイテレータを使用:

std::vector <GLfloat> vertices; 
vertices.resize(count * 3); 
... 
std::vector <GLfloat>::iterator v = vertices.begin(); 

for(U32 r = 0; r < m_prec/2; ++r) //широта 
    { 
     float const theta1 = -F_PI_BY_TWO + pi2p * r; 
     float const theta2 = theta1 + pi2p; 

     for(U32 s = 0; s < m_prec; ++s) //долгота 
     { 
      float const theta3 = s * pi2p;  

      float ex = cosf(theta3) *cosf(theta2); 
      float ey = sinf(theta2); 
      float ez = sinf(theta3) * cosf(theta2); 
      *v++ = m_x + m_radius * ex; 
      *v++ = m_y + m_radius * ey; 
      *v++ = m_z + m_radius * ez; 

:: glVertexPointer(3、GL_FLOAT、0、&頂点を[0]) ;

が役に立ちます。

+0

本当にうまいですか?なぜ私は中間モードでコードを試して、それは私にサークルを与える?また、代わりにglBegin(GL_Points)を使用しようとすると、それは私に円を作るポイントを与えるだけです.. –

関連する問題