2013-04-02 5 views
2

У меня есть матричный класс 4x4, который содержит значения как 2d float array: float mat [4] [4]; и я перегрузил оператор []Работает ли 2d-массив в glUniformMatrix4fv, C++?

inline float *Matrix4::operator[](int row) { return mat[row]; }

и у меня есть равномерное mat4 в моем шейдере (равномерное mat4 костей [64];), который я будет загружать свои данные на. И я держу кости как указатель Matrix4 (Matrix4 * finalBones), который является матричным массивом, содержащим элементы numJoints. и это то, что я использую, чтобы загрузить данные:

glUniformMatrix4fv(shader.getLocation("Bones"),numJoints,false,finalBones[0][0]); 

Я абсолютно уверен в том, что произойдет, поэтому я должен спросить, что если это будет работать или мне нужно, чтобы извлечь все в 16 * numJoints размера плавающие массивы, которые кажутся дорогими для каждого тика.

редактировать это то, что я сделал, который, кажется, действительно дорого для каждой операции вытяжки

void MD5Loader::uploadToGPU() 
{ 
float* finalmat=new float[16*numJoints]; 
for (int i=0; i < numJoints; i++) 
    for (int j=0; j < 4; j++) 
     for(int k=0; k < 4; k++) 
      finalmat[16*i + j*4 + k] = finalBones[i][j][k]; 


glUniformMatrix4fv(shader.getLocation("Bones"),numJoints,false,finalmat); 

delete[] finalmat; 
} 

ответ

5

Это зависит от двух вещей. Предполагая, что ваш компилятор - C++ 03 (и вы заботитесь о соблюдении стандартов), то ваш Matrix класс должен быть a POD type. Он должен, в частности, не иметь конструкторов. C++ 11 relaxes these rules significantly.

Другое дело, что ваша матрица, по-видимому, имеет большое значение. Я говорю об этом, потому что ваш operator[] кажется, что ваш 2D-массив имеет большое значение. Первая координата - это row, а не столбец, поэтому это порядок хранения строк.

Если вы собираетесь дать OpenGL строки-мажорные матрицы, вам нужно сказать это, что они рядные-мажорный:

glUniformMatrix4fv (shader.getLocation ("Bones"), numJoints, GL_TRUE, finalBones [0] [0]);

+0

Я отредактировал сообщение, дорого ли это делать? – deniz

+4

@deniz: Прежде всего, это новый вопрос. Если у вас есть новый вопрос, вы должны задать новый вопрос. Во-вторых, вы должны использовать 'std :: vector ', а не массив. Третье и самое главное ... * почему ты это сделал? Я просто сказал вам, как дать матрицы OpenGL, которые являются основными. Наконец, прекратите передавать значения C++ 'true' и' false' для 'GLboolean'' GL_TRUE' и 'GL_FALSE'. –

+0

Умм, мой класс matrix4 имеет конструкторы, но он имеет только мату [4] [4] в качестве переменной. все остальное - перегрузка оператора и основные матричные функции. Я не уверен, что это POD в C++ 03 – deniz

1

С C++ 11 класс с standard layout может быть отнесен к указателю, адресованному его первому члену, и обратно. С чеком SizeOf, то вы имеете гарантию непрерывных данных матрицы:

#include <type_traits> 

static_assert((sizeof(Matrix4) == (sizeof(GLfloat) * 16)) && 
       (std::is_standard_layout<Matrix4>::value), 
       "Matrix4 does not satisfy contiguous storage requirements"); 

Trivial (или POD) макеты слишком ограничительными, как только вы нетривиальные конструкторы и т.д. Ваше сообщение предлагает вам потребуется для установки параметра transpose на GL_TRUE.

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

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