2017-05-26 83 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);以確保像素的對齊是正確的。