Hi everyone, sorry if the title of the topic sounds misleading or confusing.
I’ve been banging my head on the wall for quite a time now, and I reckon my issue comes from something really dumb.
I’ll try to be brief and not overwhelm you with endless code.
Here goes :
My DirectionalLight.h (main light used in the program) :
#ifndef DIRECTIONALLIGHT_H
#define DIRECTIONALLIGHT_H
#include "BaseLight.h"
class DirectionalLight : public BaseLight
{
public:
DirectionalLight();
DirectionalLight(glm::vec3 colour, GLfloat ambientIntensity, GLfloat diffuseIntensity, glm::vec3 direction);
~DirectionalLight();
void UseLight(GLfloat ambientColourLocation, GLfloat ambientIntensityLocation, GLfloat diffuseIntensityLocation, GLfloat directionLocation);
glm::vec3 GetDirection() const { return mDirection; }
private:
glm::vec3 mDirection;
};
#endif
The method that I use (apart from others - untouched either) to render the cube :
void DirectionalLight::UseLight(GLfloat ambientColourLocation, GLfloat ambientIntensityLocation, GLfloat diffuseIntensityLocation, GLfloat directionLocation)
{
glUniform3f(
ambientColourLocation,
mAmbientColour.x,
mAmbientColour.y,
mAmbientColour.z
);
glUniform1f(ambientIntensityLocation, mAmbientIntensity);
glUniform3f(
directionLocation,
mDirection.x,
mDirection.y,
mDirection.z
);
glUniform1f(diffuseIntensityLocation, mDiffuseIntensity);
}
My former Shader.h :
#ifndef SHADER_H
#define SHADER_H
#include "Util.h"
class Shader
{
public:
Shader();
~Shader();
void CreateFromString(const char* vertexCode, const char* fragmentCode);
void CreateFromFiles(const char* vertexShaderLocation, const char* fragmentShaderLocation);
std::string ReadFile(const char* fileLocation);
GLuint GetProjectionLocation() const { return mUniformProjection; }
GLuint GetViewLocation() const { return mUniformView; }
GLuint GetModelLocation() const { return mUniformModel; }
GLuint GetEyePositionLocation() const { return mUniformEyePosition; }
GLuint GetAmbientColourLocation() const { return mUniformAmbientColour; }
GLuint GetAmbientIntensityLocation() const { return mUniformAmbientIntensity; }
GLuint GetDiffuseColourLocation() const { return mUniformDiffuseColour; }
GLuint GetDiffuseIntensityLocation() const { return mUniformDiffuseIntensity; }
GLuint GetDirectionLocation() const { return mUniformDirection; }
GLuint GetSpecularIntensityLocation() const { return mUniformSpecularIntensity; }
GLuint GetShininessLocation() const { return mUniformShininess; }
void UseShader();
void ClearShader();
private:
bool AddShader(GLuint theProgram, const char* shaderCode, GLenum shaderType);
bool CompileShader(const char* vertexCode, const char* fragmentCode);
private:
GLuint mShaderID;
GLuint mUniformProjection;
GLuint mUniformView;
GLuint mUniformModel;
GLuint mUniformEyePosition;
GLuint mUniformAmbientColour;
GLuint mUniformAmbientIntensity;
GLuint mUniformDiffuseColour;
GLuint mUniformDirection;
GLuint mUniformDiffuseIntensity;
GLuint mUniformSpecularIntensity;
GLuint mUniformShininess;
};
#endif
Then in the Render function in main, I use :
mDirectionalLight.UseLight(
mShaderList[0].GetAmbientColourLocation(),
mShaderList[0].GetAmbientIntensityLocation(),
mShaderList[0].GetDiffuseIntensityLocation(),
mShaderList[0].GetDirectionLocation()
);
Outcome : Everything goes fine.
Now…
My new Shader.h :
#ifndef SHADER_H
#define SHADER_H
#include "DirectionalLight.h"
#include "PointLight.h"
struct UniformDirectionalLight
{
GLuint uniformColour;
GLuint uniformAmbientIntensity;
GLuint uniformDiffuseIntensity;
GLuint uniformDirection;
};
class Shader
{
public:
Shader();
~Shader();
void CreateFromString(const char* vertexCode, const char* fragmentCode);
void CreateFromFiles(const char* vertexShaderLocation, const char* fragmentShaderLocation);
std::string ReadFile(const char* fileLocation);
GLuint GetProjectionLocation() const { return mUniformProjection; }
GLuint GetViewLocation() const { return mUniformView; }
GLuint GetModelLocation() const { return mUniformModel; }
GLuint GetEyePositionLocation() const { return mUniformEyePosition; }
GLuint GetAmbientColourLocation() const { return mUniformDirectionalLight.uniformColour; }
GLuint GetAmbientIntensityLocation() const { return mUniformDirectionalLight.uniformAmbientIntensity; }
GLuint GetDiffuseIntensityLocation() const { return mUniformDirectionalLight.uniformDiffuseIntensity; }
GLuint GetDirectionLocation() const { return mUniformDirectionalLight.uniformDirection; }
GLuint GetSpecularIntensityLocation() const { return mUniformSpecularIntensity; }
GLuint GetShininessLocation() const { return mUniformShininess; }
void SetDirectionalLight(DirectionalLight* directionalLight); // Problems come from here
void UseShader();
void ClearShader();
private:
bool AddShader(GLuint theProgram, const char* shaderCode, GLenum shaderType);
bool CompileShader(const char* vertexCode, const char* fragmentCode);
private:
int mPointLightCount;
UniformDirectionalLight mUniformDirectionalLight;
GLuint mShaderID;
GLuint mUniformProjection;
GLuint mUniformView;
GLuint mUniformModel;
GLuint mUniformEyePosition;
GLuint mUniformSpecularIntensity;
GLuint mUniformShininess;
};
#endif
→ The SetDirectionalLight method :
void Shader::SetDirectionalLight(DirectionalLight* directionalLight)
{
directionalLight->UseLight(
mUniformDirectionalLight.uniformAmbientIntensity,
mUniformDirectionalLight.uniformColour,
mUniformDirectionalLight.uniformDiffuseIntensity,
mUniformDirectionalLight.uniformDirection
);
}
And now I use this in the Render function :
mShaderList[0].SetDirectionalLight(&mDirectionalLight);
Outcome : NOK, nothing appears at all.
Any clues ? This has to be something very silly but here it’s past 3 AM… You get the idea.
I’ll provide some more explanations and/or code if need be.
Thousand thanks to you guys.
Skelkingr