着色器加载类

功能可以创建窗口,加载着色器

#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;
	}
};
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值