2016-04-04 9 views
-1

オントピック編集:この質問は、代わりにstd :: vector(関数内で定義されたもの)最初の要素へのポインタがstd :: vector.data()によって返されました。返されたポインタが指すデータを使用しようとすると、最終的にstd :: vector内部のデータがスコープから外れて解放されたため、最終的に破損したデータになりました。例えば:std :: vector.data()によるstd :: vectorの要素へのポインタがデータを破損することを指摘

... 
type *ptr; 
type* function1(){ 
    std::vector<type> vector; 
    return vector.data(); 
} 
ptr = function1(); 
// ptr points to corrupt data here 
... 

ONトピック解決WAY」以下書き込ま溶液であるが、それは一瞬のためのデータを複製します。だろう行うには別のもの、例えば:

... 
std::vector<type> vect; 
void function1(std::vector<type> &vector){ 
    // Add data to vector 
} 
// Use the data inside vector 
type *ptr = vect.data(); 
... 

OLD QUESTION ...

CONTEXT OF CONTEXT:私は、通常の位置を格納し、このエンジンを書いて、頂点、およびインデックスデータをMeshクラスに格納します。私はその頂点、テクスチャ座標、法線とインデックスで、ペンと紙とのキューブを設計し、そのデータと私の動的配列を埋め

class Mesh(){ 
    ... 
    GLfloat *vertices; 
    GLubyte *indices; 
    ... 
} 

:私はちょうどこのように、必要なOpenGLの種類の動的配列を使用します。(手でそれをコピーし、STDは::新しいところで使用して、適切なメモリ割り当て後の動的な配列()にコピーこれは魅力のように働いたキューブは、このような何かを完全にレンダリングされます:。

... 
glEnableClientState(GL_VERTEX_ARRAY);  
glEnableClientState(GL_TEXTURE_COORD_ARRAY); 
... 
glVertexPointer(3, GL_FLOAT, 0, meshInst->pos_coords);  
glTexCoordPointer(2, GL_FLOAT, 0, meshInst->tex_coords); 
... 
glDrawElements(
     GL_TRIANGLES, (CORRECT index count), GL_UNSIGNED_BYTE, 
     meshInst->indices 
    ); 
... 

CONTEXT: 私はMesh用の別のコンストラクタを作成しました。などGLfloat、GLubyte、の配列から新たに割り当てられたメモリへのデータ(ウィッヒは私がを繰り返すかもしれない魔法のように働いていた)、それは以下のん:
1)ロードデータ(ウィッヒは徹底的であることを試験しました正しく)をファイルからstd::vector<GLfloat> positions,std::vector<GLubyte> indsなどにインポートしました。


WAYのA:

std::copy(positions.begin(), positions.end(), vertices); 
std::copy(inds.begin(), inds.end(), indices); 

RESULT
2)Iは、OpenGL、方法Aおよび方法Bによってレンダリングされるように、私のダイナミックアレイにデータを渡すの二つの方法を試みました。
PERFECTLY最初のコンストラクタ
データ印刷のようWORKS:

P[72] = { 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 1, 1, 0, 0, 0, 0, 1, 0, 1, 0, 0, 1, 1, 0, 0, 0, 0, 1, 0, 1, 0, 0, 1, 1, 0, 0, 1, 1, 1, 1, 1, 0, 1, 0, 1, 1, 0, 0, 1, 1, 1, 1, 0, 1, 0, 1, 1, 0, 0, 1, 1, 1, 1, 0, 1, 0, 1, 1, 0, 0, 1, 1 } 
I[36] = { 0, 1, 2, 3, 2, 1, 6, 4, 7, 5, 7, 4, 10, 8, 9, 11, 9, 8, 13, 12, 15, 14, 15, 12, 17, 16, 19, 18, 19, 16, 23, 20, 21, 22, 21, 20 } 

WAYのB:

vertices = positions.data(); 
indices = inds.data(); 

結果:何も描画されません
データ印刷:

P[72] = { 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 1, 1, 0, 0, 0, 0, 1, 0, 1, 0, 0, 1, 1, 0, 0, 0, 0, 1, 0, 1, 0, 0, 1, 1, 0, 0, 1, 1, 1, 1, 1, 0, 1, 0, 1, 1, 0, 0, 1, 1, 1, 1, 0, 1, 0, 1, 1, 0, 0, 1, 1, 1, 1, 0, 1, 0, 1, 1, 0, 0, 1, 1 } 
I[36] = { 0, 1, 2, 3, 2, 1, 6, 4, 7, 5, 7, 4, 10, 8, 9, 11, 9, 8, 13, 12, 15, 14, 15, 12, 17, 16, 19, 18, 19, 16, 23, 20, 21, 22, 21, 20 } 

質問は...なぜですか?主に 'std :: vector'はベクトルで表される順序と同じ順序で連続した格納場所に格納されることが保証されているため、この問題はOpenGL内部にあるようです。 http://www.cplusplus.com/reference/vector/vector/data/に記載されています。また、「頂点」と「インデックス」によって指し示されたデータを比較すると、それは文字通り同一です。両方のデータプリントを自分で比較してください。それらは両方とも、格納された長さを使用して印刷され、ロード直後に動的配列ポインタが使用されます。

あなたのお時間を非常に感謝して、返事をしないで返信してください、私はを学ぶことが大好きです。 PS:私の英語を許してください、それは私の第二言語です。

+0

これは言うまでもありませんが、あなたはたぶんどこか別のところにいたでしょう。 3つのケースすべてでどのように配列サイズを取得しますか?汎用デバッガを実行し、必要なすべてのパラメータが正しいことを確認します。どこでも(glGetError()とデバッグコールバックの両方で)適切なOpenGLエラーチェックを実装してください。グラフィックスデバッガ(Nvidia Nsightなど)を実行してみてください。 – Drop

+0

あなたの返信ありがとう!私は一生懸命働いて、他の場所に何かを見つけたら更新します。私はOpenGLデバッガを見ていきます、もう一度ありがとうございます。 – NicoBerrogorry

+1

私のクリスタルボールは、データと一緒に 'ポジション'と 'inds'の存続期間がレンダリングされるまでに終わったと考えています。 – molbdnilo

答えて

0

おそらくあなたのstd::vectorが範囲外になります。 glVertexPointerは深いコピーを作成するのではなく、確実に確認する必要があるポインタを格納するだけなので、オリジナルのベクトルは、そこから描画したいときにはまだそこにあります。

推奨ソリューション:データを頂点バッファオブジェクトに転送すると、このような問題に対処する必要がなくなり、メリットとしてパフォーマンスが向上します。

関連する問題