棋盘格渲染

https://software.intel.com/zh-cn/articles/checkerboard-rendering-for-real-time-upscaling-on-intel-integrated-graphics 

关于棋盘格渲染,以上这篇英特尔文章讲的挺清楚的,我这里只是简单capture一些重点。

 

下图为普通的全分辨率渲染,可以看到,第一张图为需要光栅化到渲染目标的三角形,第二张图的红色点表示采样点位置,第三张图为渲染结果。这种方式每一个像素点都需要采样,比较慢。

 

但是如果压缩采样点,如下图这样,那么,得到的结果跟实际差别就有点大了,黄色三角形完全被miss掉了

所以采用2x MSAA来重建,需要前后两帧的信息来重建,N-1帧的采样点如下图红点所示,N帧的采样点是图中的蓝点。第一列不重建(因为视点变化?为什么?)。

那么按这种方式重建出来的就是下面这样的,N-1帧重建出来是第一行第三张图,N帧重建出来是第二行第三张图,那么结合之后,就是第三行的图了。这个渲染结果基本和普通的全分辨率的渲染是一样的。

 当然在实际运用过程中,还是会有一些问题,比如说在物体有运动的情况下,在物体有遮挡的情况下,都需要加入motion vector和深度信息进行进一步的处理。这种情况下就不能用前后帧去差值了,得用当帧的周围像素去填充。

 

转载于:https://www.cnblogs.com/sunny-li/p/11297244.html

使用VTK库可以很方便地创建3D图形,以下是创建100*100棋盘的示例代码: ```cpp #include <vtkSmartPointer.h> #include <vtkPolyDataMapper.h> #include <vtkActor.h> #include <vtkRenderWindow.h> #include <vtkRenderer.h> #include <vtkRenderWindowInteractor.h> #include <vtkProperty.h> #include <vtkPoints.h> #include <vtkCellArray.h> #include <vtkPolyData.h> int main() { // 创建点坐标 vtkSmartPointer<vtkPoints> points = vtkSmartPointer<vtkPoints>::New(); for (int i = 0; i < 100; i++) { for (int j = 0; j < 100; j++) { points->InsertNextPoint(i, j, 0); } } // 创建单元 vtkSmartPointer<vtkCellArray> cells = vtkSmartPointer<vtkCellArray>::New(); for (int i = 0; i < 99; i++) { for (int j = 0; j < 99; j++) { vtkIdType pts[4] = {i * 100 + j, (i + 1) * 100 + j, (i + 1) * 100 + j + 1, i * 100 + j + 1}; cells->InsertNextCell(4, pts); } } // 创建多边形数据 vtkSmartPointer<vtkPolyData> polyData = vtkSmartPointer<vtkPolyData>::New(); polyData->SetPoints(points); polyData->SetPolys(cells); // 创建映射器和演员 vtkSmartPointer<vtkPolyDataMapper> mapper = vtkSmartPointer<vtkPolyDataMapper>::New(); mapper->SetInputData(polyData); vtkSmartPointer<vtkActor> actor = vtkSmartPointer<vtkActor>::New(); actor->SetMapper(mapper); actor->GetProperty()->SetColor(0.8, 0.8, 0.8); // 渲染器和窗口 vtkSmartPointer<vtkRenderer> renderer = vtkSmartPointer<vtkRenderer>::New(); renderer->AddActor(actor); vtkSmartPointer<vtkRenderWindow> renderWindow = vtkSmartPointer<vtkRenderWindow>::New(); renderWindow->AddRenderer(renderer); // 窗口交互器 vtkSmartPointer<vtkRenderWindowInteractor> interactor = vtkSmartPointer<vtkRenderWindowInteractor>::New(); interactor->SetRenderWindow(renderWindow); // 渲染并开始交互 renderWindow->Render(); interactor->Start(); return 0; } ``` 这段代码会创建一个100*100的棋盘,并在窗口中显示。你可以根据自己的需求修改代码,并添加适当的交互功能。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值