当前位置: 首页 > news >正文

有关师德建设的网站linux服务器安装网站

有关师德建设的网站,linux服务器安装网站,网站与网站做外链好吗,旅游网站建设论文前言 本篇在讲什么 本篇为蓝宝书学习笔记 原子计数器 本篇适合什么 适合初学Open的小白 本篇需要什么 对C语法有简单认知 对OpenGL有简单认知 最好是有OpenGL超级宝典蓝宝书 依赖Visual Studio编辑器 本篇的特色 具有全流程的图文教学 重实践,轻理论&#…
前言
本篇在讲什么

本篇为蓝宝书学习笔记
原子计数器

本篇适合什么

适合初学Open的小白
本篇需要什么

C++语法有简单认知
OpenGL有简单认知
最好是有OpenGL超级宝典蓝宝书
依赖Visual Studio编辑器
本篇的特色

具有全流程的图文教学
重实践,轻理论,快速上手
提供全流程的源码内容


★提高阅读体验★

👉 ♠ 一级标题 👈

👉 ♥ 二级标题 👈

👉 ♣ 三级标题 👈

👉 ♦ 四级标题 👈


目录

  • ♠ 原子计数器
  • ♠ 用法
    • ♥ 声明
    • ♥ 绑定
    • ♥ 重置
    • ♥ 计数
  • ♠ 案例
  • ♠ 推送
  • ♠ 结语


♠ 原子计数器

  • 什么是原子计数器

原子计数器是一种特殊的变量,表示的是多个着色器之间共享的存储,这个存储和一个缓冲对象关联,而且我们可以调用特定的函数进行原子内存操作

  • 原子计数器的作用

变量本身的功能是用于计数


♠ 用法

♥ 声明

layout (binding=3,offset=8) uniform atomic_uint my_variable;

声明了原子计数器my_variable,并绑定在3上,其中起始位置是8


♥ 绑定

GLuint buf;
glGenBuffers(1, &buf); 
glBindBuffer(GL_ATOMIC_COUNTER_BUFFER, buf); 
glBufferData(GL_ATOMIC_COUNTER_BUFFER, 16 * sizeof(GLuint), NULL, GL_DYNAMIC_COPY);
glBindBufferBase(GL_ATOMIC_COUNTER_BUFFER, 3, buf);

uniformbuffer相同,可以使用相同的方式将缓存对象绑定至绑定点上,特定参数GL_ATOMIC_COUNTER_BUFFER


♥ 重置

在使用前我们要重置计数器变量,书中提供了三种方式重设变量

  • glBufferSubData
const GLuint zero = 0; 
glBufferSubData(GL_ATOMIC_COUNTER_BUFFER, 2 * sizeof(GLuint), sizeof(GLuint), &zero);

通过glBufferSubData更新指定位置的数据

  • glMapBufferRange
GLuint * data = (GLuint *)glMapBufferRange(GL ATOMIC COUNTER BUFFER, 0, 16 * sizeof(GLuint), GL_MAP_WRITE_BIT | GL_MAP_INVALIDATE_RANGE_BIT);
data[2] = 0;
glUnmapBuffer(GL_ATOMIC_COUNTER_BUFFER);

通过glMapBufferRange获取变量地址后直接赋值

  • glClearBufferSubData
glClearBufferSubData(GL_ATOMIC_COUNTER_BUFFER, GL_R32UI, 2 * sizeof(GLuint), sizeof(GLuint), GL_RED_INTEGER, GL_UNSIGNED_INT, &zero);

通过glClearBufferSubData赋值


♥ 计数

OpenGL提供了三种用于计数的着色器函数

  • 加一
uint atomicCounterIncrement(atomic_uint a);
  • 减一
uint atomicCounterDecrement(atomic_uint a);
  • 获取值
uint atomicCounter(atomic_uint a);

♠ 案例

我们来看一个完整的演示示例吧,改例子将一个计数器绑定到缓存后并清零,通过计数器的数量来判断颜色的显示

注:该例子直接修改OpenGl超级宝典官方示例singletri.cpp,只需修改startup方法即可

