Move MV transform of lights from fragmentshader to cpu
This commit is contained in:
parent
da7a29a2d1
commit
1b05c0ac82
|
@ -18,11 +18,10 @@ uniform bool isNormalMapped;
|
||||||
uniform bool isInverted;
|
uniform bool isInverted;
|
||||||
|
|
||||||
// lights
|
// lights
|
||||||
struct Light {
|
struct Light { // coordinates in MV space
|
||||||
vec3 position;
|
vec3 position;
|
||||||
mat4 MV;
|
vec3 spot_target;
|
||||||
bool is_spot; // false means point light
|
bool is_spot; // false means point light
|
||||||
vec3 spot_target; // MV space coordinates for spots
|
|
||||||
};
|
};
|
||||||
|
|
||||||
//named
|
//named
|
||||||
|
@ -53,13 +52,13 @@ void main_(vec4 basecolor) {
|
||||||
float specular_intensity = 0.0;
|
float specular_intensity = 0.0;
|
||||||
|
|
||||||
for (int i = 0; i<3; i++) {
|
for (int i = 0; i<3; i++) {
|
||||||
vec3 L = vec3(light[i].MV * vec4(light[i].position, 1.0f)) - vertex;
|
vec3 L = light[i].position - vertex;
|
||||||
float l = length(L);
|
float l = length(L);
|
||||||
float attenuation = clamp(2000/(1 + 1*l + 0.1*l*l), 0.0, 1.25);
|
float attenuation = clamp(2000/(1 + 1*l + 0.1*l*l), 0.0, 1.25);
|
||||||
L = normalize(L);
|
L = normalize(L);
|
||||||
|
|
||||||
if (light[i].is_spot) {
|
if (light[i].is_spot) {
|
||||||
vec3 L2 = normalize(vec3(light[i].MV * vec4(light[i].position, 1.0f)) - light[i].spot_target);
|
vec3 L2 = normalize(light[i].position - light[i].spot_target);
|
||||||
if (dot(L2, L) < spot_cuttof_angle) {
|
if (dot(L2, L) < spot_cuttof_angle) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
@ -101,11 +100,6 @@ void main() {
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
color = texture(diffuseTexture, UV);
|
color = texture(diffuseTexture, UV);
|
||||||
|
|
||||||
}
|
|
||||||
if (isInverted) {
|
|
||||||
color.r = 1 - color.r;
|
|
||||||
color.g = 1 - color.g;
|
|
||||||
color.b = 1 - color.b;
|
|
||||||
}
|
}
|
||||||
|
if (isInverted) color.rgb = 1 - color.rgb;
|
||||||
}
|
}
|
||||||
|
|
|
@ -395,14 +395,13 @@ void updateFrame(GLFWwindow* window) {
|
||||||
|
|
||||||
void renderNode(SceneNode* node) {
|
void renderNode(SceneNode* node) {
|
||||||
struct Light { // lights as stored in the shader
|
struct Light { // lights as stored in the shader
|
||||||
glm::vec3 position;
|
// coordinates in MV space
|
||||||
glm::mat4 MV;
|
vec3 position;
|
||||||
|
vec3 spot_target;
|
||||||
bool is_spot;
|
bool is_spot;
|
||||||
glm::vec3 spot_target; // MV space coordinates
|
|
||||||
|
|
||||||
void push_to_shader(Gloom::Shader* shader, uint id) {
|
void push_to_shader(Gloom::Shader* shader, uint id) {
|
||||||
#define l(x) shader->location("light[" + std::to_string(id) + "]." + #x)
|
#define l(x) shader->location("light[" + std::to_string(id) + "]." + #x)
|
||||||
glUniformMatrix4fv(l(MV) , 1, GL_FALSE, glm::value_ptr(MV));
|
|
||||||
glUniform3fv (l(position) , 1, glm::value_ptr(position));
|
glUniform3fv (l(position) , 1, glm::value_ptr(position));
|
||||||
glUniform3fv (l(spot_target), 1, glm::value_ptr(spot_target));
|
glUniform3fv (l(spot_target), 1, glm::value_ptr(spot_target));
|
||||||
glUniform1i (l(is_spot) , is_spot);
|
glUniform1i (l(is_spot) , is_spot);
|
||||||
|
@ -449,8 +448,7 @@ void renderNode(SceneNode* node) {
|
||||||
case SPOT_LIGHT:
|
case SPOT_LIGHT:
|
||||||
case POINT_LIGHT: {
|
case POINT_LIGHT: {
|
||||||
uint id = node->lightID;
|
uint id = node->lightID;
|
||||||
lights[id].position = node->position;
|
lights[id].position = vec3(node->MV * glm::vec4(node->position, 1.0));
|
||||||
lights[id].MV = node->MV;
|
|
||||||
lights[id].is_spot = node->nodeType == SPOT_LIGHT;
|
lights[id].is_spot = node->nodeType == SPOT_LIGHT;
|
||||||
lights[id].spot_target = node->rotation;
|
lights[id].spot_target = node->rotation;
|
||||||
lights[id].push_to_shader(s, id);
|
lights[id].push_to_shader(s, id);
|
||||||
|
|
Loading…
Reference in New Issue