glsl es dFdx / dFdy analog

时间:2014-03-16 20:10:10

标签: android opengl-es glsl glsles

我正在编写跨平台应用程序。它应该在Android设备上运行 我想使用dFdx / dFdy进行抗锯齿处理。但不幸的是,glsl es 2.0不支持衍生品。

我可以用某些东西替换dFdx / dFdy吗? I.E. 1 / sprite_width,1 / sprite_height,以屏幕像素为单位。

正如我所说,我需要这个才能在Android设备上运行。我看到我的设备支持GL_OES_standard_derivatives,它允许它使用这个功能。所有Android opengl es 2.0设备都支持吗?

1 个答案:

答案 0 :(得分:4)

正如我所说,许多Opengl ES 2.0设备支持GL_OES_standard_derivatives扩展。
但对于那些不这样做的人来说,我做了这个解决方法:

float myFunc(vec2 p){
return p.x*p.x - p.y; // that's our function. We want derivative from it.
}


// this calculated in vertex shader
// width/height = triangle/quad width/height in px;
vec2 pixel_step = vec2(1/width, 1/height);       

float current = myFunc(texCoord);
float dfdx = myFunc(texCoord + pixel_step.x) - current;
float dfdy = myFunc(texCoord + pixel_step.y) - current;

float fwidth = abs(dx) + abs(dy);       // from khronos doc #http://www.khronos.org/registry/gles/extensions/OES/OES_standard_derivatives.txt

P.S。我得到了非常接近glsl内置ins的结果,有点模糊(在我的着色器中)。为了解决这个问题,我在1 / 1.75上添加了倍增pixel_step。如果有人知道原因,请告诉我。