Допустим ли массив для данных элемента вершины для программируемой графической линии? - PullRequest
2 голосов
/ 03 февраля 2010

В ответ на мое предыдущее задание, опубликованное здесь:

Что такое хорошая структура кода для api-независимой обработки вершин?

Если я скажу структуру вершинс массивом значений с плавающей точкой, таких как:

public struct Vertex
{
    float[] array = new float[4];

    public Vertex(float x, float, y, float z, float w)
    { 
         array[0] = x; array[1] = y; array[2] = z; array[3] = w;
    }
}

Может ли эта структура вершины быть отправлена ​​в буфер вершин (используя OpenGL или DirectX)?Содержит ли массив какие-либо другие байтовые данные или он содержит только данные значений с плавающей запятой?Например, если бы я (в DirectX) использовал эту вершину как Transformed в объявлении, я мог бы отправить эту вершину в буфер, и все, что будет отправлено, - это значения с плавающей запятой, или массив будет содержать другую информацию, которая может нарушить мою шейдерную программу?

Ответы [ 2 ]

1 голос
/ 04 февраля 2010

Нет, не делай этого.структура может быть неправильно выровнена или иметь дополнительные данные ... это, как правило, небезопасно, учитывая, что .net framework может измениться, и это не гарантируется.

Лучше всего подготовитьданные в массив с плавающей точкой [] и забрать указатель, используя ключевое слово fixed.таким образом я могу заверить (я делаю это сам), что работает отлично.В любом случае, не пытайтесь делать дополнительные вещи, как оптимизировать эти мелкие вещи.Они никогда не будут узким местом в вашем приложении / игре.(даже не очень важно)

Делайте то, что делает ваш код более читабельным и доступным для чтения.

Помните, что скорость struct vs array различна в зависимости от того, что вы делаете.Обычно структура быстрее при произвольном доступе, массив быстрее при линейном доступе, поэтому, если у вас есть ДЕЙСТВИТЕЛЬНО интенсивная часть приложения (как, например, скинер программного обеспечения), попробуйте выбрать подходящую для вас нужную информацию.

0 голосов
/ 03 февраля 2010

Я не программист на C #, но здесь выглядит, что вы сохраняете ссылку на массив (указатель) в структуре Vertex, следовательно, массив Vertex будет массивом указателей. Графический API требует непрерывной последовательности операций с плавающей точкой.

Попытка:

public struct Vertex
{
    public fixed float array[4];

    public Vertex(float x, float, y, float z, float w)
    { 
         array[0] = x; array[1] = y; array[2] = z; array[3] = w;
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...