2017-05-26 80 views
0

我有一个有149行210列的矩阵。我想将它发送到着色器做一些计算。矩阵的值在9-128之间。我用以下为它绑定到纹理:在glsl着色器中访问作为纹理的矩阵

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()); 

,并在着色我要访问此纹理的特定行和col:

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。

+0

为什么你的2D矩阵是用3D编址的? – BDL

+0

@BDL现在测试我只使用一个矩阵,但是我可以将这个矩阵的128个作为一个数组。 – user3178756

+1

你的'texcoord.z'似乎是错误的,因为'textureSize.z'将是最大层索引加1。除此之外,我不明白为什么你甚至会使用正常化的texcoords路由,而不是直接使用'texelFetch'。 – derhass

回答

0

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