imageStore在计算着色器到深度纹理

时间:2016-12-12 20:27:12

标签: opengl glsl compute-shader

我不能为我的生活锻炼如何在计算着色器中使用imageStore写入深度纹理,我已经检查了我对几个例子做了什么(例如thisthis),但我仍然无法发现错误。我可以将纹理写为Framebuffer,并且在调用glTexImage2D()时,但由于某种原因执行此计算着色器并不会影响命名纹理(我通过渲染到屏幕来检查)。

如果以上情况适用,您可以直接跳到下面接受的答案。

下面我已经以更清晰的格式提取了相关代码,它是一个更大的项目的一部分,它通过一堆错误检查将常见的GL操作包装在类中。但我自己写了the project,所以我知道什么是被召唤的。

我有我的计算着色器,这很简单,应该将0.5f写入每个像素,(在我的调试渲染中将输出为青色)。

#version 430
layout(local_size_x=16,local_size_y=16) in;

uniform uvec2 _imageDimensions;
uniform layout (r32f) writeonly image2D _imageOut;

void main () 
{
    if(gl_GlobalInvocationID.x<_imageDimensions.x
    &&gl_GlobalInvocationID.y<_imageDimensions.y)
    {
        imageStore(_imageOut, ivec2(gl_GlobalInvocationID.xy), vec4(0.5f));
    }
}

我使用

创建纹理
glm::uvec2 shadowDims = glm::uvec2(4096);
GLuint shadowOut;
glGenTextures(1, &shadowOut);
glBindTexture(GL_TEXTURE_2D, shadowOut);
glTexImage2D(GL_TEXTURE_2D, 0, GL_DEPTH_COMPONENT32F, shadowDims.x, shadowDims.y, 0, GL_DEPTH_COMPONENT, GL_FLOAT, 0);
glBindTexture(GL_TEXTURE_2D, 0);

我使用

配置着色器
glUseProgram(computeShader)
//Dimensions
GLint location = glGetUniformLocation(computeShader, "_imageDimensions");
glUniform2uiv(location, 1, glm::value_ptr(shadowDims));
//Image unit
const int IMAGE_UNIT = 0;
location = glGetUniformLocation(computeShader, "_imageOut");
glUniform1iv(location , 1, &IMAGE_UNIT);
glUseProgram(0)

最后我用

启动着色器
glUseProgram(computeShader)
glBindImageTexture(IMAGE_UNIT, shadowOut, 0, GL_FALSE, 0, GL_WRITE_ONLY, GL_R32F);
//Split the image into work groups of size 16x16
glm::uvec2 launchConfig = shadowDims/ glm::uvec2(16) + glm::uvec2(1);
glDispatchCompute(launchConfig.x, launchConfig.y, 1);
//Synchronise written memory
glMemoryBarrier(GL_SHADER_IMAGE_ACCESS_BARRIER_BIT);

我尝试了一些调整,但无论我做什么,纹理仍然呈现,但我首先在初始化时配置它。

没有GL错误发生(我有一个预处理器宏,我将所有gl fn&包裹起来),虽然我的实际执行代码比上面提供的更抽象,但我对那里有信心&#39 ;没有错误导致变量丢失/改变。

1 个答案:

答案 0 :(得分:3)

  

我无法为我的生活锻炼如何使用计算着色器中的imageStore写入(深度)纹理

那是因为你不能

Image Load/Store只能用于读/写color image formats。深度和/或模板格式无法使用它。

不,您不能使用glCopyImageSubData在彩色和深度图像之间进行复制。计算着色器可以读取深度/模板格式,但只能通过sampler,而不能通过image变量。