【问题标题】:Image2D in compute shader计算着色器中的 Image2D
【发布时间】:2016-02-21 17:24:19
【问题描述】:

我想将 image2D 用作顶点的 2D 存储,这些顶点将被计算着色器修改,但事情不起作用。

创建纹理:

glGenTextures(1, &HeightMap);
glBindTexture(GL_TEXTURE_2D, HeightMap);
glTexImage2D(GL_TEXTURE_2D, 0,GL_RGBA32F, 513, 513, 0,GL_RGBA32F, GL_UNSIGNED_BYTE, 0);

使用和调度计算着色器:

glUseProgram(ComputeProgram);
glActiveTexture(GL_TEXTURE0);
glBindImageTexture(0, HeightMap, 0, GL_FALSE, 0, GL_READ_WRITE, GL_RGBA32F);
glDispatchCompute(1, 1, 1 );
glMemoryBarrier( GL_ALL_BARRIER_BITS );

并计算着色器:

    #version 430 core
layout( std430, binding=1 ) buffer VertBuffer
    {
    vec4 Positions[ ]; 
    };
layout( local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
layout (binding=0, rgba32f)  uniform image2D HeightMap;
void main (void)
{
    imageStore(HeightMap, ivec2(0,0),vec4(0,0,0,1));
    Positions[0]=imageLoad(HeightMap, ivec2(0,0)).rgba;
}

【问题讨论】:

    标签: opengl textures shader


    【解决方案1】:

    好的,我找到了解决方案。这就是您如何使用 image2D 通过计算着色器读取和写入数据:

    创建纹理:

    glGenTextures(1, &HeightMap);
    glBindTexture(GL_TEXTURE_2D, HeightMap);
    glTexImage2D(GL_TEXTURE_2D, 0,GL_RGBA32F, 513, 513, 0,GL_RGBA, GL_FLOAT, 0);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
    glGenerateMipmap(GL_TEXTURE_2D);
    

    调度计算着色器:

    glBindBufferBase( GL_SHADER_STORAGE_BUFFER, 1, VerticesBuffer );
    
    glBindImageTexture(0, HeightMap, 0, GL_FALSE, 0, GL_READ_WRITE, GL_RGBA32F);
    glUseProgram(ComputeProgram);
    
    glUniform1i(glGetUniformLocation(ComputeProgram, "HeightMap"), 0);
    
    
    glDispatchCompute(1, 1, 1 );
    glMemoryBarrier( GL_ALL_BARRIER_BITS );
    

    计算着色器示例:

        #version 430 core
    layout( std430, binding=1 ) buffer VertBuffer
        {
        vec4 Positions[ ]; 
        };
    layout( local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
    layout (rgba32f)  uniform image2D HeightMap;
    void main (void)
    {
        ivec2 pos=ivec2(0,0);
        imageStore(HeightMap, pos,vec4(10,0,0,1));
        Positions[0].xyzw=imageLoad(HeightMap, pos).rgba;
    }
    

    【讨论】:

      【解决方案2】:
      glTexImage2D(GL_TEXTURE_2D, 0,GL_RGBA32F, 513, 513, 0,GL_RGBA32F, GL_UNSIGNED_BYTE, 0);
      

      始终检查您的 OpenGL 错误。此行失败,因为GL_RGBA32F 不是合法的pixel transfer format。像素传输格式仅指定您使用的组件数量。应该是GL_RGBA。这会导致 OpenGL 错误。

      是的,我知道您实际上并没有传输像素数据。但是 OpenGL 要求像素传输参数是合法的,即使您实际上并没有进行像素传输。

      另外,类型(下一个参数)应该是GL_FLOAT,而不是GL_UNSIGNED_BYTE

      【讨论】:

      • 谢谢。我改变了值,这个类没有错误,但仍然不起作用。我是否正确使用 image2D?需要明确的是:Positions 的 .w 组件决定该点是否绘制 (1)。
      • 你说它“不起作用”。你怎么知道的?发布验证这一点的代码。
      • 正如我之前所说,位置中的点 .w==1 将被绘制为绿色,其他为黑色。在这种情况下,1 个绿点应出现在位置 0,0,0。如果我把 Positions[0].w=1;
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-05-07
      • 1970-01-01
      相关资源
      最近更新 更多