如何从 OpenGL GLSL 中的特定纹理索引中选取像素值
how to pick pixel value from a specific index of a texture in 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)]
是一个 CPU 语句,在 opengl 中不起作用。
谁能建议一些替代解决方案来读取纹理索引?
对于 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 以定位纹素的中心,否则您定位的是边缘并且您可能会得到错误的像素。
当然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;
我正在渲染纹理,我卡在需要从某个特定索引中选取值以更新当前索引的位置。
对于 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 中不起作用。
谁能建议一些替代解决方案来读取纹理索引?
对于 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 以定位纹素的中心,否则您定位的是边缘并且您可能会得到错误的像素。
当然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;