试着自己封装了一下shader
shader.h
#pragma once
#include"includes/glad.h"
#include"includes/glfw3.h"
#include <iostream>
#include <vector>
using namespace std;
struct code
{
int type;
char* sourcePath;
};
class shader
{
public:
shader(vector<code> path);
~shader();
int CreateShader();
int CompileShader();
int CreateProgram();
int LinkShader();
int UseShader();
int Uniform(float colorValue);
vector<int> m_shaderObjs;
vector<code> m_shaders;
unsigned int m_shaderProgram;
};
shader.cpp
#include "shader.h"
#include <fstream>
#include <sstream>
shader::shader(vector<code> path)
{
code *temp = new code;
int len = path.size();
char buffer[256];
for (int i = 0; i < len; i++)
{
ifstream file;
string source;
file.open(path[i].sourcePath);
stringstream stream;
stream << file.rdbuf();
file.close();
string sourcestr = stream.str();
int nLenght = sourcestr.size();
temp->sourcePath = new char[nLenght + 1];
strcpy(temp->sourcePath, sourcestr.c_str());
temp->type = path[i].type;
m_shaders.push_back(*temp);
}
}
shader::~shader()
{
}
int shader::CreateShader()
{
int len = m_shaders.size();
for (int i = 0; i < len; i++)
{
unsigned int ShaderObj = glCreateShader(m_shaders[i].type);
glShaderSource(ShaderObj, 1, &m_shaders[i].sourcePath, NULL);
m_shaderObjs.push_back(ShaderObj);
}
return 0;
}
int shader::CompileShader()
{
int success;
char infoLog[512];
int len = m_shaderObjs.size();
for (int i = 0; i < len; i++)
{
glCompileShader(m_shaderObjs[i]);
glGetShaderiv(m_shaderObjs[i], GL_COMPILE_STATUS, &success);
if (!success)
{
glGetShaderInfoLog(m_shaderObjs[i], 512, NULL, infoLog);
cout << "ERROR: " << infoLog << endl;
return -1;
}
}
return 0;
}
int shader::CreateProgram()
{
m_shaderProgram = glCreateProgram();
return 0;
}
int shader::LinkShader()
{
int len = m_shaderObjs.size();
for (int i = 0; i < len; i++)
{
glAttachShader(m_shaderProgram, m_shaderObjs[i]);
}
glLinkProgram(m_shaderProgram);
int success;
char infoLog[512];
glGetProgramiv(m_shaderProgram, GL_LINK_STATUS, &success);
if (!success)
{
glGetProgramInfoLog(m_shaderProgram, 512, NULL, infoLog);
cout << "ERROR: " << infoLog << endl;
return -1;
}
return 0;
}
int shader::UseShader()
{
glUseProgram(m_shaderProgram);
return 0;
}
int shader::Uniform(float colorValue)
{
int vertexColorLocation = glGetUniformLocation(m_shaderProgram, "ourColor");
glUniform4f(vertexColorLocation, 0.0f, colorValue, 0.0f, 1.0f);
return vertexColorLocation;
}
用着确实能用,但是觉得不好用。可能了解的太浅了吧,下面要准备学习纹理方面的内容了,需要用到stb_image.h库,下载地址https://github.com/nothings/stb/blob/master/stb_image.h