hey guys i am animating a triangle so that colors rotates inside side the triangle by interpolation. but i am getting a blank window, please help me out, thanks in advance.
main code
int main(int argc, char* argv[])
{
display disp(800,600,"anime");
GLfloat vertices[] = { -0.5f, -0.5f, 0.0f,
0.5f, -0.5f, 0.0f,
+0.0f, +0.5f, 0.0f,
};
GLfloat color[] = { +1.0f, +0.0f, +0.0f,
+0.0f, +1.0f, +0.0f,
+0.0f, +0.0f, +1.0f,
};
Shader shaders("./basics");
mesh mes(vertices, (sizeof(vertices))/3,color);
GLfloat deltacolor=0.05f;
while (!disp.windowclose())
{
disp.clear(0.0f, 0.15f, 0.3f, 1.0f);
mes.updatemesh(vertices, color);
shaders.Bind();
mes.draw();
disp.update();
////vertex 1 coloar change
if (color[0] <= 1 && color[0] > 0)
{
color[1] += deltacolor;
color[0] -= deltacolor;
}
else if (color[1] <= 1 && color[1] > 0)
{
color[2] += deltacolor;
color[1] -= deltacolor;
}
else if (color[2] <= 1 && color[2] > 0)
{
color[0] += deltacolor;
color[2] -= deltacolor;
}
////vertex 2 coloar change
if (color[3] <= 1 && color[3] > 0)
{
color[4] += deltacolor;
color[3] -= deltacolor;
}
else if (color[4] <= 1 && color[4] > 0)
{
color[5] += deltacolor;
color[4] -= deltacolor;
}
else if (color[5] <= 1 && color[5] > 0)
{
color[3] += deltacolor;
color[5] -= deltacolor;
}
//vertex 3 coloar change
if (color[6] <= 1 && color[6] > 0)
{
color[7] += deltacolor;
color[6] -= deltacolor;
}
else if (color[7] <= 1 && color[7] > 0)
{
color[8] += deltacolor;
color[7] -= deltacolor;
}
else if (color[8] <= 1 && color[8] > 0)
{
color[6] += deltacolor;
color[8] -= deltacolor;
}
SDL_Delay(1);
}
return 0;
}
mesh code
mesh::mesh(const GLfloat* vertices, unsigned int num_vertices,GLfloat* color)
{
m_drawCount = num_vertices;
glGenVertexArrays(1, &vertexArrayObject);
glBindVertexArray(vertexArrayObject);
glGenBuffers(num_buffers, vertexArrayBuffers);
glBindBuffer(GL_ARRAY_BUFFER, vertexArrayBuffers[position]);
glBufferData(GL_ARRAY_BUFFER, sizeof(vertices)+sizeof(color), NULL, GL_DYNAMIC_DRAW);
glBufferSubData(GL_ARRAY_BUFFER, 0, sizeof(vertices), vertices);
glEnableVertexAttribArray(0);
glEnableVertexAttribArray(1);
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, 0);
glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, 0, (GLvoid*)(sizeof(vertices)));
glBindVertexArray(0);
}
mesh::~mesh()
{
glDeleteBuffers(num_buffers, vertexArrayBuffers);
glDeleteVertexArrays(1, &vertexArrayObject);
}
void mesh::draw()
{
glBindVertexArray(vertexArrayObject);
glDrawArrays(GL_TRIANGLES, 0, m_drawCount);
glBindVertexArray(0);
}
void mesh::updatemesh(const GLfloat* vertices, const GLfloat* color)
{
glBindVertexArray(vertexArrayObject);
glBufferSubData(GL_ARRAY_BUFFER, sizeof(vertices), sizeof(color), color);
}
shader code
#include "shader.h"
#include <iostream>
#include <fstream>
Shader::Shader(const std::string& fileName)
{
m_program = glCreateProgram();
m_shaders[0] = CreateShader(LoadShader(fileName + ".vert"), GL_VERTEX_SHADER);
m_shaders[1] = CreateShader(LoadShader(fileName + ".frag"), GL_FRAGMENT_SHADER);
for (unsigned int i = 0; i < NUM_SHADERS; i++)
glAttachShader(m_program, m_shaders[i]);
glBindAttribLocation(m_program, 0, "position");
glBindAttribLocation(m_program, 1, "vertexColor");
glLinkProgram(m_program);
CheckShaderError(m_program, GL_LINK_STATUS, true, "Error linking shader program");
glValidateProgram(m_program);
CheckShaderError(m_program, GL_VALIDATE_STATUS, true, "Invalid shader program");
}
Shader::~Shader()
{
for (unsigned int i = 0; i < NUM_SHADERS; i++)
{
glDetachShader(m_program, m_shaders[i]);
glDeleteShader(m_shaders[i]);
}
glDeleteProgram(m_program);
}
void Shader::Bind()
{
glUseProgram(m_program);
}
std::string Shader::LoadShader(const std::string& fileName)
{
std::ifstream file;
file.open((fileName).c_str());
std::string output;
std::string line;
if (file.is_open())
{
while (file.good())
{
getline(file, line);
output.append(line + "
");
}
}
else
{
std::cerr << "Unable to load shader: " << fileName << std::endl;
}
return output;
}
void Shader::CheckShaderError(GLuint shader, GLuint flag, bool isProgram, const std::string& errorMessage)
{
GLint success = 0;
GLchar error[1024] = { 0 };
if (isProgram)
glGetProgramiv(shader, flag, &success);
else
glGetShaderiv(shader, flag, &success);
if (success == GL_FALSE)
{
if (isProgram)
glGetProgramInfoLog(shader, sizeof(error), NULL, error);
else
glGetShaderInfoLog(shader, sizeof(error), NULL, error);
std::cerr << errorMessage << ": '" << error << "'" << std::endl;
}
}
GLuint Shader::CreateShader(const std::string& text, unsigned int type)
{
GLuint shader = glCreateShader(type);
if (shader == 0)
std::cerr << "Error compiling shader type " << type << std::endl;
const GLchar* p[1];
p[0] = text.c_str();
GLint lengths[1];
lengths[0] = text.length();
glShaderSource(shader, 1, p, lengths);
glCompileShader(shader);
CheckShaderError(shader, GL_COMPILE_STATUS, false, "Error compiling shader!");
return shader;
}
thanks in advance