所以我有一个计算着色器应该采用纹理并将其复制到另一个纹理稍作修改。我已经确认纹理是绑定的,并且可以使用RenderDoc编写数据,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 拆分为其组件,但没有设法让他们更聪明地摆弄它们。
答案 0 :(得分:4)
8位浮点纹理只能存储介于0和1之间的值。由于gl_GlobalInvocationID
在大多数情况下大于1,因此会将其限制为最大值1,这会使纹理变为黄色。
如果要在两个方向上创建渐变,则必须确保存储的值从0开始并以1结束。一种可能性除以最大值:
result = vec4(vec2(gl_GlobalInvocationID.xy) / vec2(640, 480), 0, 1);