簡體   English   中英

用於存儲頂點屬性的數據結構

[英]Data Structure for storing Vertex Attributes

我需要實現一種通過屬性存儲頂點的結構。 例如,每個頂點都有一個屬性,例如“法線”或“位置”,“顏色”等,可以通過名稱來訪問它們。

VertexStructure vstruct;
AttribStream posStream = vstruct.CreateNewAttributeStream("Position",Vec3<double>);
posStream.push_back(Vec3<double>(23.5,12.5,11.3));

AttribStream normalStream = vstruct.CreateNewAttributeStream("Normals",Vec3<double>);
normalStream.push_back(Vec3<double>(0.03,0.02,0.18));

AttribStream indexStream = vstruct.CreateNewAttribStream("Indices",int);
indexStream.push_back(23);

std::cout << indexStream.size() << "," << normalStream.size() << posStream.size() << std::endl;

現在,我可以執行的一種簡單方法是使用預定義的數據類型創建一個枚舉,例如OpenGL的方式。 喜歡:

enum {
 DOUBLE = 0,
 FLOAT,
 INT,
};

 AttribStream posStream = vstruct.CreateNewAttributeStream("Position",DOUBLE,3);
 posStream.push_back_vec3d(23.5,12.5,11.3);

但是,這非常冗長,我必須為每種可能的數據類型創建一個枚舉,並為每種數據類型具有單獨的功能以推回新元素。

另一種可能的方法是使用Abstract類。 但是,即使那樣也不能保證類型安全(除非使用RTTI),並且涉及強制轉換,並且也很難對其進行抽象。 另外, 也沒有辦法創建通用的'push_back' ,因此我需要為每種類型創建專門的函數。

class PX_STREAMBase
{
public:

    template <typename T>
    PX_STREAMBase( T val) : value_type(typeid(T)),
    value_size(sizeof(val))
    {};

    virtual size_t bytes() const = 0;
    virtual size_t size() const = 0;
    virtual const void* data() const = 0;

    const std::type_info& value_type;
    const std::size_t value_size;

private:


};

template<typename T, template <typename, typename> class Container =  std::vector> class PX_STREAM;
template<typename T, template <typename, typename> class Container>
class PX_STREAM : public PX_STREAMBase {
public:
    PX_STREAM() :
    PX_STREAMBase( T())
    {}

    size_t bytes() const {
        return vec.size() * value_size;
    }
    size_t size() const {
        return vec.size();
    }
    const void* data() const {
        return vec.data();
    }
private:


    Container<T, std::allocator<T> > vec;
};

最后,使用此問題中描述的char數組結構。那么,創建抽象該向量並可以保存任何類型的屬性流的結構的最佳方法是什么?

好的,看起來您正在嘗試創建一個結構來存儲3D模型的數據。 頂點坐標和法線。 老實說,我認為您只是想使其變得幻想起來。 具有一對vec3<double>的結構,用於存儲位置和法線(實際上,如果要在openGL中使用它們,則它們應該是浮點數,因為大多數圖形卡都對雙精度浮點數提供了可怕的支持),然后再輸入其他任何數據系統正在為其模型存儲。 您使用這種結構的向量,它將任何給定頂點的所有信息保持在一起。

如果您確實需要將所有數據分開,那么我還沒有看到有這樣的需求的系統,但是我的經驗仍然比我想要的要局限得多,因此創建一個僅包含多個向量的結構或類每個都包含vec3或特定結構所需的任何數據類型。 大多數系統都知道要為模型尋找什么樣的數據,因此靜態實現這些結構不成問題。 對於最終的頂點數據,您只需創建一個結構,該結構包含構成特定頂點的各個組件的多個索引。

是否有一個更簡單的系統,例如:

class Model
{
private:
    //These vectors serve just to hold all of the data for all of your vertices
    vector<vec3<float> > positions;
    vector<vec3<float> > normals;
    vector<vec3<float> > colors;

    //This struct holds indices to the vectors above
    struct Vertex
    {
        int position;
        int normal;
        int color;
    };

    //Holds a list of all of your vertices, but allows you to pair different positions with different normals, etc...
    vector<Vertex> vertices;

    //Holds a list of indices from vertices that are your points to draw.
    vector<int> drawPoints;
public:
    //constructor, destructor, and accessors to add elements to your various elements.
};

不行嗎

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM