欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

【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;

其中有关相对路径的问题,可以通过右键项目选择属性查看项目路径

【OpenGL】Shader个人学习笔记(2)

最终输出

【OpenGL】Shader个人学习笔记(2) 

现在,如果我们替换掉所有的生成语句

ShaderProgramSources source = ParseShader("res/shaders/Basic.shader");

unsigned int shader = CreateShader(source.VertexSource, source.FragmentSource);//这里有问题
glUseProgram(shader);//预测和显卡有关,

我这里有问题,仍然是白色的(包括上一级),可能是老师的显卡是intel的而我的是NVIDIA的(狗头),如果所有一切顺利,这里仍然是一个红色的三角形

【OpenGL】Shader个人学习笔记(2)

上一篇:

下一篇: