C++ OpenGL计算着色器渲染到3D纹理似乎没有任何作用

C++ OpenGL计算着色器渲染到3D纹理似乎没有任何作用,c++,opengl,glsl,C++,Opengl,Glsl,我编写了一个小着色器来设置3D体积的颜色值 #版本430 布局(本地大小x=1,本地大小y=1,本地大小z=1)在中; 布局(r8,绑定=0)统一的image3D destTex; void main() { imageStore(destTex、ivec3(gl_globalinovationId.xyz)、vec4(0.33,0,1.0,0.5)); } 它编译和链接没有错误 将创建卷,并按如下方式调度计算着色器 generateShader->use(); glEnable(GL_纹理_

我编写了一个小着色器来设置3D体积的颜色值

#版本430
布局(本地大小x=1,本地大小y=1,本地大小z=1)在中;
布局(r8,绑定=0)统一的image3D destTex;
void main()
{
imageStore(destTex、ivec3(gl_globalinovationId.xyz)、vec4(0.33,0,1.0,0.5));
}
它编译和链接没有错误

将创建卷,并按如下方式调度计算着色器

generateShader->use();
glEnable(GL_纹理_3D);
glGenTextures(1和densityTex);
玻璃纹理(GL_纹理0);
glBindTexture(GL_TEXTURE_3D,densityTex);
glTexParameteri(GL_纹理_3D、GL_纹理_MAG_过滤器、GL_线性);
glTexParameteri(GL\u纹理\u 3D、GL\u纹理\u最小\u过滤器、GL\u线性);
glTexParameteri(GL_纹理_3D、GL_纹理_包裹、GL_夹紧_至_边缘);
glTexParameteri(GL_纹理\u 3D、GL_纹理\u包裹、GL_夹紧\u至边缘);
glTexParameteri(GL_纹理\u 3D、GL_纹理\u包裹\u R、GL_夹紧\u至\u边缘);
glTexImage3D(GL_纹理_3D,0,GL_R8,chunksize+1,chunksize+1,chunksize+1,0,GL_红色,GL_无符号_字节,NULL);
glBindImageTexture(0,densityTex,0,GL_TRUE,0,GL_READ_WRITE,GL_R8);
glDispatchCompute(chunksize+1,chunksize+1,chunksize+1);
//确保在读取之前已完成对图像的写入
glMemoryBarrier(GL\u所有屏障\u位);
asdf(0)//在这里,我打印纹理的内容。
//奇怪的是,它到处都包含205个值,与我在着色器中设置的内容无关:vec4(0.33,0,1.0,0.5)
glBindTexture(GL_-TEXTURE_-3D,0);
打印图像数据的方法如下所示:

void Chunk::asdf(int-slice){
GLubyte*图像;
image=新字节[(chunksize+1)*(chunksize+1)*(chunksize+1)];
glGetTexImage(GL_纹理_3D,0,GL_R8,GL_无符号字节,图像);
标准::cout
这不会将任何数据复制到
image
,但只会生成
GL\u INVALID\u ENUM
错误。
GL\u R8
只是不是有效的
格式
参数。您很可能指的是
GL\u RED
(请注意,这与您用于
glTexImage3D
format
参数相同。
GL\u R8
只是
internalFormat
的枚举,它与您在OpenGL客户端上看到的任何内容都不相关,另请参见)

作为一个更一般的建议,我真的建议每个人在开发过程中使用这个特性,这样OpenGL错误就不会被忽视

这不会将任何数据复制到
image
,但只会生成
GL\u INVALID\u ENUM
错误。
GL\u R8
只是不是有效的
格式
参数。您很可能指的是
GL\u RED
(请注意,这与您用于
glTexImage3D
format
参数相同。
GL\u R8
只是
internalFormat
的枚举,它与您在OpenGL客户端上看到的任何内容都不相关,另请参见)


作为一个更一般的建议,我真的建议大家在开发过程中使用该功能,这样OpenGL错误就不会被忽视。

为什么
*4
?纹理的内部格式是
GL\u R8
。你是否混淆了
GL\u RGBA8
,这是在测试东西时使用不同格式的结果。更改了吗区别。为什么
*4
?纹理的内部格式是
GL_R8
。您是否将其与
GL_RGBA8
混淆?这是在测试内容时使用不同格式的结果。更改了它,没有区别。感谢您的回答,它确实帮助了我,但描述的问题保持不变…我现在使用SSBO作为谢谢你的回答,它确实帮助了我,但描述的问题保持不变…我现在使用SSBO作为解决方法。
glGetTexImage(GL_TEXTURE_3D, 0, GL_R8, GL_UNSIGNED_BYTE, image);