2017-12-27 237 views
3
**//My 3D vertex data class** 
class Vertex 
{ 
public:  
    Vertex(float xx, float yy, float zz) : x(xx), y(yy), z(zz) { }  
    virtual ~Vertex() {}  

private:  
    float x; 
    float y; 
    float z;  
}; 

**//My quad data.** 
std::vector<Vertex> quadVertexData;  
quadVertexData.push_back(Vertex(-0.5, 0.5, 0.0));  
quadVertexData.push_back(Vertex(-0.5, -0.5, 0.0)); 
quadVertexData.push_back(Vertex(0.5, -0.5, 0.0));  
quadVertexData.push_back(Vertex(0.5, 0.5, 0.0)); 

//這是我如何進行我的渲染調用。opengl C++代碼不會給出預期的結果

glGenVertexArrays(1, &_vao); 
glBindVertexArray(_vao); 
glGenBuffers(1, &_vbo); 
glGenBuffers(1, &_ebo); 


void render(std::vector<Vertex>& vertices, std::vector<unsigned int> indices) 
{ 
glBindBuffer(GL_ARRAY_BUFFER, _vbo);  
glBufferData(GL_ARRAY_BUFFER, sizeof(Vertex) * vertices.size(), 
&vertices[0], GL_STATIC_DRAW);  //tried with sizeof(vertices[0]) too. 
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, _ebo);  
glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(unsigned int) * indices.size(), 
&indices[0], GL_STATIC_DRAW);  
glEnableVertexAttribArray(0);  
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, 0);  
glDrawElements(GL_TRIANGLES, indices.size(), GL_UNSIGNED_INT, 0);  
glDisableVertexAttribArray(0);  
} 

ISSUE://而是四的,我得到一個意想不到的三角形秀照片。 我應該如何通過bufferdata才能獲得理想的效果?
相同的代碼,如果我嘗試與glm::vec3那麼它的工作正常。

//快照:

隨着我的頂點類 enter image description here

隨着GLM :: VEC3 enter image description here

+0

感謝您的答覆。我也試過硬編碼12,結果仍然一樣。 –

回答

3
class Vertex 
{ 
public:  
    Vertex(float xx, float yy, float zz) : x(xx), y(yy), z(zz) { }  
    virtual ~Vertex() {}  
private:  
    float x; 
    float y; 
    float z;  
}; 

sizeof(Vertex)不是12如你預期。它可能是16或24(取決於32或64位系統)。這是因爲你有一個virtual析構函數。這會導致對象中某處必須存儲指向虛函數表的指針。最後,std::vector<Vertex> quadVertexData中的頂點座標未緊密排列。

做你想要什麼,如果你省略virtual關鍵字class Vertex你應該使用一個struct

struct Vertex 
{ 
    float x; 
    float y; 
    float z;  
}; 

當然你的代碼將工作:

class Vertex 
{ 
public:  
    Vertex(float xx, float yy, float zz) : x(xx), y(yy), z(zz) { }  
    ~Vertex() {}  
private:  
    float x; 
    float y; 
    float z;  
}; 
+0

非常感謝解決導致問題的問題。它在省略了virtual關鍵字後按預期工作。 ...我用虛擬關鍵字顯示的大小,它顯示16和省略12後:)。 –

+0

不客氣。如果你的問題的答案已經完全解決了你的問題,那麼你應該接受答案。 (答案左邊的複選標記)。 – Rabbid76

+0

噢!對不起,這是我的第一篇文章,不知道它是如何在這裏工作的,但很快就會探索。謝謝Rabbid76。 –

相關問題