我正在使用紋理進行顏色查找以將效果應用於圖片。我的查找是使用第一個紋理片段的亮度的梯度圖,然後在第二個紋理上查看。第二個紋理是256x256,水平漸變和幾個不同的漸變從上到下。所以32個水平條紋每8個像素高。我在x上的查找是亮度,在y上它是一個漸變,我瞄準條紋的中心以避免交叉。爲什麼1.0的紋理座標超出紋理邊緣?
我的片段着色器看起來是這樣的:
lowp vec4 source = texture2D(u_textureSampler, v_fragmentTexCoord0);
float luminance = 1.0 - dot(source.rgb, W);
lowp vec2 texPos;
texPos.x = clamp(luminance, 0.0, 1.0);
// the y value selects which gradient to use by supplying a T value
// this would be more efficient in the vertex shader
texPos.y = clamp(u_value4, 0.0, 1.0);
lowp vec4 newColor1 = texture2D(u_textureSampler2, texPos);
它的工作不錯,但我是在白人和黑人的最黑暗部分的白的部分越來越失真。基本上,它看起來像從texture2上完全不同的地方抓取了newColor,或者可能只是沒有爲這些片段獲得任何東西。我在着色器中添加了夾具以儘量避免出現在查找紋理的邊緣之外,但這沒有幫助。我沒有正確使用夾子嗎?
最後我認爲它可能與我的源紋理或它的加載方式有關。我結束了通過增加修復它:
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
所以..爲什麼?
這是一個有點惱人必須夾緊紋理,因爲這意味着我必須寫一個例外,在我的代碼,當我加載查找表..
如果我textPos.x和.Y被鎖定到0-1 ..它如何將樣本拉出邊緣?
另外..當我要使用紋理時,是否必須在創建紋理時使用上述的鉗位調用,還是可以調用它?
因此,如果您在GL_LINEAR中,那麼無法在着色器中進行調整?它必須用opengl調用進行鉗制? 那個glTexParameteri調用呢?可以在綁定紋理時使用它,還是在加載紋理時必須完成? – badweasel
@badweasel您可以***在着色器中實現鉗位,實際上'GL_CLAMP_TO_EDGE' * *所做的操作是將座標範圍限制爲[0 + 0.5/texSize,1-0.5/texSize]。這導致在***確切*** texel中心採樣,以便從不出現使用相鄰紋素的插值。 –
@badweasel這個特殊保證當然只適用於採樣邊緣紋理元素,因此名稱。 –