文章目录
LearnGL - 学习笔记目录
- 使用方式
- 直接加载源码字符串
- 直接加载源码文件路径
- 绝对路径方式
- 将 shader 文件放到 Dependencies/Shaders 文件夹下加载
- 相对路径方式
- 常量的方式
- 变量的方式
- 设置 uniform
- 方式1
- 方式2
- 区别
- 完整源码
- shader.h - ShaderProgram
- Main.cpp 调用 ShaderProgram
- 总结
- References
本人才疏学浅,如有什么错误,望不吝指出。
前面几篇,我们都用到多多少少的 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.vert
和 shader1.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
关注
打赏
最近更新
- 深拷贝和浅拷贝的区别(重点)
- 【Vue】走进Vue框架世界
- 【云服务器】项目部署—搭建网站—vue电商后台管理系统
- 【React介绍】 一文带你深入React
- 【React】React组件实例的三大属性之state,props,refs(你学废了吗)
- 【脚手架VueCLI】从零开始,创建一个VUE项目
- 【React】深入理解React组件生命周期----图文详解(含代码)
- 【React】DOM的Diffing算法是什么?以及DOM中key的作用----经典面试题
- 【React】1_使用React脚手架创建项目步骤--------详解(含项目结构说明)
- 【React】2_如何使用react脚手架写一个简单的页面?