首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >存储顶点属性的数据结构

存储顶点属性的数据结构
EN

Stack Overflow用户
提问于 2014-01-27 22:36:50
回答 1查看 1.9K关注 0票数 1

我需要实现一个根据属性存储顶点的结构。例如,每个顶点都有一个属性,如"Normals“或"Position”"Colors“等,并且可以通过它们的名称访问它们。

代码语言:javascript
复制
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是如何做到的。比如:

代码语言:javascript
复制
enum {
 DOUBLE = 0,
 FLOAT,
 INT,
};

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

但是,它非常冗长,我必须为每一种可能的数据类型创建一个枚举,并为每种数据类型设置单独的函数,以推动新元素的返回。

另一种可能的方法是使用抽象类。但即使这样也不能保证类型安全(除非使用RTTI),而且涉及到铸造,而且也很难抽象出来。另外,没有办法创建一个通用的'push_back',所以我需要为每个类型创建专门的函数。

代码语言:javascript
复制
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数组结构作为described in this question,那么,创建一个抽象向量并可以保存任何类型的属性流的结构最好的方法是什么?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-01-27 23:04:56

好的,这看起来就像你试图创建一个结构来存储一个3D模型的数据。顶点坐标和法线。老实说,我觉得你只是想让它变得花哨。一个带有一对vec3<double>s来存储位置和法线的结构(实际上,如果您想在openGL中使用它们,它们应该是浮动的,因为大多数显卡对双精度浮点数的支持非常糟糕),然后不管您的系统为其模型存储了什么其他数据。您使用此结构的向量,它将任意给定顶点的所有信息保存在一起。

如果你真的需要把所有的数据分开,我还没有看到一个有这样的需求的系统,但是我的经验仍然比我想要的要有限,然后创建一个结构或类,这个结构或类有很多向量,每个向量都包含一个vec3或者那个特定结构所需要的任何数据类型。大多数系统都知道他们将为他们的模型寻找什么样的数据,所以静态地实现这些结构不应该是个问题。对于最终的顶点数据,您只需创建一个结构,该结构包含构成特定顶点的独立组件的许多索引。

是否有这样一个简单得多的系统的原因:

代码语言:javascript
复制
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.
};

不管用吗?

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21393164

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档