opengl学习笔记

试着自己封装了一下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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值