- 博客(6)
- 收藏
- 关注
原创 OpenGL的原子计数器
如果想要在每个原子计数器的原子操作执行后立马将数据写到缓存中,使得程序不会因为着色器的接口调用顺序不确定导致的hazard,那么我们需要用到较前面提到的内存栅栏,在c++源码中我们可以调用glMemoryBarrier再传入参数GL_ATOMIC_COUNTER_BARRIER_BIT即可达到对原子计数器进行同步,也就是每次执行多个原子计数器操作前都会等每个原子计数器操作写入数据到缓存才会执行下一个原子计数器的操作。2、由缓存对象支持,且GLSL中有内置原子函数来加减其内的数值。
2024-06-15 14:17:14
459
2
原创 OpenGL的原子内存操作
比如一个着色器A的调用想对显卡上的一块内存上的值+1再写回到内存上,但是由于另一个着色器B在着色器A获取数据后也去同一块内存中获取数据,然后+1写回内存,这就有个问题,两次调用执行,同一块内存中的结果却只有一次调用的效果,这可能违背了这个程序原本的意愿。这其实就是一种同步手段。8、atomicCompSwap(内存索引,要与内存索引指向的内存上的值比较的值,如果比较值和内存上的值相等,要写入内存的值)5、atomicMin(内存索引,要与内存索引指向的内存上的值比较大小的值,将较小的值写回内存上)
2024-06-12 23:19:42
259
原创 着色器存储块(shader storage bloc)
着色器存储块为啥有这么多的优点,理论上是可以完全替代Uniform block和顶点属性吧,但实际上着色器存储块因为其灵活性导致它不能(很难)被一些OpenGL实现优化其读取效率,比如,当其内的数据是常量时,OpenGL实现很难优化其读取速度,而uniform block却可以被一些OpenGL实现优化其常量数据的读取效率;1、用的限定符不同,uniform block用的是uniform,而着色器存储块用的是buffer限定符,且有更高的最大内存上限。2、着色器可以写入数据到着色器存储块中。
2024-05-18 11:12:12
332
原创 Qt和OpenGL的uniform变量实践
接着生成的图元数据就会被OpenGL自动进行图元装配,比如给所有点进行分组,接着OpenGL继续自动做裁剪处理,去掉视口外的顶点数据,然后再自动进行光栅化将顶点数据转换为像素点(也就是片元化),再到片段着色器中对每个片元的颜色进行处理,片段着色器处理后OpenGL会进行逐片元操作,根据深度测试或模板测试决定一个片元是否可见,最终在屏幕上显示出最终的片元结果。接着,由于OpenGL本质上只是一种规范,我们创建了OpenGL窗口,还需要调用各种OpenGL真正的底层GPU的API才能将我们的数据渲染出来。
2024-05-13 21:30:27
920
原创 C++与OpenGL 共享布局继续随记
1、先获取编译器给uniform block变量分配的索引,将这个索引值和自己指定的一个绑定点用glGetUniformBlockIndex函数进行绑定,再将缓存对象和指定的绑定点绑定,接着,程序运行时,OpenGL就会自动将绑定点上的对应缓存对象中的数据传递到uniform block变量中。
2024-05-11 23:33:33
709
原创 C++ With OpenGL学习随记-uniform block
共享布局是就是由OpenGL自己安排uniform block的位置值,c++程序需要去明确uniform block的各个成员位置值才能从着色器中读取数据,并且需要向OpenGL指定数据的存储位置,让OpenGL去读取数据并且布置数据到uniform block中,共享布局还可以让各个着色器程序共享同个uniform block。使用共享布局的好处是高性能,但是使用起来较为复杂。使用标准布局好处就是易实现,c++程序不需要做较多的工作就可以刷数据到着色器缓存中,但是会损失一些性能。
2024-04-26 10:59:32
210
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人