我试图获取其值小于0.89的像素数的计数。 由于WebGL Shaders变量不会持续存在,我只是尝试了一种方法,该方法是在上次迭代中或在texCoord为1.0,1.0时计算计数的地方。
当前我正在尝试下面的代码,这是正确的吗,我们对此有更好的方法吗?
`
void main() {
//gl_FragColor = vec4(texture2D(u_texture, vec2(mytexcoord.x, mytexcoord.y)).rgb, 1.0);
vec2 uv = mytexcoord;
float ins = texture2D(u_texture, vec2(uv.x, 1.0 - uv.y)).r;
float neglectIntensityValue = 0.89453125;
float blueVal = 0.00000000;
vec2 onePixel = vec2(1.0, 1.0) / u_resolution;
int pixelCount = 0;
if (vec2(1.0) == mytexcoord) {
//last iteration
//loop through all the pixels to know the count
const int totalPixels = 100000;//int(u_resolution.x * u_resolution.y);
for (int i = 0; i < totalPixels; i++) {
vec2 uv = vec2((float(i)) / 100000.0, 0.5);
vec4 colorData = vec4(texture2D(u_texture, uv).rgb, 1.0);
if (colorData.r < neglectIntensityValue) {
pixelCount++;
}
}
}
if (pixelCount > 1000) {
gl_FragColor = vec4(ins, ins, ins, 1.0);
} else {
ins = 1.0 - ins;
gl_FragColor = vec4(ins, ins, ins, 1.0);
}
}
`
答案 0 :(得分:0)
无法仅使用片段着色器来更有效地执行此操作。您的像素着色器可能在大型纹理上崩溃,因为它不打算长时间运行。如果足够的话,您可以随机采样像素的一个子集作为近似值。
为实现有效的实现,您可以让着色器将1或0输出到渲染纹理中,然后使用不同像素着色器的log(n)传递将其汇总,将2x2像素(或4x4或更多)求和每遍1个像素。显然,实现起来要复杂得多。