Deal with Shaders in OpenGL
书接上文
CreateShader函数 take in 字符创指令生成shader
std::string vertexShader =
"#version 330 core\n"
"\n"
"layout(location = 0) in vec4 position;"// OpenGL的gl_Position是要求一个4维的vector
"\n"
"void mian()\n"
"{\n"
" gl_Position = position;\n"
"}\n";
std::string fragmentShader =
"#version 330 core\n"
"\n"
"layout(location = 0) out vec4 color;"// OpenGL的gl_Position是要求一个4维的vector
"\n"
"void mian()\n"
"{\n"
" color = vec4(1.0, 0.0, 0.0, 1.0);\n"
"}\n";
但是很麻烦,要换行还要注意引号
为了解决这个问题,新建一个.shader文件
#shader vertex
#version 330 core
layout(location = 0) in vec4 position;
void mian()
{
gl_Position = position;
};
#shader fragment
#version 330 core
layout(location = 0) out vec4 color;
void mian()
{
color = vec4(0.2, 0.3, 0.8, 1.0);
};
为了区分shader文件中的vertex shader和fragment shader,创建ParseShader函数
需要引用fstream和sstream头文件
line.find("#shader") != std::string::npos 可以理解为 找到了line中的“#shader”字段
static ShaderProgramSources ParseShader(const std::string& filepath)
{
std::ifstream stream(filepath);
enum class ShaderType
{
NONE = -1, VERTEX = 0, FRAGMENT = 1
};
std::string line;
std::stringstream ss[2];
ShaderType type = ShaderType::NONE;
while (getline(st