ich verwende in meiner Applikation zum dynamischen Updaten der Lichtquellenfarben aktuell folgenden Aufruf:
Code: Alles auswählen
case brGraphics::brShaderParameter::eType::FLOAT_ARRAY_VEC4:
{
std::vector<float> data(4);
param->getValues(data, 4);
// only update uniform if we got valid data
unsigned int size = data.size();
if(size==4){
glUniform4fv(hookID, size, &data[0]);
//glUniform4f(hookID, data[0], data[1], data[2], data[3]);
}
}
und zig maligem Durchlauf dieses Aufrufs einen Segmentation fault. Laut GDB backtrace
genau am Aufruf von glUniform4fv.
Sehe hier aber keinen kritischen Punkt, auch beim Debuggen sind alle Werte valide, d.h.Program received signal SIGSEGV, Segmentation fault.
0x00007ffff3b49c13 in ?? () from /usr/lib/nvidia-304/libnvidia-glcore.so.304.117
(gdb) bt
#0 0x00007ffff3b49c13 in ?? () from /usr/lib/nvidia-304/libnvidia-glcore.so.304.117
#1 0x00007ffff5a28521 in binrev::brOpenGL3::brGLSLLinker::updateUniform (this=0x15a2b40, param=std::shared_ptr (count 8, weak 0) 0x12ae0d0)
at /home/hellhound/repository/binrevengine-code/renderer/brOpenGL3/trunk/src/GLSL/brGLSLLinker.cpp:471
ich habe die richtige und gültige HookID, die vec size im Shader ist auch 4 (hier liegt allerdings
auch ein Array vor) und auch die Daten sind vorhanden. Stelle ich das ganze auf den Aufruf
ohne Vektor um, läuft alles sauber durch.
Letztendlich denke ich macht es auch performance technisch keinen Unterschied ob ich die Werte als Array übergebe oder
vorher einzeln auslutsche ... Finde nach wie vor den Array Ansatz nur sauberer.
Hat jemand eine Idee was hier schief laufen könnte?
Vielen Dank schonmal!
Christian