2015-05-04 1 views
0

У меня есть форма в шейдере, как это:передачи данных из станд :: вектора к равномерному массиву в GLSL

uniform vec3 origins[10]; 

и зЬй :: вектор в моем коде, как это:

std::vector<glm::vec3> origins; 

, который заполнен десятью элементами glm::vec3.

Кто-нибудь знает, как передать это шейдеру? Я подумал:

GLint originsLoc = glGetUniformLocation(programID, "origins"); 
glUniform3fv(originsLoc, 10, origins.data()); 

будет делать это, но он не скомпилируется. Ошибка говорит, что есть no matching function for call to 'glUniform3fv'. Как передать данные в std::vector способом, который удовлетворяет функции glUniform3fv?

+1

«Это не работает» ... авария? Ничего не сделано? Что-то неожиданное нарисовано? – genpfault

+0

Это не скомпилируется. Следует ли компилировать код? Ошибка говорит, что '' не соответствует функции для вызова 'glUniform3fv''. Я отредактировал вопрос с этой информацией. – acrmuui

+4

Вам нужно будет указать указатель на 'const GLfloat *'. Без трансляции подпись функции не совпадает. Вы также должны включить вывод ** full * compiler. Я предполагаю, что фактическая ошибка включает в себя дополнительную информацию о типе/подписи, которую вы опустили, к сожалению. – Cornstalks

ответ

1

вы должны использовать GLfloat и отметить glm :: vec3. , но здесь это в любом случае:

for (int i = 0; i != 10; i++) { 
GLint originsLoc = glGetUniformLocation(programID, "origins[i]"); 
glUniform3f(originsLoc, origins[i].x, origins[i].y, origins[i].z); 
} 
+1

Спасибо, что ответили, и @Cornstalks указали мне в правильном направлении. То, что я закончил, это то, что также работает: 'glUniform3fv (originsLoc, originins.size(), reinterpret_cast (trackObstacle-> препятствияPopupNormals.data()))' – acrmuui