RenderHelp 是可编程渲染管线实现,全中文注释,帮助初学者学习渲染原理。
随便找个 sample_
开头的例子文件直接 gcc 单文件编译即可:
gcc -O2 sample_07_specular.cpp -o sample_07_specular -lstdc++
在 Mac 下好像要加个 -std=c++17
,我应该没用啥 17 的东西,不过没环境不太确定。某些平台下可能要加一个 -lm
,显示声明一下链接数学库。
运行:
./sample_07_specular
然后得到一个图片文件 output.bmp
:
主要使用一个 ShaderContext 的结构体,用于 VS->PS 之间传参,里面都是一堆各种类型的 varying。
// 着色器上下文,由 VS 设置,再由渲染器按像素逐点插值后,供 PS 读取 struct ShaderContext { std::map<int, float> varying_float; // 浮点数 varying 列表 std::map<int, Vec2f> varying_vec2f; // 二维矢量 varying 列表 std::map<int, Vec3f> varying_vec3f; // 三维矢量 varying 列表 std::map<int, Vec4f> varying_vec4f; // 四维矢量 varying 列表 };
外层需要提供给渲染器 VS 的函数指针,并在渲染器的 DrawPrimitive
函数进行顶点初始化时对三角形的三个顶点依次调用:
// 顶点着色器:因为是 C++ 编写,无需传递 attribute,传个 0-2 的顶点序号 // 着色器函数直接在外层根据序号读取响应数据即可,最后需要返回一个坐标 pos // 各项 varying 设置到 output 里,由渲染器插值后传递给 PS typedef std::function<Vec4f(int index, ShaderContext &output)> VertexShader;
每次调用时,渲染器会依次将三个顶点的编号 0
, 1
, 2
通过 index
字段传递给 VS 程序,方便从外部读取顶点数据。
渲染器对三角形内每个需要填充的点调用像素着色器:
// 像素着色器:输入 ShaderContext,需要返回 Vec4f 类型的颜色 // 三角形内每个点的 input 具体值会根据前面三个顶点的 output 插值得到 typedef std::function<Vec4f(ShaderContext &input)> PixelShader;
像素着色程序返回的颜色会被绘制到 Frame Buffer 的对应位置。
调用下面接口可以绘制一个三角形:
bool RenderHelp::DrawPrimitive()
该函数是渲染器的核心,先依次调用 VS 初始化顶点,获得顶点坐标,然后进行齐次空间裁剪,归一化后得到三角形的屏幕坐标。
然后两层 for 循环迭代屏幕上三角形外接矩形的每个点,判断在三角形范围内以后就调用 VS 程序计算该点具体是什么颜色。
由于 Electron 使用 Chromium 显示网页,那么,Chromium 的多进程架构也被使用。Electron 中的每个网页都在自己的进程中运行,称为渲染器进程 (renderer process)。 在正常的浏览器中,网页通常运行在沙盒封装化的环境中,并且不允许访问本机资源。然而,Electron 用户有权在网页中使用 Node.js 的 API,从而允许较低级别的操作系统交互。 选自
在代码示例中,在 当react遇到路由组件(react路由器的一部分)的渲染道具时,它会传递什么道具? 鉴于https://reactjs.org/docs/render-props.html ,render prop是一个函数prop,组件使用它来知道要渲染什么,是传递给props的值,该props埋在react router中的Route声明中
渲染过程 1.最初的最初,我们要知道 ./build/webpack.base.conf.js 这个文件,是webpack打包的主要配置文件 其中 module.exports = { entry : { app: './src/main.js' // 这里就定义了vue的入口文件 } } 知道了这个打包文件,我们就可以知道接下来的事儿了。 2.找到index.html ,可
重新渲染日程表的所有日程: .fullCalendar( 'rerenderEvents' ) 官方英文文档:http://arshaw.com/fullcalendar/docs/event_rendering/rerenderEvents/
渲染一个新的日程到日程表上: .fullCalendar( 'renderEvent', event [, stick ] ) event 是 Event Object 对象,至少含有 title 和 start 属性。 通常,用 renderEvent 方法添加的日程会在日程表重载数据(refetches)之后消失。可以将stick设置为true 官方英文文档:http://arshaw.com
日程从DOM中移除之前触发: function( event, element, view ) { } event 是 Event Object 对象。 element 是要被移除的 jQuery 对象。 此函数可以用来移除 eventRender 注册的插件。 官方英文文档:http://arshaw.com/fullcalendar/docs/event_rendering/eventDest