1

少し問題が発生しました。

TextureVertexさまざまなタイプの頂点 ( 、ColorVertexなど)を表すクラスまたは構造体が必要です。また、任意の頂点タイプVertexを作成できるようにする必要があるため、スーパー クラス ( ) も必要です。VertexBuffer頂点は値型でなければならないので、構造体が必要なようです。

この種の競合は通常、C# でどのように解決されますか?

編集:値型データが必要な理由は、メソッド( http://sharpdx.org/documentation/api/m-sharpdx-direct3d11-buffer-create--1-1 )がこのようにそれを必要とするように見えるからです。これはアンマネージ コードを呼び出し、頂点データは data パラメーターに入ります。

編集 2: いくつかのコードを捨てる

public interface Vertex
{ }

[StructLayout(LayoutKind.Sequential)]
public struct TextureVertex : Vertex
{
    private Vector3 _position;
    public Vector3 Position { get { return _position; } set { _position = value; } }

    private Vector2 _texture;
    public Vector2 Texture { get { return _texture; } set { _texture = value; } }

    private Vector3 _normal;
    public Vector3 Normal { get { return _normal; } set { _normal = value; } }

    public TextureVertex(float x, float y, float z, float u, float v)
    {
        _position = new Vector3(x, y, z);
        _texture = new Vector2(u, v);
        _normal = new Vector3();
    }
}

...

TextureVertex[] vertices = new []
{
    new TextureVertex(-1.0f, -1.0f, 0.0f, 0.0f, 1.0f),
    new TextureVertex(-1.0f, +1.0f, 0.0f, 0.0f, 0.0f),
    new TextureVertex(+1.0f, +1.0f, 0.0f, 1.0f, 0.0f),
    new TextureVertex(+1.0f, -1.0f, 0.0f, 1.0f, 1.0f)
};

...

VertexBuffer = Buffer.Create<Vertex>(Graphics.Device, BindFlags.VertexBuffer, vertices);
4

2 に答える 2

7

この要件の組み合わせは不可能です。Vertexインターフェース ( )を作成することもできますが、その後 として入力されたものはすべて「ボックス化」されることにIVertex注意してください。おそらく、最善の策は、ジェネリックを使用することです。変数/フィールド/などを(ではなく)の観点から入力する限り、それは制約されます。つまり、ボックス化されません。コードで (制約以外で)使用すると、ボックス化が発生するので、それを避けるようにしてください。structIVertexBuffer<T> where T : IVertexTIVertexIVertex

具体的には:

T[] someBuffer = ...

T item0 = someBuffer[0]; // no box required here
item0.SomeMethodOnIVertex(); // this is a "constrained" call; no boxing

IVertex item1 = someBuffer[1]; // BOX HERE!!!
item1.SomeMethodOnIVertex(); // this is a virtual call via the box
于 2013-05-23T08:40:37.503 に答える
1

いいえ、この場合継承は使用できません。

頂点が値型である理由は、頂点の配列 (本質的にはバッファー) が連続したメモリのチャンクとして配置されるようにするためです。

このようにして、基になるフレームワークは、グラフィック ドライバーに送信するときに 1 つの操作のみを使用してコピーできます。

しかし、この値型の動作には大きな制限があります。ランタイムがインデックスから配列内の値を見つけることができるように、Vertex のすべてのインスタンスはメモリ内で同じサイズでなければなりません。

ただし、構造体で継承を許可すると、この期待が崩れます。頂点値の配列に ColorVertex (Color データを含む) を配置できるため、同じ配列に異なるサイズのオブジェクトを持つことができます。

この動作は ref 型 (「クラス」と考えてください) で可能です。この場合、配列は実際のコンテンツへの固定サイズの参照のみを格納するためです。

ただし、配列のみをコピーすると実際のデータが含まれず、実際のデータをコピーするには配列を読み取ってから各インスタンスを個別にコピーする必要があり、3D エンジンで許容できるパフォーマンスが得られないことも意味します。

于 2013-05-23T09:00:58.713 に答える