2014-10-20 5 views
3

В моем приложении IOS, написанной в Swift, я генерировать металлический буфер:Могу ли я получить размер буфера из моего металлического шейдера?

vertexBuffer = device.newBufferWithBytes(vertices, length: vertices.count * sizeofValue(vertices[0]), options: nil) 

и привязать его к моей шейдерной программе с:

renderCommandEncoder.setVertexBuffer(vertexBuffer, offset: 0, atIndex: 1) 

В моей шейдерной программе, написанной в Metal затенения язык, могу ли я получить доступ к размеру буфера? Я хотел бы получить доступ к следующей вершине в моем буфере, чтобы выполнить дифференциальный расчет. Что-то вроде:

vertex float4 my_vertex(const device packed_float3* vertices [[buffer(1)]], 
         unsigned int vid[[vertex_id]]) { 
    float4 vertex = vertices[vid]; 
    // Need to clamp this to not go beyond buffer, 
    // but how do I know the max value of vid? 
    float4 nextVertex = vertices[vid + 1]; 
    float4 tangent = nextVertex - vertex; 
    // ... 
} 

Является ли мой единственный способ передать количество вершин в форме?

+0

Это 'swift'? – Droppy

+0

App в Swift. Shader in Metal shading language, который является подмножеством C++. – Hallgrim

+0

Вам нужно отметить вопрос лучше. – Droppy

ответ

4

Насколько я знаю, вы не можете, потому что вершины указывают на адрес. Так же, как C++, должны иметь две вещи, чтобы знать количество или размер массива:
1) знать, какой тип данных массива (теркой или некоторой структуры)
И
2а) массива подсчитывать для типа данных или
2b) суммарные байты массива.

Так что да, вам нужно было бы передать количество массивов в форме.

-1

На самом деле вы можете. Вы можете использовать полученное значение для циклов или условных обозначений. Вы не можете использовать его для инициализации объектов. (так что динамические массивы не сработают)

uint tempUint = 0; // some random type 
uint uintSize = sizeof(tempUint); // get the size for the type 
uint aVectorSize = sizeof(aVector)/uintSize; // divide the buffer by the type. 

float dynamicArray[aVectorSize]; // this fails 

for (uint counter = 0; counter < aVectorSize; ++ counter) { 
    // do stuff 
}; 

if (aVectorSize > 10) { 
    // do more stuff 
} 
+0

Я был бы удивлен, если sizeof() работает. Подтвердили ли вы, что sizeof() возвращает полный векторный размер, а не размер типа или только размер указателя? Насколько я знаю, эти векторы объявлены как указатели, и поэтому размер sizeof() просто не изменит размер указателя? Очевидно, что это должно быть проверка времени выполнения, поскольку фактический размер задается во время выполнения, а не время компиляции. – ldoogy

+0

Подтверждено, что sizeof() в Metal shaders возвращает размер типа данных, а не фактический размер объекта, поэтому этот ответ просто неверен. – ldoogy

+0

@ Идоги Не знал этого. Можете ли вы создать репо с кодом? Хотелось бы это увидеть. Прошло много времени с тех пор, как я играл с Metal. –

 Смежные вопросы

  • Нет связанных вопросов^_^