类 Shader是 一个开源的库,其实就是一个封装好的功能Class
一、Shader类
class Shader
{
public:
unsigned int ID;
// constructor generates the shader on the fly
// ------------------------------------------------------------------------
Shader(const char* vertexPath, const char* fragmentPath)
{
// 1. retrieve the vertex/fragment source code from filePath
std::string vertexCode;
std::string fragmentCode;
std::ifstream vShaderFile;
std::ifstream fShaderFile;
在类的构造函数中,主要是读取vertex文件、fragment文件数据并且编译创建相应的Shader对象,并创建ID值:ID = glCreateProgram();
// 2. compile shaders
unsigned int vertex, fragment;
// vertex shader
vertex = glCreateShader(GL_VERTEX_SHADER);
glShaderSource(vertex, 1, &vShaderCode, NULL);
glCompileShader(vertex);
checkCompileErrors(vertex, "VERTEX");
// fragment Shader
fragment = glCreateShader(GL_FRAGMENT_SHADER);
glShaderSource(fragment, 1, &fShaderCode, NULL);
glCompileShader(fragment);
checkCompileErrors(fragment, "FRAGMENT");
// shader Program
ID = glCreateProgram();
glAttachShader(ID, vertex);
glAttachShader(ID, fragment);
glLinkProgram(ID);
checkCompileErrors(ID, "PROGRAM");
二、使用方法
Shader ourShader("3.3.shader.vs", "3.3.shader.fs");
其中"3.3.shader.vs",是vertex对应的配置文件,3.3.shader.fs是fragment对应的配置文件。
2.实例化Shader对象ourShader
ourShader.use(); //先调
float offset = 0.5f;
ourShader.setFloat("xOffset", offset); //后调
注意事项:setFloat()函数一定要在use()之后调用,否则配置的属性参数不能生效。
效果如下,X坐标整体向右移动0.5个单位: