C++ 在glsl着色器中将矩阵作为纹理访问

C++ 在glsl着色器中将矩阵作为纹理访问,c++,opengl,matrix,glsl,textures,C++,Opengl,Matrix,Glsl,Textures,我有一个矩阵,它有149行和210列。我想把它发送到着色器进行一些计算。矩阵的值介于9-128之间。我使用以下方法将其绑定到纹理: m_GLTextureNNZ = new QOpenGLTexture(QOpenGLTexture::Target::Target2DArray); m_GLTextureNNZ->create(); m_GLTextureNNZ->bind(indx); m_GLTextureNNZ->setMinificationFilter(QOpenGL

我有一个矩阵,它有149行和210列。我想把它发送到着色器进行一些计算。矩阵的值介于9-128之间。我使用以下方法将其绑定到纹理:

m_GLTextureNNZ = new QOpenGLTexture(QOpenGLTexture::Target::Target2DArray);
m_GLTextureNNZ->create();
m_GLTextureNNZ->bind(indx);
m_GLTextureNNZ->setMinificationFilter(QOpenGLTexture::Nearest); 
m_GLTextureNNZ->setMagnificationFilter(QOpenGLTexture::Nearest);
m_GLTextureNNZ->setLayers(1);
m_GLTextureNNZ->setFormat(QOpenGLTexture::R8U);
m_GLTextureNNZ->setSize(m_sizeNZ2DCoeff_r,m_sizeNZ2DCoeff_c,1);
m_GLTextureNNZ->setWrapMode(QOpenGLTexture::ClampToEdge);
m_GLTextureNNZ->allocateStorage(QOpenGLTexture::Red, QOpenGLTexture::UInt8);

m_GLTextureNNZ->setData(0, 0, QOpenGLTexture::Red, QOpenGLTexture::UInt8, m_NNZ.data());
在着色器中,我希望访问此纹理的特定行和列:

uniform usampler2DArray NNZ;
vec3 getTexCoord(ivec2 indx, ivec3 tsize )
 {
  // ivec3 size = textureSize()
  return vec3( (indx.x+0.5)/tsize.x , (indx.y+0.5)/tsize.y , tsize.z);
 }
 .
 .
 .
 ivec3 patchedTexSize = textureSize(NNZ,0);
 vec3 texCoord = getTexCoord( ivec2(0,0),  ivec3(patchedTexSize.xy,0));

 uint iNNZ =  texture(NNZ, texCoord).r;
所以根据我的矩阵(0,0)的值应该是1。但是我没有得到这个值。有什么我遗漏的吗


编辑:所以我测试了全零矩阵和从纹理查找中得到的值,不管texcoords是2^8-1。

问题是我的数据是
int
,我试图创建一个无符号位纹理。因此,我将数据转换为
uint8\t
,它就可以工作了。此外,我还需要添加
glPixelStorei(GL\u UNPACK\u对齐,1)以确保像素对齐正确

为什么2D矩阵在3D中寻址?@BDL为了测试,现在我只使用一个矩阵,但我可以将128个矩阵作为一个数组。您的
texcoord.z
似乎是错误的,因为
textureSize.z
将是最大层索引加上一个。除此之外,我不明白为什么您甚至使用规范化的texcoords路径,而不直接使用
texelFetch
。@derhass我更正了texcoord.z并将其替换为0。我仍然得到奇怪的值。我在我的问题中添加了一个关于值是什么样子的编辑。我试过texelFetch,结果是一样的。