small fixes in shaders and small change in camera calls parameters
This commit is contained in:
parent
da4906452d
commit
60a1dfb781
104
src/shader.cpp
104
src/shader.cpp
@ -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()
|
||||||
|
@ -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);
|
||||||
|
@ -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;
|
||||||
|
@ -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();
|
||||||
};
|
};
|
||||||
|
Loading…
x
Reference in New Issue
Block a user