2016-02-21 101 views
2

我想使用image2D作为2D存储器来处理将被计算着色器修改的顶点,但事情并不奏效。计算着色器中的Image2D

创建纹理:

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; 
} 

回答

0
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

+0

谢谢。 我改变了值,没有在这个类的错误,但仍然无法正常工作。我是否正确使用image2D? 要清楚:头寸的.w组件决定该点是否绘制(1)。 – Kedriik

+0

你说它“不起作用”。你怎么知道的?发布验证这一点的代码。 –

+0

正如我之前所说,位置与.w == 1的点将被绘制为绿色一切黑色。在这种情况下,1个绿点应该在位置0,0,0处出现。如果我把Positions [0] .w = 1; – Kedriik

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; 
}