简体   繁体   English

OpenGL Compute Shader - glDispatchCompue()不运行

[英]OpenGL Compute Shader - glDispatchCompue() does not run

I'm currently working with a compute shader in OpenGl and my goal is to render from one texture onto another texture with some modifications. 我目前正在使用OpenGl中的计算着色器,我的目标是从一个纹理渲染到另一个纹理并进行一些修改。 However, it does not seem like my compute shader has any effect on the textures at all. 但是,似乎我的计算着色器根本不会对纹理产生任何影响。

After creating a compute shader I do the following 创建计算着色器后,我执行以下操作

//Use the compute shader program
(*shaderPtr).useProgram();

//Get the uniform location for a uniform called "sourceTex"
//Then connect it to texture-unit 0
GLuint location = glGetUniformLocation((*shaderPtr).program, "sourceTex");
glUniform1i(location, 0);

//Bind buffers and call compute shader
this->bindAndCompute(bufferA, bufferB);

The bindAndCompute() function looks like this and its purpose is to ready the two buffers to be accessed by the compute shader and then run the compute shader. bindAndCompute()函数看起来像这样,其目的是准备计算着色器访问两个缓冲区,然后运行计算着色器。

bindAndCompute(GLuint sourceBuffer, GLuint targetBuffer){
  glBindImageTexture(
    0,                          //Always bind to slot 0
    sourceBuffer,
    0,
    GL_FALSE,
    0,
    GL_READ_ONLY,               //Only read from this texture
    GL_RGB16F
  );

  glBindImageTexture(
    1,                          //Always bind to slot 1
    targetBuffer,
    0,
    GL_FALSE,
    0,
    GL_WRITE_ONLY,              //Only write to this texture
    GL_RGB16F
  );

  //this->height is currently 960
  glDispatchCompute(1, this->height, 1);            //Call upon shader 

  glMemoryBarrier(GL_SHADER_IMAGE_ACCESS_BARRIER_BIT);
}

And finally, here is the compute shader. 最后,这是计算着色器。 I currently only try to set it so that it makes the second texture completely white. 我目前只尝试设置它,使它使第二个纹理完全变白。

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

layout (rgba16, binding=0) uniform image2D sourceTex;           //Textures bound to 0 and 1 resp. that are used to
layout (rgba16, binding=1) uniform image2D targetTex;           //acquire texture and save changes made to texture

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

void main(){

  vec4 result;     //Vec4 to store the value to be written

  pxlPos = ivec2(gl_GlobalInvocationID.xy);     //Get pxl-pos

  /*
  result = imageLoad(sourceTex, pxlPos);

  ...
  */

  imageStore(targetTex, pxlPos, vec4(1.0f));    //Write white to texture
}

Now, when I start bufferB is empty. 现在,当我启动bufferB为空时。 When I run this I expect bufferB to become completely white. 当我运行这个时,我希望bufferB变成完全白色。 However, after this code bufferB remains empty. 但是,此代码缓冲区B保持为空。 My conclusion is that either 我的结论是

A: The compute shader does not write to the texture 答:计算着色器不会写入纹理

B: glDispatchCompute() is not run at all B: glDispatchCompute()根本没有运行

However, i get no errors and the shader does compile as it should. 但是,我没有错误,着色器确实编译它应该。 I have checked that I bind the texture correctly when rendering by binding bufferA which I already know what it contains, then running bindAndCompute(bufferA, bufferA) to turn bufferA white. 我已经检查过我通过绑定bufferA正确绑定纹理,我已经知道它包含什么,然后运行bindAndCompute(bufferA,bufferA)来将bufferA变成白色。 However, bufferA is unaltered. 但是, bufferA没有改变。 So, I've not been able to figure out why my compute shader has no effect. 所以,我无法弄清楚为什么我的计算着色器没有效果。 If anyone has any ideas on what I can try to do it would be appreciated. 如果有人对我可以尝试做什么有任何想法,将不胜感激。

End note: This has been my first question asked on this site. 结束语:这是我在本网站上提出的第一个问题。 I've tried to present only relevant information but I still feel like maybe it became too much text anyway. 我试图只提供相关信息,但我仍然觉得它可能无论如何都变得过多了。 If there is feedback on how to improve the structure of the question that is welcome as well. 如果有关于如何改进问题结构的反馈也是受欢迎的。

--------------------------------------------------------------------- -------------------------------------------------- -------------------

EDIT: 编辑:

The textures I send in with sourceBuffer and targetBuffer is defined as following: 我使用sourceBuffertargetBuffer发送的纹理定义如下:

glGenTextures(1, *buffer);
glBindTexture(GL_TEXTURE_2D, *buffer);
glTexImage2D(
  GL_TEXTURE_2D,
  0,
  GL_RGBA16F,       //Internal format
  this->width,
  this->height,
  0,
  GL_RGBA,      //Format read
  GL_FLOAT,     //Type of values in read format
  NULL          //source
);

glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);

The image format of the images you bind doesn't match the image format in the shader. 绑定的图像的图像格式与着色器中的图像格式不匹配。 You bind a RGB16F (48byte per texel) texture, but state in the shader that it is of rgba16 format (64byte per texel). 绑定RGB16F (每个纹素RGB16F )纹理,但在着色器中声明它是rgba16格式(每个纹素64byte)。

Formats have to match according to the rules given here . 格式必须根据此处给出的规则进行匹配。 Assuming that you allocated the texture in OpenGL, this means that the total size of each texel have to match. 假设您在OpenGL中分配了纹理,这意味着每个纹素的总大小必须匹配。 Also note, that 3-channel textures are (without some rather strange exceptions) not supported by image load/store. 另请注意,图像加载/存储不支持3通道纹理(没有一些相当奇怪的例外)。

As a side-note: The shader will execute and write if the texture format size matches. 作为旁注:如果纹理格式大小匹配,着色器将执行并写入。 But what you write might be garbage because your textures are in 16-bit floating point format ( RGBA_16F ) while you tell the shader that they are in 16-bit unsigned normalized format ( rgba16 ). 但是你写的东西可能是垃圾,因为你的纹理是16位浮点格式( RGBA_16F ),而你告诉着色器它们是16位无符号标准化格式( rgba16 )。 Although this doesn't directlyy matter for the compute shader, it does matter if you read-back the texture or access it trough a sampler or write data > 1.0f or < 0.0f into it. 虽然这不会直接影响计算着色器,但是如果您回读纹理或通过采样器访问纹理或将数据> 1.0f或<0.0f写入其中,则无关紧要。 If you want 16-bit floats, use rgba16f in the compute shader. 如果需要16位浮点数, rgba16f在计算着色器中使用rgba16f

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM