small fixes in shaders and small change in camera calls parameters

This commit is contained in:
Anselme 2016-12-07 16:15:25 +01:00
parent da4906452d
commit 60a1dfb781
4 changed files with 74 additions and 48 deletions

View File

@ -5,67 +5,77 @@
Shader::Shader(const std::string &vertexSource, const std::string &fragmentSource) Shader::Shader(const std::string &vertexSource, const std::string &fragmentSource)
{ {
program = glCreateProgram(); m_lastShaderError = NULL;
m_lastProgramError = NULL;
m_program = glCreateProgram();
GLuint vertexShaderId = createShader(vertexSource, GL_VERTEX_SHADER); GLuint vertexShaderId = createShader(vertexSource, GL_VERTEX_SHADER);
GLuint fragmentShaderId = createShader(fragmentSource, GL_FRAGMENT_SHADER); GLuint fragmentShaderId = createShader(fragmentSource, GL_FRAGMENT_SHADER);
glAttachShader(program, vertexShaderId); glAttachShader(m_program, vertexShaderId);
glAttachShader(program, fragmentShaderId); glAttachShader(m_program, fragmentShaderId);
glBindAttribLocation(program, 0, "inPosition"); glBindAttribLocation(m_program, 0, "inPosition");
glBindAttribLocation(program, 1, "inNormal"); glBindAttribLocation(m_program, 1, "inNormal");
glBindAttribLocation(program, 2, "inTexCoord"); glBindAttribLocation(m_program, 2, "inTexCoord");
glBindAttribLocation(program, 3, "inTangent"); glBindAttribLocation(m_program, 3, "inTangent");
glBindAttribLocation(program, 4, "inBinormal"); glBindAttribLocation(m_program, 4, "inBinormal");
glLinkProgram(program); glLinkProgram(m_program);
// check errors // check errors
GLint linked; GLint linked;
glGetProgramiv(program, GL_LINK_STATUS, &linked); glGetProgramiv(m_program, GL_LINK_STATUS, &linked);
if (!linked) { if (!linked) {
#ifdef RENDER_DEBUG
std::cerr << "Program not linked" << std::endl; std::cerr << "Program not linked" << std::endl;
printProgramInfoLog(program); #endif
program = 0; printProgramInfoLog(m_program);
m_program = 0;
} }
glDetachShader(program, vertexShaderId); glDetachShader(m_program, vertexShaderId);
glDetachShader(program, fragmentShaderId); glDetachShader(m_program, fragmentShaderId);
glDeleteShader(vertexShaderId); glDeleteShader(vertexShaderId);
glDeleteShader(fragmentShaderId); glDeleteShader(fragmentShaderId);
} }
Shader::Shader(const std::string &vertexSource, const std::string &geometrySource, const std::string &fragmentSource) Shader::Shader(const std::string &vertexSource, const std::string &geometrySource, const std::string &fragmentSource)
{ {
program = glCreateProgram(); m_lastShaderError = NULL;
m_lastProgramError = NULL;
m_program = glCreateProgram();
GLuint vertexShaderId = createShader(vertexSource, GL_VERTEX_SHADER); GLuint vertexShaderId = createShader(vertexSource, GL_VERTEX_SHADER);
GLuint geometryShaderId = createShader(geometrySource, GL_GEOMETRY_SHADER); GLuint geometryShaderId = createShader(geometrySource, GL_GEOMETRY_SHADER);
GLuint fragmentShaderId = createShader(fragmentSource, GL_FRAGMENT_SHADER); GLuint fragmentShaderId = createShader(fragmentSource, GL_FRAGMENT_SHADER);
glAttachShader(program, vertexShaderId); glAttachShader(m_program, vertexShaderId);
glAttachShader(program, geometryShaderId); glAttachShader(m_program, geometryShaderId);
glAttachShader(program, fragmentShaderId); glAttachShader(m_program, fragmentShaderId);
glBindAttribLocation(program, 0, "inPosition"); glBindAttribLocation(m_program, 0, "inPosition");
glBindAttribLocation(program, 1, "inNormal"); glBindAttribLocation(m_program, 1, "inNormal");
glBindAttribLocation(program, 2, "inTexCoord"); glBindAttribLocation(m_program, 2, "inTexCoord");
glLinkProgram(program); glLinkProgram(m_program);
// check errors // check errors
GLint linked; GLint linked;
glGetProgramiv(program, GL_LINK_STATUS, &linked); glGetProgramiv(m_program, GL_LINK_STATUS, &linked);
if (!linked) { if (!linked) {
#ifdef RENDER_DEBUG
std::cerr << "Program not linked" << std::endl; std::cerr << "Program not linked" << std::endl;
printProgramInfoLog(program); #endif
program = 0; printProgramInfoLog(m_program);
m_program = 0;
} }
glDetachShader(program, vertexShaderId); glDetachShader(m_program, vertexShaderId);
glDetachShader(program, geometryShaderId); glDetachShader(m_program, geometryShaderId);
glDetachShader(program, fragmentShaderId); glDetachShader(m_program, fragmentShaderId);
glDeleteShader(vertexShaderId); glDeleteShader(vertexShaderId);
glDeleteShader(geometryShaderId); glDeleteShader(geometryShaderId);
glDeleteShader(fragmentShaderId); glDeleteShader(fragmentShaderId);
@ -74,9 +84,13 @@ Shader::Shader(const std::string &vertexSource, const std::string &geometrySourc
Shader::~Shader() Shader::~Shader()
{ {
bool ok; bool ok;
ok = glIsProgram(program); ok = glIsProgram(m_program);
if(ok) if(ok)
glDeleteProgram(program); glDeleteProgram(m_program);
if(m_lastShaderError != NULL)
delete [] m_lastShaderError;
if(m_lastProgramError != NULL)
delete [] m_lastProgramError;
} }
GLuint Shader::createShader(const std::string &source, GLenum shaderType) GLuint Shader::createShader(const std::string &source, GLenum shaderType)
@ -91,6 +105,7 @@ GLuint Shader::createShader(const std::string &source, GLenum shaderType)
GLint compiled; GLint compiled;
glGetShaderiv(shaderId, GL_COMPILE_STATUS, &compiled); glGetShaderiv(shaderId, GL_COMPILE_STATUS, &compiled);
if (!compiled) { if (!compiled) {
#ifdef RENDER_DEBUG
std::string type_str; std::string type_str;
switch(shaderType) switch(shaderType)
{ {
@ -106,6 +121,7 @@ GLuint Shader::createShader(const std::string &source, GLenum shaderType)
} }
std::cerr << type_str << " shader not compiled : " << std::endl; std::cerr << type_str << " shader not compiled : " << std::endl;
std::cout << "Shader source :" << std::endl << source << std::endl; std::cout << "Shader source :" << std::endl << source << std::endl;
#endif
printShaderInfoLog(shaderId); printShaderInfoLog(shaderId);
return 0; return 0;
} }
@ -117,13 +133,15 @@ void Shader::printShaderInfoLog(GLuint shaderId)
{ {
int infoLogLen = 0; int infoLogLen = 0;
int charsWritten = 0; int charsWritten = 0;
GLchar *infoLog;
glGetShaderiv(shaderId, GL_INFO_LOG_LENGTH, &infoLogLen); glGetShaderiv(shaderId, GL_INFO_LOG_LENGTH, &infoLogLen);
if (infoLogLen > 0) { if (infoLogLen > 0) {
infoLog = new GLchar[infoLogLen]; if(m_lastShaderError != NULL)
glGetShaderInfoLog(shaderId, infoLogLen, &charsWritten, infoLog); delete [] m_lastShaderError;
std::cerr << "InfoLog:" << std::endl << infoLog << std::endl; m_lastShaderError = new GLchar[infoLogLen];
delete [] infoLog; glGetShaderInfoLog(shaderId, infoLogLen, &charsWritten, m_lastShaderError);
#ifdef RENDER_DEBUG
std::cerr << "InfoLog:" << std::endl << m_lastShaderError << std::endl;
#endif
} }
} }
@ -131,25 +149,27 @@ void Shader::printProgramInfoLog(GLuint programId)
{ {
int infoLogLen = 0; int infoLogLen = 0;
int charsWritten = 0; int charsWritten = 0;
GLchar *infoLog;
glGetProgramiv(programId, GL_INFO_LOG_LENGTH, &infoLogLen); glGetProgramiv(programId, GL_INFO_LOG_LENGTH, &infoLogLen);
if (infoLogLen > 0) { if (infoLogLen > 0) {
infoLog = new GLchar[infoLogLen]; if(m_lastProgramError != NULL)
glGetProgramInfoLog(programId, infoLogLen, &charsWritten, infoLog); delete [] m_lastProgramError;
std::cerr << "InfoLog:" << std::endl << infoLog << std::endl; m_lastProgramError = new GLchar[infoLogLen];
delete [] infoLog; glGetProgramInfoLog(programId, infoLogLen, &charsWritten, m_lastProgramError);
#ifdef RENDER_DEBUG
std::cerr << "InfoLog:" << std::endl << m_lastProgramError << std::endl;
#endif
} }
} }
GLuint Shader::getLocation(std::string attribName) GLuint Shader::getLocation(std::string attribName)
{ {
GLuint loc = glGetUniformLocation(program, attribName.c_str()); GLuint loc = glGetUniformLocation(m_program, attribName.c_str());
return loc; return loc;
} }
void Shader::bind() void Shader::bind()
{ {
glUseProgram(program); glUseProgram(m_program);
} }
void Shader::unbind() void Shader::unbind()

View File

@ -7,17 +7,23 @@
class Shader class Shader
{ {
GLuint program; protected:
GLuint m_program;
GLuint createShader(const std::string &source, GLenum shaderType); GLuint createShader(const std::string &source, GLenum shaderType);
void printShaderInfoLog(GLuint shaderId); void printShaderInfoLog(GLuint shaderId);
void printProgramInfoLog(GLuint programId); void printProgramInfoLog(GLuint programId);
GLchar* m_lastShaderError;
GLchar* m_lastProgramError;
public: public:
Shader(const std::string &vertexSource, const std::string &fragmentSource); Shader(const std::string &vertexSource, const std::string &fragmentSource);
Shader(const std::string &vertexSource, const std::string &geometrySource, const std::string &fragmentSource); Shader(const std::string &vertexSource, const std::string &geometrySource, const std::string &fragmentSource);
~Shader(); ~Shader();
GLuint getLocation(std::string attribName); GLuint getLocation(std::string attribName);
const char* getLastShaderError() { return m_lastShaderError; }
const char* getLastProgramError() { return m_lastProgramError; }
bool isValid() {return m_program != 0;}
void bind(); void bind();
void unbind(); void unbind();
void bindFloat(GLuint location, float val); void bindFloat(GLuint location, float val);

View File

@ -62,11 +62,11 @@ void TrackBallCamera::computeView()
m_view = glm::lookAt(m_center - m_direction*m_dist, m_center, glm::vec3(0, 1, 0)); m_view = glm::lookAt(m_center - m_direction*m_dist, m_center, glm::vec3(0, 1, 0));
} }
void TrackBallCamera::zoom(int nbUnits) void TrackBallCamera::zoom(float nbUnits)
{ {
while(nbUnits != 0) while(nbUnits != 0.f)
{ {
if(nbUnits > 0) if(nbUnits > 0.f)
{ {
m_dist *= DEFAULT_SCROLL_SPEED; m_dist *= DEFAULT_SCROLL_SPEED;
--nbUnits; --nbUnits;

View File

@ -21,8 +21,8 @@ public:
void rotateCamera(float dx, float dy); void rotateCamera(float dx, float dy);
void moveCamera(float dx, float dy); void moveCamera(float dx, float dy);
void moveCamera(const glm::vec3 &diff); void moveCamera(const glm::vec3 &diff);
void lookAt(const glm::vec3 &pos); void lookAt(const glm::vec3 &pos);
void zoom(int nbScrolls); void zoom(float nbScrolls);
void reset(); void reset();
glm::vec3 getDefaultPxInfo(); glm::vec3 getDefaultPxInfo();
}; };