首页 > 其他分享 >OpenGL体素化&什么是SSBO?

OpenGL体素化&什么是SSBO?

时间:2023-02-28 14:36:22浏览次数:49  
标签:OpenGL BUFFER STORAGE SHADER int GL 体素化 SSBO

[1]The Basics of GPU Voxelization:https%3A//developer.nvidia.com/content/basics-gpu-voxelization

[2]体素化Voxelization:基于GPU的三维体素化:https%3A//yangwc.com/2019/06/11/Voxelization/

[3]Global Illumination_Voxel Global Illumintaion (VXGI)(体素全局渲染):https%3A//blog.csdn.net/qq_35312463/article/details/121754345

最近研究到全局光照,我决定使用NVIDIA的VXGI方案,VXGI是一个3 Pass的算法,第二个Pass便是将场景体素化,于是我只好做一下模型体素化。考虑到这个体素化需要做到实时计算,我决定借助GPU进行体素化。于是我开始从网上寻找资料,经过辗转找到了NVIDIA的这篇文章[1],通过这篇文章的前半部分我对模型体素化有了大致的思路。但是按照原文的说法,借助光栅化会有一些孔洞,于是我具体实现的方案是参考了这篇文章[2]。

为了体素化场景,得先构建一个场景。

然后开始正式体素化。我认为体素化有两种,一种是仅仅体素化,另一种还需要记录每一个体素的颜色信息。为了方便说明,我们将讲解前者,但是两者的实现没有本质区别,仅仅是储存体素的数据结构可能不太一样:前者我倾向于使用SSBO,后者还是3D纹理更加合适。在开始之前还有最后一件事情,就是确定体素化的分辨率,这个分辨率决定了体素的精度。我采用50x50x50的分辨率,这对于我的场景来说足够了。

开始体素化。首先在CPU端创建一个SSBO缓存对象,并且将它的所有元素初始化为0:

unsigned int length = 50 * 50 * 50;
unsigned int vx_info;
glGenBuffers(1, &vx_info);//先生成一个缓存对象
glBindBuffer(GL_SHADER_STORAGE_BUFFER, vx_info);//将SSBO绑定到缓存对象
glBufferData(GL_SHADER_STORAGE_BUFFER, length * sizeof(int), NULL, GL_STATIC_DRAW);//缓存数据初始化
glBindBufferBase(GL_SHADER_STORAGE_BUFFER, 0, m_cntBuffer);
void* VoidPtr = glMapBuffer(GL_SHADER_STORAGE_BUFFER, GL_WRITE_ONLY);
int* MapPtr = reinterpret_cast<int*>(VoidPtr);
for (int i = 0; i < length; i++) MapPtr[i] = 0;
glUnmapBuffer(GL_SHADER_STORAGE_BUFFER);

参考:https://zhuanlan.zhihu.com/p/593618561?utm_id=0

 

标签:OpenGL,BUFFER,STORAGE,SHADER,int,GL,体素化,SSBO
From: https://www.cnblogs.com/2008nmj/p/17164124.html

相关文章

  • WebGL和OpenGL的区别及关系
    什么是WebGLWebGL™是一个跨平台的,免版税的开放Web标准,用于基于OpenGLES的低级3D图形API,通过HTML5Canvas元素向ECMAScript公开。熟悉OpenGLES2.0的开发人员将使用GLSL......
  • OpenGL-GLES 1.x
    首先了解下着色器:着色器是一段包含着色信息的源代码字符串,分为顶点着色器和片元着色器,两个着色器分别写在不同的文件中。着色器代码和OpenGL代码不是一起编译的,OpenGL代码......
  • OpenGL ES 2.0编程指导阅读笔记(七)图元装配和光栅化
    图元装配阶段在顶点着色之后,在图元装配阶段执行裁剪、透视变换和视窗变换。光栅化是将图元转换成一系列两位片元的过程。图元OpenGLES2.0中可以绘制的图元有三角形、......
  • 【OpenGL+Qt 学习】 你好,三角形
    参考LearnOpenGLCN(learnopengl-cn.github.io)1-2VAO与VBO_哔哩哔哩_bilibili定义OpenGL窗口类#ifndefMYGLWIDGET_H#defineMYGLWIDGET_H#include<QOpenGLW......
  • [WPF] 使用Silk.NET绘制D3D9或OpenGL内容并完美解决空域问题。
    可扩展渲染控件实现的基本思路(D3D、OpenGL绘制所使用的基类):   首先创建一个抽象类FramebufferBase,该类主要记录当前控件宽高和图像资源。publicabstractclas......
  • OpenGL 鼠标位置转换世界坐标系 射线实现方法
    [-1-- 1]mousex [1---1]mousey裁剪坐标系全是1-1 直接就z=1 x=2*mousex/winWidth-1; y=1-2*mousey/winHeightvec4posNDS(x,y,z,1.0......
  • OpenGL绘制球
    有俩角度a是球面点与z轴正方向夹角另一个是b是连线在xy这个面的投影与x正轴夹角 R作为球半径每个点的xyzz很好看出来就是R*cosa     R*sina得到在xy平面......
  • OpenGL API学习记录 glBlitFramebuffer
    glBlitFramebuffer将FBO中指定的东西copy到指定地方去配合bind函数使用下面例子拷贝的颜色缓存在延迟渲染时可以拷贝GL_DEPTH_BUFFER_BIT来结合正向渲染和延迟渲染glBin......
  • OpenGL API学习记录glBufferData glBuferSubData glBindBufferRange
    glBufferDataglBufferSubDataglBindBufferRange第一个参数为targetbuffer第二个这个是把buffer的内容进行修改第三个有点像malloc但这个是UBO学到的先设定好第二个参数ind......
  • OpenGL API学习记录glMapBuffer
    除了glBufferSubData还有MapBuffer这种方式来修改数据floatdata[]={0.5f,1.0f,-0.35f...};glBindBuffer(GL_ARRAY_BUFFER,buffer);//获取指针void*ptr=glMapB......