【OpenGL】Shader个人学习笔记(2)
程序员文章站
2023-12-25 17:44:03
...
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(stream, line))
{
if (line.find("#shader") != std::string::npos)
{
if (line.find("vertex") != std::string::npos)
type = ShaderType::VERTEX;
else if (line.find("fragment") != std::string::npos)
type = ShaderType::FRAGMENT;
}
else
{
ss[(int)type] << line << '\n';
}
}
return { ss[0].str(), ss[1].str() };
}
在C++中返回多个值,可以先声明一个结构体,然后让返回值为这个结构体
struct ShaderProgramSources
{
std::string VertexSource;
std::string FragmentSource;
};
有了以上准备,将上一笔记中利用string创造shader的语句替换为如下:
ShaderProgramSources source = ParseShader("res/shaders/Basic.shader");
std::cout << "Vertex********" << std::endl;
std::cout << source.VertexSource << std::endl;
std::cout << "Fragment*******" << std::endl;
std::cout << source.FragmentSource << std::endl;
其中有关相对路径的问题,可以通过右键项目选择属性查看项目路径
最终输出
现在,如果我们替换掉所有的生成语句
ShaderProgramSources source = ParseShader("res/shaders/Basic.shader");
unsigned int shader = CreateShader(source.VertexSource, source.FragmentSource);//这里有问题
glUseProgram(shader);//预测和显卡有关,
我这里有问题,仍然是白色的(包括上一级),可能是老师的显卡是intel的而我的是NVIDIA的(狗头),如果所有一切顺利,这里仍然是一个红色的三角形