代码拉取完成,页面将自动刷新
同步操作将从 pengrui_2009/OpenGL-Study 强制同步,此操作会覆盖自 Fork 仓库以来所做的任何修改,且无法恢复!!!
确定后同步将在后台操作,完成时将刷新页面,请耐心等待。
#include "shader.h"
Shader::Shader(const GLchar* vertexPath, const GLchar* fragmentPath)
{
//读取着色器的代码
std::string vertexCode;
std::string fragmentCode;
std::ifstream vShaderFile;
std::ifstream fShaderFile;
//确保文件流会输出异常
vShaderFile.exceptions(std::ifstream::failbit | std::ifstream::badbit);
fShaderFile.exceptions(std::ifstream::failbit | std::ifstream::badbit);
try
{
//打开文件
vShaderFile.open(vertexPath);
fShaderFile.open(fragmentPath);
std::stringstream vShaderStream, fShaderStream;
//读取文件
vShaderStream << vShaderFile.rdbuf();
fShaderStream << fShaderFile.rdbuf();
vShaderFile.close();
fShaderFile.close();
vertexCode = vShaderStream.str();
fragmentCode = fShaderStream.str();
}
catch(const std::ifstream::failure e)
{
std::cerr << "错误:读取文件失败,请检查文件是否存在!" << std::endl;
}
//2 编译着色器
const char *vShaderCode = vertexCode.c_str();
const char *fShaderCode = fragmentCode.c_str();
unsigned int vertex, fragment;
int success;
char infoLog[512];
//顶点着色器
vertex = glCreateShader(GL_VERTEX_SHADER);
glShaderSource(vertex, 1, &vShaderCode, NULL);
glCompileShader(vertex);
glGetShaderiv(vertex, GL_COMPILE_STATUS, &success);
if (!success)
{
glGetShaderInfoLog(vertex, 512, NULL, infoLog);
std::cout << "编译顶点着色器失败,错误信息:" << infoLog << std::endl;
}
//片元着色器
fragment = glCreateShader(GL_FRAGMENT_SHADER);
glShaderSource(fragment, 1, &fShaderCode, NULL);
glCompileShader(fragment);
glGetShaderiv(fragment, GL_COMPILE_STATUS, &success);
if (!success)
{
glGetShaderInfoLog(fragment, 512, NULL, infoLog);
std::cout << "编译片元着色器失败,错误信息:" << infoLog << std::endl;
}
// //着色器程序
// ID = glad_glCreateProgram();
// glAttachShader(ID, vertex);
// glAttachShader(ID, fragment);
// glLinkProgram(ID);
// glGetProgramiv(ID, GL_LINK_STATUS, &success);
// if (!success)
// {
// glad_glGetProgramInfoLog(ID, 512, NULL, infoLog);
// std::cout << "编译片元着色器失败,错误信息:" << infoLog << std::endl;
// }
//链接着色器
ID = glCreateProgram();
glAttachShader(ID, vertex);
glAttachShader(ID, fragment);
glLinkProgram(ID);
glGetProgramiv(ID, GL_LINK_STATUS, &success);
if (!success)
{
glad_glGetProgramInfoLog(ID, 512, NULL, infoLog);
std::cout << "链接着色器失败,错误信息:" << infoLog << std::endl;
}
//删除着色器
glDeleteShader(vertex);
glDeleteShader(fragment);
}
//使用着色器
void Shader::use()
{
glUseProgram(ID);
}
//设置uniform变量
void Shader::setBool(const std::string& name, bool value) const
{
glUniform1i(glGetUniformLocation(ID, name.c_str()), (int)value);
}
void Shader::setInt(const std::string& name, int value) const
{
glUniform1i(glGetUniformLocation(ID, name.c_str()), value);
}
void Shader::setFloat(const std::string& name, float value) const
{
glUniform1f(glGetUniformLocation(ID, name.c_str()), value);
}
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。