您当前的位置: 首页 >  ar

Jave.Lin

暂无认证

  • 2浏览

    0关注

    704博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

LearnGL - 04.2 - 封装 ShaderProgram 类

Jave.Lin 发布时间:2020-06-12 23:48:05 ,浏览量:2

文章目录
  • 使用方式
    • 直接加载源码字符串
    • 直接加载源码文件路径
      • 绝对路径方式
        • 将 shader 文件放到 Dependencies/Shaders 文件夹下加载
      • 相对路径方式
        • 常量的方式
        • 变量的方式
    • 设置 uniform
      • 方式1
      • 方式2
      • 区别
  • 完整源码
    • shader.h - ShaderProgram
    • Main.cpp 调用 ShaderProgram
  • 总结
  • References
LearnGL - 学习笔记目录

本人才疏学浅,如有什么错误,望不吝指出。

前面几篇,我们都用到多多少少的 shader。

其中 shader 代码中的编译、检测编译错误、附加着色器、链接程序、链接错误检测、等,可重用新比较高,所以封装起来会减少后续的劳动力。

先在之前的文章有介绍的:Dependencies/Include 文件夹下添加:shader.h 文件。 在这里插入图片描述

下面是将之前说的,将 shader 的 编译、检测编译错误、附加着色器、链接程序、链接错误检测、等 都需要封装的处理:

现在着色器使用的API在外部来说就相对更简单一些了

使用方式 直接加载源码字符串
...
static const char* vertex_shader_text = R"glsl(
#version 450 compatibility
uniform mat4 transformMat;
attribute vec3 vPos;
attribute vec3 vCol;
varying vec3 fCol;
void main() {
	gl_Position = transformMat * vec4(vPos, 1.0);
	fCol = vCol;
}
)glsl";

static const char* fragment_shader_text = R"glsl(
#version 450 compatibility
varying vec3 fCol;
void main() {
	gl_FragColor = vec4(fCol, 1.0);
}
)glsl";

...

GLint mat_location, vpos_location, vcol_location;
ShaderProgram* shaderProgram = new ShaderProgram;
//shader program init 1 - 直接加载shader源码方式
if (!shaderProgram->initBySourceCode(vertex_shader_text, fragment_shader_text)) {
	std::cout setMatrix4x4(mat_location, (const GLfloat*)tMat); // 设置, 着色器中 uniform mat4 rMat; 的矩阵数据
	glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_INT, (GLvoid*)0); // 参数1:绘制三角图元;参数2:取6个索引来绘制三角图元(每个三角图元需要3个,所以可以画两个三角图元);参数3:将 GL_ELEMENT_ARRAY_BUFFER 每个元素视为 uint 类型;参数4:设置索引缓存的字节偏移量。也可以设置为另一个 缓存数据的指针,即:使用另一个数据。

	glBindVertexArray(vertex_array_object[1]);				// 先绘制 VAO[1] 的 VBO,EBO,VAF,ENABLED
	mat4x4_identity(rMat);									// 给矩阵单位化,消除之前的所有变换
	mat4x4_rotate_Z(rMat, rMat, (float)glfwGetTime());		// 先旋转,沿着 z 轴旋转,旋转量为当前 glfw 启用到现在的时间点(秒)
	mat4x4_translate(tMat, +0.5, 0.0f, 0.0f);				// 再位移
	mat4x4_mul(tranformMat, tMat, rMat);					// 将旋转与位移的变换合并
	//glUniformMatrix4fv(mat_location, 1, GL_FALSE, (const GLfloat*)tranformMat); // 设置, 着色器中 uniform mat4 rMat; 的矩阵数据
	shaderProgram->setMatrix4x4(mat_location, (const GLfloat*)tranformMat); // 设置, 着色器中 uniform mat4 rMat; 的矩阵数据
	glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_INT, (GLvoid*)0); // 参数1:绘制三角图元;参数2:取6个索引来绘制三角图元(每个三角图元需要3个,所以可以画两个三角图元);参数3:将 GL_ELEMENT_ARRAY_BUFFER 每个元素视为 uint 类型;参数4:设置索引缓存的字节偏移量。也可以设置为另一个 缓存数据的指针,即:使用另一个数据。

	glfwSwapBuffers(window);								// swap buffer, from backbuffer to front buffer
	glfwPollEvents();										// 处理其他的系统消息
}

直接加载源码文件路径

将上面 vertex_shader_text,与 fragment_shader_tesxt,分别保存与:shader1.vertshader1.frag 两个文件。

绝对路径方式
GLint mat_location, vpos_location, vcol_location;
ShaderProgram* shaderProgram = new ShaderProgram;
// shader program init 2 - 加载shader源码路径方式,我真的是服了C++获取当前运行目录就这么难吗?
char exeFullPath[512];
char vs_path[512], fs_path[512];
GetCurrentDirectoryA(1000, exeFullPath);
sprintf_s(vs_path, "%s\\Debug\\%s", exeFullPath, "shader1.vert");
sprintf_s(fs_path, "%s\\Debug\\%s", exeFullPath, "shader1.frag");
if (!shaderProgram->initByPath(vs_path, fs_path)) {
	std::cout             
关注
打赏
1664331872
查看更多评论
0.0828s