Atomic Counter

原创 2016年07月31日 15:53:20

Atomic Counter是一个缓存对象,存储着一个或者多个unsigned int的变量值。在GLSL着色器有着特定的原子操作(单一的,不可再分的操作)。

  1. atomicCounterIncrement 原子计数+1
  2. atomicCounterDecrement 原子计数-1

Atomic Counter可以用来控制片元的执行,避免对同一块内存区域同时操作。原子计数器表明当前片元在执行任务时,不能被其他任务打断,保证内存中数据修改的正确性。

简单示例,片元执行顺序的可视化。

初始化

    glGenBuffers(1, &m_AtomicBuffer);
    glBindBuffer(GL_ATOMIC_COUNTER_BUFFER, m_AtomicBuffer);
    glBufferData(GL_ATOMIC_COUNTER_BUFFER, sizeof(GLuint)*3, NULL, GL_DYNAMIC_DRAW);
    glBindBuffer(GL_ATOMIC_COUNTER_BUFFER, 0);

更新

每一帧重绘时,需要重置GL_ATOMIC_COUNTER_BUFFER的值,两种方式可以修改其值。

    glBindBuffer(GL_ATOMIC_COUNTER_BUFFER, m_AtomicBuffer);
    GLuint* pAtomicCounter = (GLuint*)glMapBufferRange(GL_ATOMIC_COUNTER_BUFFER, 0, sizeof(GLuint)*3, GL_MAP_WRITE_BIT | GL_MAP_INVALIDATE_BUFFER_BIT | GL_MAP_UNSYNCHRONIZED_BIT);
    _ASSERT(pAtomicCounter);
    memset(pAtomicCounter, 0, sizeof(GLuint)*3);
    glUnmapBuffer(GL_ATOMIC_COUNTER_BUFFER);

    //第二种方式,glSubBufferData
    //glBindBuffer(GL_ATOMIC_COUNTER_BUFFER, m_AtomicBuffer);
    //GLuint Value[3] = {0, 0, 0};
    //glBufferSubData(GL_ATOMIC_COUNTER_BUFFER, 0, sizeof(GLuint)*3, Value);
    //glBindBuffer(GL_ATOMIC_COUNTER_BUFFER, 0);

Fragment Shader

#version 450 core

layout (binding = 0, offset = 0) uniform atomic_uint aRed;
layout (binding = 0, offset = 4) uniform atomic_uint aGreen;
layout (binding = 0, offset = 8) uniform atomic_uint aBlue;

uniform float fNumPixels = 1.0/(1024*768);

out vec4 FragColor;

void main()
{
    float R = atomicCounterIncrement(aRed) * fNumPixels;
    float G = atomicCounterIncrement(aGreen) * fNumPixels;
    float B = atomicCounterIncrement(aBlue) * fNumPixels;

    FragColor = vec4(R, G, B, 1.0);
}

绑定到GL_ATOMIC_COUNTER_BUFFER 0号绑定点位置,glBindBufferBase(GL_ATOMIC_COUNTER_BUFFER, 0, m_AtomicBuffer);

通过建立一个GL_ATOMIC_COUNTER_BUFFER,里面储存3个uint变量值,随着源自计数器的增加,颜色输出逐渐变白的过程。

这里写图片描述

参考资料

【1】https://www.opengl.org/wiki/Atomic_Counter
【2】http://blog.csdn.net/csxiaoshui/article/details/33740065
【3】http://www.geeks3d.com/20120309/opengl-4-2-atomic-counter-demo-rendering-order-of-fragments/
【4】http://www.lighthouse3d.com/tutorials/opengl-atomic-counters/

OpenGL缓冲区对象之Atomic Counter Object

简介 Atomic Counter是OpenGL 4.2版本通过GL_ARB_shader_atomic_counters扩展引入的新特性,它可以在各种着色语言中使用。Atomic Coun...
  • csxiaoshui
  • csxiaoshui
  • 2014年06月23日 16:49
  • 2551

osg示例解析之osgatomiccounter(1)

简介 osgAtomicCounter主要向我们演示了怎么使用OpenGL
  • csxiaoshui
  • csxiaoshui
  • 2014年06月23日 17:28
  • 1322

OPenGL中的缓冲区对象

在许多OpenGL操作中,我们都向OpenGL发送一大块数据,例如向它传递需要处理的顶点数组数据。传输这种数据可能非常简单,例如把数据从系统的内存中复制到图形卡。但是,由于OpenGL是按照客户机-服...
  • MZYang272
  • MZYang272
  • 2012年06月12日 11:45
  • 23478

Atomic Counter

Atomic Counter是一个缓存对象,存储着一个或者多个unsigned int的变量值。在GLSL着色器有着特定的原子操作(单一的,不可再分的操作)。 atomicCounterIncreme...
  • freehyan
  • freehyan
  • 2016年07月31日 15:53
  • 317

OpenGL缓冲区对象之Atomic Counter Object

 简介 Atomic Counter是OpenGL 4.2版本通过GL_ARB_shader_atomic_counters扩展引入的新特性,它可以在各种着色语言中使用。Atomic ...
  • zxzzt119
  • zxzzt119
  • 2016年12月12日 17:40
  • 71

HLSL 、 GLSL 的 Atomic Counter 资源汇总

OpenGL 4.2 Atomic Counter Demo: Rendering Order of Fragments http://www.geeks3d.com/20120309/opengl...
  • icbm
  • icbm
  • 2016年10月24日 21:53
  • 210

C++11中<atomic>的使用

C++11中的使用
  • fengbingchun
  • fengbingchun
  • 2017年06月18日 19:13
  • 1173

Opengl学习笔记之ShaderStorageBufferObject和AtomicCounter

Shader Storage Buffer Object 也是一种缓冲区对象,用于存储与检索着色器语言的数据,简称SSBO,类似于UBO。存储SSBO的缓冲区对象绑定到SSBO bindin...
  • shixunzheng
  • shixunzheng
  • 2017年03月31日 21:54
  • 531

多线程之高级篇

线程局部变量(ThreadLocal) JDK 1.2的版本中就提供java.lang.ThreadLocal,ThreadLocal为解决多线程程序的并发问题提供了一种新的思路。使用这个工具类可以很...
  • u012152619
  • u012152619
  • 2015年06月16日 08:35
  • 4320

C++并发实战16: std::atomic原子操作

针对原子类型操作要不一步完成,要么不做,防止由于多线程串行化带来的错误。 1  std::atomic_flag是一个bool原子类型,其支持test_and_set和clear两个操作,atomic...
  • liuxuejiang158
  • liuxuejiang158
  • 2013年12月19日 15:50
  • 22787
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Atomic Counter
举报原因:
原因补充:

(最多只允许输入30个字)