virtual void startup()
{static const char * vs_source[] ={"#version 450 core                                                 \n""                                                                  \n"" 																   \n""void main(void)                                                   \n""{                                                                 \n""    const vec4 vertices[] = vec4[](vec4( 0.25, -0.25, 0.5, 1.0),  \n""                                   vec4(-0.25, -0.25, 0.5, 1.0),  \n""                                   vec4( 0.25,  0.25, 0.5, 1.0)); \n""                                                                  \n""    gl_Position = vertices[gl_VertexID];                          \n""}                                                                 \n"};static const char * fs_source[] ={"#version 450 core												   \n""																   \n""																   \n""layout (binding=0) uniform atomic_uint my_variable;	           \n""																   \n""out vec4 color;												   \n""																   \n""void main(void)                                                   \n""{																   \n""    uint counter = atomicCounterIncrement(my_variable);		   \n""	 if(counter>20000){										       \n""		 color = vec4(1.0, 0.8, 1.0, 1.0);						   \n""	 }else{														   \n""		 color = vec4(0.0, 0.8, 1.0, 1.0);						   \n""    }															   \n"																		"}											                       \n"};program = glCreateProgram();GLuint fs = glCreateShader(GL_FRAGMENT_SHADER);glShaderSource(fs, 1, fs_source, NULL);glCompileShader(fs);GLuint vs = glCreateShader(GL_VERTEX_SHADER);glShaderSource(vs, 1, vs_source, NULL);glCompileShader(vs);glAttachShader(program, vs);glAttachShader(program, fs);glLinkProgram(program);glGenVertexArrays(1, &vao);glBindVertexArray(vao);// 绑定缓存GLuint buf;glGenBuffers(1, &buf);glBindBuffer(GL_ATOMIC_COUNTER_BUFFER, buf);glBufferData(GL_ATOMIC_COUNTER_BUFFER, 16 * sizeof(GLuint), NULL, GL_DYNAMIC_COPY);glBindBufferBase(GL_ATOMIC_COUNTER_BUFFER, 0, buf);// 清零计数器const GLuint zero = 0;glBufferSubData(GL_ATOMIC_COUNTER_BUFFER, 2 * sizeof(GLuint), sizeof(GLuint), &zero);
}

counter>20000下显示效果如下

在这里插入图片描述

counter<20000下显示效果如下

在这里插入图片描述


♠ 推送

  • Github
https://github.com/KingSun5

♠ 结语

若是觉得博主的文章写的不错,不妨关注一下博主,点赞一下博文,另博主能力有限,若文中有出现什么错误的地方,欢迎各位评论指摘。

👉 本文属于原创文章,转载请评论留言,并在转载文章头部著名作者出处👈
http://www.yayakq.cn/news/141989/

相关文章:

  • 网站建设的一些知识初级网络推广培训
  • 企业自适应网站制作杭州互联网公司50强
  • dede自动生成网站地图企业查询卡
  • vps新建的网站打不开网站做优化有什么好处
  • 做羞羞的事视频网站网站推广关键词工具
  • 网站权重与排名浅谈网站备案加链接代码
  • 网站安全建设总结蒙icp备 网站建设
  • wordpress 网站地图插件wordpress配置cdn缓存规则
  • 厦门建网站品牌网站后期维护是做什么
  • 免费做二维码网站广州网站开发怎么做
  • 凯里专注网站建设报价网站建设视频百度网盘下载
  • 网站建设首选玖艺建站信得过安徽专业建网站
  • 做app模板网站有哪些内容新品发布会流程策划方案
  • 学校网站建设总结仿站工具哪个好最好
  • 济宁网站网站平台建设费计入什么科目
  • 全国集团网站建设怎么用ps做网站首页图片尺寸
  • 如何通过网站获取qq拉新推广怎么快速拉人
  • 运城市做网站价格油漆涂料网站建设
  • 深圳做网站费用黑马教育培训官网
  • 网址导航源码网站首页优化模板
  • 做导航网站有发展吗公司网站栏目
  • 长沙营销型网站制美橙网站备案照片背景
  • 网站开发课表查询网站团队介绍
  • 网页设计需要学什么编程大连做优化网站哪家好
  • 做网站销售这几天你有什么想法英文网站模板源代码
  • 网站友情链接有什么用做外贸电商网站
  • 百度网站推广如何购买网站虚拟主机
  • 用什么做响应式网站茂名建设公司网站
  • 一站式网站建设哪家专业网站建设制作的标准有哪些
  • 做软装什么网站可以二手交易网站建设