2011-08-08 1 views
8

glVertexPointer()(およびその他の関連する関数)を呼び出すときに、スタック上にある頂点配列を使用するのは安全ですか? OpenGLが渡された構造体から実際にデータをコピーするとき、私にはわかりません。glVertexPointer()はいつデータをコピーしますか?

安全でない場合は、glVertexPointer()に渡された構造物を破壊/再利用することが安全であることをどのように知っていますか?

(VBOsを使用しない)

+2

正しい答えを得るには、VBOを使用している場合は追加する必要があります。 – pmr

答えて

6

頂点アレイの場合、ポインタはGL_VERTEX_ARRAYglEnableClientState() EDされていると仮定すると、glDrawElements()の実行や友人間に逆参照されるであろう。

glDrawElements()が返ってすぐに、OpenGLには必要なすべてのデータがあるので、free()に自由にアクセスできます。それは本当に問題ではないので、あなたは、実際のポインタを渡すことはありませんVBOs :)

については

だから、このようなものが動作するはずです:

void draw() 
{ 
    vector<float> verts; 
    verts.push_back(0); 
    verts.push_back(0); 
    verts.push_back(0); 
    verts.push_back(10); 
    verts.push_back(0); 
    verts.push_back(0); 
    verts.push_back(10); 
    verts.push_back(10); 
    verts.push_back(0); 

    glEnableClientState(GL_VERTEX_ARRAY); 
    glVertexPointer(3, GL_FLOAT, 0, &verts[0]); 
    glDrawArrays(GL_TRIANGLES, 0, 3); 
    glDisableClientState(GL_VERTEX_ARRAY); 
} 
1

glVertexPointer決してコピーデータを、それだけでAセットポインターは、glDrawArraysとglDrawElementsを呼び出したときに読み取られ、GPUに転送されます。これらの関数が返された後、データは解放されても安全です。

+1

間違っている! drawコマンドを発行した後ではなく、glBufferDataの後にデータを解放することができます。誤解を招く人々を止める。 – spectre

+3

@ lukasz1985彼はVBOを使用していないと言っているので、コメントは適用されません。 –

関連する問題