как выбрать значение пикселя из определенного индекса текстуры в OpenGL GLSL

Я визуализирую текстуру, в которой я застрял в точке, где мне нужно выбрать значения из определенного индекса для обновления текущего индекса.

Для EG:

float someColor = texture2D(u_image, vTexCoord).r; //assume u_image is 10*10 image
if (someColor.r > 0.5) {
    someColor = someColorPalette[(zr*zcols)+(zc-1)]; //someColorPalette is another texture
//where (zr*zcols)+(zc-1) is getting the pixel value from some index using the calculation 
}

`

В приведенном выше фрагменте я знаю, что someColorPalette[(zr*zcols)+(zc-1)] является оператором ЦП и не будет работать в opengl. Может ли кто-нибудь предложить какое-то альтернативное решение для чтения из индекса текстуры?


person graphics123    schedule 11.02.2018    source источник
comment
глядя на имена переменных, вы можете найти это полезным   -  person gman    schedule 11.02.2018
comment
Ответ будет зависеть от того, о какой версии OpenGL вы говорите.   -  person Nicol Bolas    schedule 11.02.2018


Ответы (1)


Для GLSL ES 1.0 для извлечения определенного текселя из текстуры используйте

 vec2 resolutionOfTexture = vec2(someWidth, someHeight)
 int pixelX = ?
 int pixelY = ?

 vec2 uv = (vec2(pixelX, pixelY) + .5) / resolutionOfTexture;
 vec4 color = texture(someTexture, uv);

Вам нужно добавить 0,5 для нацеливания на центр текселей, иначе вы нацелитесь на края, и вы можете получить неправильный пиксель.

Конечно, resolutionOfTexture, pixelX и pixelY могут быть униформой или чем угодно

Для GLSL ES 3.0 используйте

 vec4 color = texelFetch(someTexture, ivec2(pixelX, pixelY), 0);

Если вам нужен линейный индекс, тогда в GLSL ES 1.0

 pixelX = mod(someIndex, resolutionOfTexture.x);
 pixelY = floor(someIndex / resolutionOfTexture.x);

в GLSL ES 3.0

 ivec2 texSize = textureSize(someTexture, 0);
 pixelX = someIndex % texSize.x;
 pixelY = someIndex / texSize.x;
person gman    schedule 11.02.2018
comment
Спасибо за ценные предложения, позвольте мне попробовать их один за другим. Я все еще использую WebGl1, поэтому думаю, что первый ответ мне подойдет. - person graphics123; 11.02.2018