黄冠瑞

来自CGTWiki
跳转至:导航搜索

简历

个人照片.jpg

生于1996年6月5日,广西来宾人

本科 2015级 北京邮电大学 通信工程
硕士 2019级 北京邮电大学 电子与通信工程

电话:18801423117
邮箱:912655391@qq.com

四六级成绩

四级:543
六级:559

电脑配置

电脑型号	X64 兼容 台式电脑  (扫描时间:2020年01月02日)
操作系统	Windows 10 专业版 64位 ( DirectX 12 )
处理器	        英特尔 Core i7-8700K @ 3.70GHz 六核
主板	        华硕 PRIME Z370-A ( Z370 芯片组 )
内存	        16 GB ( 金士顿 DDR4 3000MHz )
主硬盘	        三星 SSD 860 PRO 256GB ( 256 GB / 固态硬盘 )
显卡	        Nvidia GeForce GTX 1070 ( 8 GB / 影驰 )
显示器	        三星 SAM0C1A S24E390 ( 23.5 英寸  )
光驱	        Msft Virtual DVD-ROM DVD光驱
声卡	        瑞昱  @ 英特尔 High Definition Audio 控制器
网卡	        英特尔 Ethernet Connection  I219-V / 华硕


周报

1.阅读MDIBR论文中3D Warping和空洞填补的部分。
2.进行渲染参考帧深度纹理的工作,又出现了纹理全黑的问题。经过排查,发现是在设置深度纹理的内部格式时,错误地将深度纹理的格式设置成GL_RGBA,将格式改为GL_DEPTH_COMPONENT后修复该问题。(具体代码和报错信息已写入Wiki个人学习笔记中)

下一周计划

1. 目前可以顺利渲染出彩色纹理以及深度纹理,正在进行修改参考帧相机视图矩阵和投影矩阵的工作。

学习笔记

计算着色器
计算着色器介绍链接1
计算着色器介绍链接2

纹理的内部格式(InternalFormat)和外部格式(Format)
个人理解:
外部格式则只是指定了纹理的通道数,例如GL_RGBA,表示每个纹素有4个通道,分别为红绿蓝透明,并不指明每个通道的具体数据类型。
内部格式具体地描述了纹理数据的内存布局,一般的内部格式都可以写为GL_RGBAXXXX,XXXX用于描述数据类型,例如GL_RGBA16F表示纹理的各个通道分量为红,绿,蓝,透明度,每个分量分别由16位的float表示。
在使用时,内部格式需要和外部格式一一对应,否则会出现奇怪的错误。

MDIBR流程图

Rtt.png
新视点生成.png
空洞填补.png


帧缓冲
帧缓冲(framebuffer)是OpenGL渲染管线最终存储渲染结果的地方,它存储一系列的2D序列。用户可以创建自己的帧缓冲对象来存储颜色、深度、模板信息。
创建一个完整的帧缓冲,需要满足以下条件:
- 至少包含一个附件(颜色、深度、或模板);
- 其中至少有一个颜色附件;
- 附件要在附着之前创建好,并存储在内存中;
- 每个缓冲应该有同样的样本数。

osg设置渲染到纹理的注意事项

tex->setInternalFormat(GL_RGBA);
texD->setInternalFormat(GL_DEPTH_COMPONENT);
cam->attach(osg::Camera::BufferComponent(osg::Camera::COLOR_BUFFER0), tex);
cam->attach(osg::Camera::BufferComponent(osg::Camera::DEPTH_BUFFER), texD);

上述代码中,颜色附着对应的纹理内部格式应该设置为GL_RGBA。
深度附着对应的纹理内部格式应该设置为GL_DEPTH_COMPONENT,若纹理内部格式设置出错,控制台会出现如下所示的提示:

RenderStage::runCameraSetUp(), FBO setup failed, FBO status= 0x8cd6
Warning: RenderStage::runCameraSetUp(State&) Pbuffer does not support multiple color outputs.
ContextData::incrementContextIDUsageCount(0) to 2

并且所有的渲染到对应帧缓冲的所有纹理都会失效,变成全黑的状态,如下图所示,下图中左下角第一个视口应该渲染出颜色纹理,第二个视口应该渲染出深度纹理,但是如果纹理内部格式设置出错,则会导致两个纹理都看不到。

深度缓冲区读取错误.jpg


创建HUD相机

osg::ref_ptr<osg::Camera> camera1 = new osg::Camera;
camera1->setViewMatrix(osg::Matrix::identity());
camera1->setAllowEventFocus(false);
camera1->setReferenceFrame(osg::Transform::ABSOLUTE_RF);

//设置视口
camera1->setViewport(0, 0, 800, 600);
//设置投影方式为正交投影
camera1->setProjectionMatrixAsOrtho2D(0, 800, 0, 600);
camera1->setClearMask(GL_DEPTH_BUFFER_BIT);

//设置渲染顺序为最后渲染
camera1->setRenderOrder(osg::Camera::POST_RENDER);

OSG渲染到纹理

osg::Camera* cam = new osg::Camera;
cam->setClearColor(osg::Vec4(0.0f, 0.0f, 0.0f, 1.0f));
cam->setClearMask(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

//设置相机渲染目标
cam->setRenderTargetImplementation(osg::Camera::FRAME_BUFFER_OBJECT);
//设置渲染顺序为最先渲染
cam->setRenderOrder(osg::Camera::PRE_RENDER);
osg::Texture2D* tex = new osg::Texture2D;
tex->setTextureSize(1920, 1080);
tex->setInternalFormat(GL_RGBA);
tex->setFilter(osg::Texture2D::MIN_FILTER, osg::Texture2D::LINEAR);
tex->setFilter(osg::Texture2D::MAG_FILTER, osg::Texture2D::LINEAR);
//将相机视口大小设置成与纹理大小一致
cam->setViewport(0, 0, tex->getTextureWidth(), tex->getTextureHeight());

//将纹理附加到相机的渲染对象上
cam->attach(osg::Camera::BufferComponent(osg::Camera::COLOR_BUFFER0), tex);

学习计划

1.阅读c++技术书籍.
2.学习海洋仿真相关技术,并尝试自己实现.

2019总结

编写三维平台图层加载、模型加载代码:
图层加载:

图层加载

模型加载:

添加模型

编写模型平移缩放旋转代码:

模型变换