Hi,
ich bin mir gerade nicht sicher wie ich meine Lichtquellen am besten an meinen Shader sende (stelle aktuell auf ein Entity Component System um).
Alle Lichtquellen liegen als Objekte vor:
|
C-/C++-Quelltext
|
1
2
3
4
5
6
7
8
9
10
|
class Light:public Component{ // Basisklasse, wird noch Entity damit ich Shadowmaps als Komponente binden kann
public:
vec3 m_position;
color m_diffuse, m_specular;
Light();
Light(const vec3 &position, const color &diffuse, const color &specular);
};
// DirectionalLight, PointLight, SpotLight abgeleitet von Light
|
Der 3D renderer hat 3 vectoren für jeweils eine Sorte Lichtquelle:
|
C-/C++-Quelltext
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
class Renderer3D:public bb::System{
public:
Camera* m_camera;
bb::Shader* m_shader;
bb::color m_ambient;
std::vector<bb::DirectionalLight*> m_directionalLights; // <--
std::vector<bb::PointLight*> m_pointLights;
std::vector<bb::SpotLight*> m_spotLights;
Renderer3D();
Renderer3D(Camera* camera, bb::Shader* shader);
virtual ~Renderer3D();
void update(const float deltaTime);
};
|
Im Shader liegen die Lichtquellen dann als structs vor und werden als array angenommen, z.B.:
|
Quellcode
|
1
2
3
4
5
6
|
struct DirectionalLight{
vec3 direction;
vec4 diffuse, specular;
};
uniform DirectionalLight directionalLight[10];
|
Übergeben werden sie dann aktuell so:
|
C-/C++-Quelltext
|
1
2
3
4
5
|
for(std::vector<bb::DirectionalLight*>::iterator i = m_directionalLights.begin(); i != m_directionalLights.end(); i++){
m_shader->sendUniform("directionalLight[0].direction", (*i)->m_position.x, (*i)->m_position.y, (*i)->m_position.z);
m_shader->sendUniform("directionalLight[0].diffuse", (*i)->m_diffuse.r, (*i)->m_diffuse.g, (*i)->m_diffuse.b, (*i)->m_diffuse.a);
m_shader->sendUniform("directionalLight[0].specular", (*i)->m_specular.r, (*i)->m_specular.g, (*i)->m_specular.b, (*i)->m_specular.a);
}
|
Wie übergebe ich dann jetzt am besten alle Lichtquellen? Momentan habe ich das erstmal fest an die 0 gebunden. Das soll natürlich nicht so bleiben und stringstream ist langsam. Außerdem wüsste ich gerne ob ich die arrays im Shader dynamisch groß machen kann, oder muss ich dann jedes mal neu compilieren?
Könnte ich wenn ich die Daten in den Klassen als struct speichere diese in einem sendUniforms1fv übergeben?