计算着色器

原创 2016年08月31日 05:05:54
struct col{
uint x;
uint y;
uint z;
uint w;
};


layout ( binding = 0 ) buffer bmp{
uvec4 color[];
};


layout(local_size_x = 1) in;


void main(void)
{

uint ID = gl_WorkGroupID.y * gl_NumWorkGroups.x + gl_WorkGroupID.x;

//color[ID] = col(ID * 3,ID * 3 + 1,ID * 3 + 2);


//color[ID] = col(ID * 4,ID * 4 + 1,ID * 4 + 2,ID * 4 + 3);


color[ID] = uvec4(gl_WorkGroupID.x, gl_WorkGroupID.y, gl_NumWorkGroups.x, ID);

}


以上计算着色器当color类型为uvec3或者自定义类型col时,无法正确执行,有没有谁知道怎么回事?谢谢!


对应以下C++代码:

#define EC (4)
const unsigned char * bc = (const unsigned char *)bmp;
ShaderStorageBufferObject ssbo( bmp.W() * bmp.H() * EC * sizeof(int), 0, Buffer::USAGE::DYNAMIC_DRAW);
ssbo.Bind(Buffer::BIND_TARGET::COPY_READ_BUFFER);
unsigned int (*bia)[4288][2848][EC] = (unsigned int (*)[4288][2848][EC])ssbo.MapBuffer(Buffer::BIND_TARGET::COPY_READ_BUFFER,Buffer::MAP_FLAG::READ_WRITE);
unsigned int *bi = (unsigned int *)bia;
for(int i = 0; i < bmp.W() * bmp.H() * EC; ++i)
{
//bi[i] = *bc;
bi[i] = i/EC + i%EC;
}
ssbo.UnmapBuffer(Buffer::BIND_TARGET::COPY_READ_BUFFER);
ssbo.UnBind(Buffer::BIND_TARGET::COPY_READ_BUFFER);
ssbo.BindBase(0);
std::string cstr;
ShaderM::ReadShaderSourceFromFile("shaders/computer.glsl/bmp.glsl", cstr);
CMPProg cmpp(cstr.data());
cmpp.UseProgram();

//cmpp.Dispatch(1,1,16);
cmpp.Dispatch(bmp.W() ,bmp.H() ,1);
//glMemoryBarrier(GL_BUFFER_UPDATE_BARRIER_BIT);
glMemoryBarrier(GL_ALL_BARRIER_BITS);
ssbo.Bind(Buffer::BIND_TARGET::COPY_READ_BUFFER);
bia = (unsigned int (*)[4288][2848][EC])ssbo.MapBuffer(Buffer::BIND_TARGET::COPY_READ_BUFFER,Buffer::MAP_FLAG::READ_WRITE);

ssbo.UnmapBuffer(Buffer::BIND_TARGET::COPY_READ_BUFFER);
ssbo.UnBind(Buffer::BIND_TARGET::COPY_READ_BUFFER);


使用计算着色器(Compute Shader)模拟粒子效果【OpenGL】【GLSL】

效果如图:关键代码及注释如下:C++ 代码void initialize() { // 计算着色器 GLuint compute_shader = buildShader( &compute_...
  • panda1234lee
  • panda1234lee
  • 2017年04月23日 17:29
  • 1791

OpenGL着色器的使用总结

1.把着色器写到文本文件中,以便在程序中读取调用shader.vert;shader.fragment 2.用读文件的方式把两个着色器中的代码读到字符串中 3.新建shader对象,判断创建是否成...
  • hudfang
  • hudfang
  • 2015年10月16日 19:07
  • 1521

OpenGL ES 同样的灯光计算在顶点着色器和在片元着色器中计算有什么不同

OpenGL ES 同样的灯光计算在顶点着色器和在片元着色器中计算有什么不同
  • sleks
  • sleks
  • 2014年01月03日 13:09
  • 1573

nBodyCS<I>学习笔记之计算着色器

DirectX提供了一种在显卡上运行的程序——着色器(Shader)。从DirectX11开始,DirectX增加了一种计算着色器(Compute Shader),它是专门为与图形无关的通用计算设计的...
  • magr_lemon
  • magr_lemon
  • 2017年04月12日 20:03
  • 290

OpenGLES着色器和编程

【着色器和项目】   使用着色器渲染有两个基本的对象类型你需要去创建:着色器对象和项目对象。着色器对象是包含单个着色器的物体。源码输入着色器对象, 着色器对象被编辑为目标格式(.obj文件...
  • zh13544539220
  • zh13544539220
  • 2015年05月25日 18:02
  • 556

glsl应用 计算着色器 之 简单的图像写入

这个例子主要简单的往图像中写入数据。然后将写入的数据进行渲染。 在计算着色器中,对每个本地工作组的每个运行单元写入其在本地工作组的位置进行归一化,然后将这个数据作为输出颜色的x,y通道。所以对一个本...
  • weixin_41254969
  • weixin_41254969
  • 2018年01月06日 16:57
  • 45

OpenGL高级特性之利用Image内存模型&计算着色器&原子操作实现(直方图模型)通用计算

Image与Texture的区别 参考: https://stackoverflow.com/questions/35716267/opengl-glactivetexture-vs-glb...
  • zx_li
  • zx_li
  • 2017年11月28日 23:58
  • 85

6.5 光照的每顶点计算与每片元计算

http://book.51cto.com/art/201206/341259.htm 《Android 3D游戏开发技术宝典——OpenGL ES 2.0》第6章光照,本章将向读者...
  • xuexiaokkk
  • xuexiaokkk
  • 2015年10月30日 18:00
  • 235

Directx 计算着色器(compute shader)

原文 :http://www.cnblogs.com/Ninputer/archive/2009/12/11/1622190.html
  • zsc09_leaf
  • zsc09_leaf
  • 2014年07月09日 10:24
  • 6396

OpenGL4.3新特性: 计算着色器 Compute Shader

计算着色器是一个完全用于计算任意信息的 着色器阶段(Stage) 。虽然它可以渲染,但它通常用于与绘制三角形和像素无关的任务。概述计算着色器与其他着色器阶段的操作不同。 所有其他着色器阶段都有一组明确...
  • zyq522376829
  • zyq522376829
  • 2017年09月20日 16:29
  • 258
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:计算着色器
举报原因:
原因补充:

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