我想将image2D用作顶点的2D存储,这些顶点将由计算着色器修改,但事情不起作用。
创建纹理:
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;
}
计算着色器:
{{1}}
答案 0 :(得分: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);
Dispatch compute shader:
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;
}
答案 1 :(得分: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
。