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

时间:2017-05-26 14:51:12

标签: 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(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。

1 个答案:

答案 0 :(得分:0)

问题是我的数据是int,我试图创建一个无符号位纹理。所以我将我的数据转换为uint8_t并且它有效。另外,我需要添加glPixelStorei(GL_UNPACK_ALIGNMENT, 1);以确保像素的对齐方式正确。