我想使用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;
}
谢谢。 我改变了值,没有在这个类的错误,但仍然无法正常工作。我是否正确使用image2D? 要清楚:头寸的.w组件决定该点是否绘制(1)。 – Kedriik
你说它“不起作用”。你怎么知道的?发布验证这一点的代码。 –
正如我之前所说,位置与.w == 1的点将被绘制为绿色一切黑色。在这种情况下,1个绿点应该在位置0,0,0处出现。如果我把Positions [0] .w = 1; – Kedriik