如何从OpenGL GLSL中的纹理的特定索引中选择像素值

时间:2018-02-11 08:57:11

标签: opengl opengl-es glsl webgl fragment-shader

我正在渲染一个纹理,我需要从某个特定索引中选择值来更新当前索引。

对于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)]是一个CPU语句,不能在opengl中使用。 任何人都可以建议一些替代解决方案来读取纹理的索引吗?

1 个答案:

答案 0 :(得分:2)

对于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);

你需要添加.5来定位纹素的中心,否则你的目标是边缘,你可能会得到错误的像素。

当然resolutionOfTexturepixelX以及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;