功能可以创建窗口,加载着色器
#pragma once
#include<GL/glew.h>
#include<GLFW/glfw3.h>
#include<fstream>
#include<iostream>
using namespace std;
#pragma comment(lib,"OpenGL32.lib")
class Shader {
public :
//创建一个窗口
GLFWwindow *createWindow(int width,int height,const char* title) {
// Init GLFW
glfwInit();
// Set all the required options for GLFW
glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3);
glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3);
glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);
glfwWindowHint(GLFW_RESIZABLE, GL_FALSE);
// Create a GLFWwindow object that we can use for GLFW's functions
GLFWwindow* window = glfwCreateWindow(width, height, title, nullptr, nullptr);
glfwMakeContextCurrent(window);
// Set this to true so GLEW knows to use a modern approach to retrieving function pointers and extensions
glewExperimental = GL_TRUE;
glewInit();
int w, h;
glfwGetFramebufferSize(window, &w, &h);
glViewport(0, 0, w, h);
return window;
}
GLchar *readSourceFromFile(const char* filename) {
std::ifstream fin;
GLchar *source;
int len;
fin.open(filename);
fin.seekg(0, std::ios_base::end);
len = fin.tellg();
source = new char[len + 1]{ '\0' };
fin.seekg(0, std::ios_base::beg);
fin.read(source, len);
fin.close();
return source;
}
GLuint LoadProgram(const char *vfilename, const char *ffilename) {
GLuint vShader = glCreateShader(GL_VERTEX_SHADER);
const char *vSource = readSourceFromFile(vfilename);
glShaderSource(vShader, 1, &vSource, nullptr);
glCompileShader(vShader);
GLint success;
GLchar infoLog[512];
glGetShaderiv(vShader, GL_COMPILE_STATUS, &success);
if (!success) {
glGetShaderInfoLog(vShader, 512, NULL, infoLog);
cout << "vShader ERROR:" << infoLog;
}
GLuint fShader = glCreateShader(GL_FRAGMENT_SHADER);
const char *fSource = readSourceFromFile(ffilename);
glShaderSource(fShader, 1, &fSource, nullptr);
glCompileShader(fShader);
glGetShaderiv(fShader, GL_COMPILE_STATUS, &success);
if (!success) {
glGetShaderInfoLog(fShader, 512, NULL, infoLog);
cout << "fShader ERROR:" << infoLog;
}
GLuint shaderProgram = glCreateProgram();
glAttachShader(shaderProgram, vShader);
glAttachShader(shaderProgram, fShader);
glLinkProgram(shaderProgram);
glGetProgramiv(shaderProgram, GL_LINK_STATUS, &success);
if (!success) {
glGetProgramInfoLog(shaderProgram, 512, NULL, infoLog);
cout << "Program ERROR:" << infoLog;
}
glDeleteShader(vShader);
glDeleteShader(fShader);
return shaderProgram;
}
};