glTexStorage* 为指定的纹理创建固定存储。也就是分配的存储空间不可改变,这样就可以让纹理对象停止跟踪纹理的某些方面。 而纹理中的内容可以使用glTexSubImage* 来改变。
实验:
将一个从文件读取的图像数据,进行处理,之后进行输出流程。
CPU:
初始化
读取纹理数据。
创建纹理对象。
分配存储空间。
将纹素数据导入纹理对象。
绘制
将纹理对象绑定到纹理单元。
在GPU中进行处理。
将处理好的数据进行显示。
glGenTextures(1, &m_sourceTexture );
glBindTexture(GL_TEXTURE_2D, m_sourceTexture);
glTexStorage2D(GL_TEXTURE_2D, 1, intFormat, w, h );
glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, w, h, format, type, m_sourceImage->getLevel(0));
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glBindTexture(GL_TEXTURE_2D, 0);
glGenTextures(1, &m_resultTexture );
glBindTexture(GL_TEXTURE_2D, m_resultTexture);
glTexStorage2D(GL_TEXTURE_2D, 1, intFormat, w, h );
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glBindImageTexture(0,inputTex,0,GL_FALSE,0,GL_READ_ONLY,GL_RGBA);
glBindImageTexture(0,outputTex,0,GL_FALSE,0,GL_DRAW_ONLY,GL_RGBA);
layout(binding = 0,rgba8) uniform image2D inputImage;
layout(binding = 1,rgba8) uniform image2D outputImage;
void main()
{
vec4 color = imageLoad(inputImage,ivec2(u,v));
imageStore(resultImage, ive(u,v));
//实现了输出纹理内容的改变。
}