Jetzt noch eine Design Frage: wie bereite ich meine Daten so auf, dass ich auch später relativ dynamisch Lichter rein und rausschmeißen kann?
Momentan liegen meine Daten so vor:
|
C-/C++-Quelltext
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
|
// andere Klassen sehen ähnlich aus
class DirectionalLight:public Component{
public:
struct directionalLight{
vec3 direction;
color diffuse, specular;
};
directionalLight m_light;
DirectionalLight();
DirectionalLight(const vec3 &direction, const color &diffuse, const color &specular);
};
// im renderer
bb::UBO<char>* m_lightSources;
std::vector<bb::DirectionalLight*> m_directionalLights;
std::vector<bb::PointLight*> m_pointLights;
std::vector<bb::SpotLight*> m_spotLights;
// im shader
uniform LightSources{
DirectionalLight directionalLight[1]; // arrays werden nachher noch größer... Menge der Lichtquellen wird als andere uniform übergeben -> for
PointLight pointLight[1];
SpotLight spotLight[1];
};
|
Jetzt dachte ich schnapp ich mir ein char UBO und kopiere einfach die Daten aus den vectoren darein. Über ein offset lässt sich dann auch ein spezielles Licht ansprechen. Beim rausschmeißen muss dann allerdings alles umkopiert werden...
Wie würdet ihrs machen?
Und wo ich gerade dabei bin, ich komme mit dem Daten hin und her kopieren nie wirklich klar
Gerade versuche ich es so (für das erste directional light funktioniert das auch):
|
C-/C++-Quelltext
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
void Renderer3D::initLightSources(){
char* data = new char[sizeof(bb::DirectionalLight::directionalLight)*m_directionalLights.size()+sizeof(bb::PointLight::pointLight)*m_pointLights.size()+sizeof(bb::SpotLight::spotLight)*m_spotLights.size()]; // Größe: alle Lichtquelle, erst dirlight, pointlight, spotlight
memcpy(data, reinterpret_cast<char*>(&m_directionalLights[0]->m_light), sizeof(bb::DirectionalLight::directionalLight)*m_directionalLights.size());
memcpy(data+sizeof(bb::DirectionalLight::directionalLight)*m_directionalLights.size(), reinterpret_cast<char*>(&m_pointLights[0]->m_light), sizeof(bb::PointLight::pointLight)*m_pointLights.size()); // ja sieht schlimm aus... aber ist eigentlich nur data Adresse + offset der dirlight daten
memcpy(data+sizeof(bb::PointLight::pointLight)*m_pointLights.size(), reinterpret_cast<char*>(&m_spotLights[0]->m_light), sizeof(bb::SpotLight::spotLight)*m_spotLights.size());
m_lightSources = new bb::UBO<char>("LightSources"); // der "Name" des Buffers ist hier uniform Name
m_lightSources->fill(m_shader->getID(),
0, // binding port
data,
sizeof(bb::DirectionalLight::directionalLight)*m_directionalLights.size()+sizeof(bb::PointLight::pointLight)*m_pointLights.size()+sizeof(bb::SpotLight::spotLight)*m_spotLights.size(),
true); // kopiert in internen vector (für späteren Zugriff)
}
|
Nur die Daten mit dem 2 und 3 memcpy sind schrott.