You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
50 lines
1.9 KiB
50 lines
1.9 KiB
#include "shader.h"
|
|
#include "utils.h"
|
|
#include "vertexbuffer.h"
|
|
|
|
void Shader::Init(const char * vs, const char * fs)
|
|
{
|
|
int nFileSize = 0;
|
|
const char*vsCode = (char*)LoadFileContent(vs, nFileSize);
|
|
const char*fsCode = (char*)LoadFileContent(fs, nFileSize);
|
|
GLuint vsShader = CompileShader(GL_VERTEX_SHADER, vsCode);
|
|
if (vsShader == 0) {
|
|
return;
|
|
}
|
|
GLuint fsShader = CompileShader(GL_FRAGMENT_SHADER, fsCode);
|
|
if (fsShader == 0) {
|
|
return;
|
|
}
|
|
mProgram = CreateProgram(vsShader, fsShader);
|
|
glDeleteShader(vsShader);
|
|
glDeleteShader(fsShader);
|
|
|
|
if (mProgram != 0) {
|
|
mModelMatrixLocation = glGetUniformLocation(mProgram, "ModelMatrix");
|
|
mViewMatrixLocation = glGetUniformLocation(mProgram, "ViewMatrix");
|
|
mProjectionMatrixLocation = glGetUniformLocation(mProgram, "ProjectionMatrix");
|
|
mPositionLocation = glGetAttribLocation(mProgram, "position");
|
|
mColorLocation = glGetAttribLocation(mProgram, "color");
|
|
mTexcoordLocation = glGetAttribLocation(mProgram, "texcoord");
|
|
mNormalLocation = glGetAttribLocation(mProgram, "normal");
|
|
}
|
|
}
|
|
void Shader::Bind(float *M, float *V, float*P) {
|
|
glUseProgram(mProgram);
|
|
|
|
glUniformMatrix4fv(mModelMatrixLocation, 1, GL_FALSE, M);
|
|
glUniformMatrix4fv(mViewMatrixLocation, 1, GL_FALSE, V);
|
|
glUniformMatrix4fv(mProjectionMatrixLocation, 1, GL_FALSE, P);
|
|
|
|
glEnableVertexAttribArray(mPositionLocation);
|
|
glVertexAttribPointer(mPositionLocation, 4, GL_FLOAT, GL_FALSE, sizeof(Vertex), 0);
|
|
|
|
glEnableVertexAttribArray(mColorLocation);
|
|
glVertexAttribPointer(mColorLocation, 4, GL_FLOAT, GL_FALSE, sizeof(Vertex), (void*)(sizeof(float) * 4));
|
|
|
|
glEnableVertexAttribArray(mTexcoordLocation);
|
|
glVertexAttribPointer(mTexcoordLocation, 4, GL_FLOAT, GL_FALSE, sizeof(Vertex), (void*)(sizeof(float) * 8));
|
|
|
|
glEnableVertexAttribArray(mNormalLocation);
|
|
glVertexAttribPointer(mNormalLocation, 4, GL_FLOAT, GL_FALSE, sizeof(Vertex), (void*)(sizeof(float) * 12));
|
|
}
|