hi everyone
i want to follow a tutorial series and i just do everything but the seen still blank first this what I've done till now
i use the classes gameWindow ,renderSystem VertexBuffer,ShaderInterface,shaderLoader and ResourceManger.
i create the gameWindow inside it take a refrence to rendersystem and setup the context inside the gamewindow and take it bake on renderSytem i use this lines on render method
void RenderSystem::render(VertexBuffer *vertexBuffer){
glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
glUseProgram((vertexBuffer->getShader())->get_programHandle());
glLoadIdentity();
gluLookAt(0.0f,0.0f,-5.0f,0.0f,0.0f,0.0f,0.0f,1.0f,0.0f);
vertexBuffer->configureVertexAttributes();
vertexBuffer->renderVertexBuffer();
glfwSwapBuffers(_window);
glfwPollEvents();
}
and callback this method on game loop
the resoureceManager has a vector of vertex buffer and i pass the first element from this vector to the render method
the vertexbuffer file is
#include "VertexBuffer.h"
VertexBuffer::VertexBuffer(GLvoid *data,GLsizeiptr dataSize,GLenum mode,GLsizei Count,GLsizei stride,ShaderInterface *shader):
_mode(mode),_stride(stride),_count(Count),_shader(shader)
{
glGenBuffers(1,&_vertexBufferId);
glBindBuffer(GL_ARRAY_BUFFER,_vertexBufferId);
glBufferData(GL_ARRAY_BUFFER,dataSize,data,GL_STATIC_DRAW);
}
GLuint VertexBuffer::getVertexBufferId(){
return _vertexBufferId;
}
void VertexBuffer::configureVertexAttributes(){
if(_shader->get_aPositionVertex()!=-1){
glEnableVertexAttribArray(_shader->get_aPositionVertex());
glVertexAttribPointer(_shader->get_aPositionVertex(),3,GL_FLOAT,GL_FALSE,_stride,NULL);
}
}
ShaderInterface *VertexBuffer::getShader(){
return _shader;
}
void VertexBuffer::renderVertexBuffer(){
glDrawArrays(_mode,1,_count);
}
VertexBuffer::~VertexBuffer()
{
glDeleteBuffers(1,&_vertexBufferId);
_vertexBufferId=0;
}
i have create the buffer on the resourceManager on the constructor
#include "ResourceManager.h"
#include "Vertecies.h"
ResourceManager::ResourceManager()
{
_shaderArray= new std::vector <ShaderInterface *>();
ShaderInterface *shader=new ShaderInterface("ColorSharder.vs","ColorSharder.fs");
_shaderArray->push_back(shader);
_vertexbufferArray= new std::vector <VertexBuffer *>();
VertexBuffer *vertexBuffer=new VertexBuffer(vertices,sizeof(vertices),GL_TRIANGLES,3,3*sizeof(GLfloat),_shaderArray->at(0));
_vertexbufferArray->push_back(vertexBuffer);
}
std::vector <ShaderInterface *>*ResourceManager::getShaderArray(){
return _shaderArray;
}
std::vector <VertexBuffer *>*ResourceManager::getVertexBuffer(){
return _vertexbufferArray;
}
ResourceManager& ResourceManager::getResourceManager()
{
ResourceManager *resourceManager=NULL;
if(resourceManager==NULL){
resourceManager=new ResourceManager();
}
return *resourceManager;
}
void ResourceManager::destroyResourceManager()
{
ResourceManager *resourceManager=&getResourceManager();
delete resourceManager;
}
ResourceManager::~ResourceManager()
{
for(std::vector<ShaderInterface *>::iterator step=_shaderArray->begin();step!=_shaderArray->end();step++){
delete *step;
}
delete _shaderArray;
for(std::vector<VertexBuffer *>::iterator step=_vertexbufferArray->begin();step!=_vertexbufferArray->end();step++){
delete *step;
}
delete _vertexbufferArray;
}
the bufferLoudaer is present below and i think is work just find because it print the index on buffer
#include "ShaderLoader.h"
#include <stdio.h>
ShaderLoader::ShaderLoader(const char *vs,const char *fs)
{
glfwGetCurrentContext();
GLenum err = glewInit();
if (GLEW_OK != err)
{
std::cout<<glewGetErrorString(err);
}
_programeHandl=glCreateProgram();
GLuint vertexShader=CompileSharder(GL_VERTEX_SHADER,vs);
GLuint fragmentShader=CompileSharder(GL_FRAGMENT_SHADER,fs);
glAttachShader(_programeHandl,vertexShader);
glAttachShader(_programeHandl,fragmentShader);
glLinkProgram(_programeHandl);
glDeleteShader(vertexShader);
glDeleteShader(fragmentShader);
}
GLuint ShaderLoader::getProgramehandl(){
return _programeHandl;
}
GLuint ShaderLoader::CompileSharder(GLenum shader,const char *source){
GLuint shaderHandle=glCreateShader(shader);
glShaderSource(shaderHandle,1,&source,NULL);
glCompileShader(shaderHandle);
std::cout<<shaderHandle<<"\n";
// check for compile errors
int params = -1;
glGetShaderiv (shaderHandle, GL_COMPILE_STATUS, ¶ms);
if (GL_TRUE != params) {
fprintf (stderr, "ERROR: GL shader index %i did not compile\n", shaderHandle);
return false; // or exit or something
}
return shaderHandle;
}
ShaderLoader::~ShaderLoader()
{
glDeleteProgram(_programeHandl);
}
the shaders i am use
#version 400
attribute vec3 aPositionVertex;
void main () {
gl_Position =vec4 (aPositionVertex, 1.0);
}
//fragment shader
#version 400
uniform vec4 uColor;
void main () {
//frag_colour = uColor;
gl_FragColor= uColor;
}
i get the attributes from the shaderinterface with get_uColor() and get_aPositionVertex()
but i don't know how to pass the vertexbuffer to this pointer
_vertexShaderString=readShaderFile(fileVs);
_fragmentShaderString=readShaderFile(fileFs);
_shader=new ShaderLoader(_vertexShaderString,_fragmentShaderString);
_aPositionVertex=glGetAttribLocation(_shader->getProgramehandl(),"aPositionVertex");
_uColor=glGetUniformLocation(_shader->getProgramehandl(),"uColor");