将dFdx优化为单一变化吗?

ehw*_*ank 1 opengl glsl

因为dFdx必须涵盖每一个案例,

我认为它必须像这个伪代码一样实现:

vecN dFdx( vecN )
{
  wait_for_other_to_reach_here();
  return calculate_difference();
}
Run Code Online (Sandbox Code Playgroud)

但是看,如果我们通过单变量变量,它就很简单了.因为变化会插入线性.

示例片段着色器:

in vec3 v_vertex;

void main()
{
// it must be same result for all fragments in one triangle
  vec3 dx = dFdx( v_vertex );
  vec2 dy = dFdy( v_vertex );
  vec3 normal = normalize( cross( dx , dy ) );
  ....
  ....
}
Run Code Online (Sandbox Code Playgroud)

der*_*ass 5

首先,除非使用noperspectiveflat插值限定符,否则变换不会线性插值.由于透视校正(除非使用正交投影),插值在屏幕空间中将是非线性的.

其次,为什么你认为等待操作会发生?片段着色器是并行运行,并且GPU确保始终至少在2x2像素四边形上运行片段着色器,在同一个warp/wavefront/SIMD组中完全锁定,即使这将包括基元外的像素.这意味着GPU总是可以计算派生,而不必等待邻居片段赶上.Modern GL甚至会告诉您片段着色器调用是否只是通过gl_HelperInvocation输入在原语之外的辅助调用.