【问题标题】:OpenGL: Compute Shader - gl_GlobalInvocationID giving static outputOpenGL:计算着色器 - gl_GlobalInvocationID 提供静态输出
【发布时间】:2018-06-18 14:02:06
【问题描述】:

所以我有一个计算着色器,它应该采用纹理并将其复制到另一个纹理并稍作修改。我已经确认纹理是绑定的,并且可以使用 RenderDoc 写入数据,这是一个图形调试工具。我遇到的问题是,在着色器中,由 OpenGL 创建的变量 gl_GlobalInvocationID 似乎无法正常工作。

这是我对计算着色器的调用:(纹理高度为 480)

glDispatchCompute(1, this->m_texture_height, 1);            //Call upon shader
glMemoryBarrier(GL_SHADER_IMAGE_ACCESS_BARRIER_BIT);

然后我们在这里有我的计算着色器:

#version 440
#extension GL_ARB_compute_shader : enable
#extension GL_ARB_shader_image_load_store : enable

layout (rgba8, binding=0) uniform image2D texture_source0;
layout (rgba8, binding=1) uniform image2D texture_target0;

layout (local_size_x=640 , local_size_y=1 , local_size_z=1) in; //Local work-group size

void main() {
  ivec2 txlPos;     //A variable keeping track of where on the texture current texel is from
  vec4 result;      //A variable to store color

  txlPos = ivec2(gl_GlobalInvocationID.xy);
  //txlPos = ivec2( (gl_WorkGroupID * gl_WorkGroupSize + gl_LocalInvocationID).xy  );

  result = imageLoad(texture_source0, txlPos);          //Get color value

  barrier();

  result = vec4(txlPos, 0.0, 1.0);

  imageStore(texture_target0, txlPos, result);          //Save color in target texture
}

当我运行这个时,目标纹理变成完全黄色,除了沿着左边框的 1pxl 粗的绿线和沿着底部边框的 1pxl 粗的红线。我的期望是看到某种渐变,因为将 txlPos 保存为颜色值。

我是否以某种方式错误地定义了我的工作组?我尝试将 gl_GlobalInvokationID 拆分为其组件,但没有设法更明智地摆弄它们。

【问题讨论】:

  • 8位浮点纹理通常只能存储0到1之间的值。txlPos通常大于1。如果改为输出float(txlPos) / vec2(640,480)会怎样?
  • 我得到了一个渐变,从左到右从黑到黄。
  • 这几乎就是你想要的。我对 float(..) 的事情犯了一个错误,但我会写一个答案并纠正这个问题。

标签: c++ opengl compute-shader


【解决方案1】:

8 位浮点纹理只能存储 0 到 1 之间的值。由于gl_GlobalInvocationID 在大多数情况下大于 1,它会被限制为最大值 1,这会使纹理变黄。

如果要在两个方向上创建渐变,则必须确保存储的值从 0 开始并以 1 结束。一种可能是除以最大值:

result = vec4(vec2(gl_GlobalInvocationID.xy) / vec2(640, 480), 0, 1);

【讨论】:

  • 我确实得到了适当的渐变。这证明 gl_GlobalInvicationID.xy 确实拥有应有的不同值。因此,我的纹理复制不起作用的原因在于其他地方。谢谢你,你让我免于寻找一个没有问题的问题!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-02-10
  • 2020-02-23
  • 1970-01-01
  • 2020-11-22
  • 2017-02-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多