C++ OpenGL计算着色器渲染到3D纹理似乎没有任何作用
我编写了一个小着色器来设置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_纹理_
#版本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);