因为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)
首先,除非使用noperspective或flat插值限定符,否则变换不会线性插值.由于透视校正(除非使用正交投影),插值在屏幕空间中将是非线性的.
其次,为什么你认为等待操作会发生?片段着色器是并行运行的,并且GPU确保始终至少在2x2像素四边形上运行片段着色器,在同一个warp/wavefront/SIMD组中完全锁定,即使这将包括基元外的像素.这意味着GPU总是可以计算派生,而不必等待邻居片段赶上.Modern GL甚至会告诉您片段着色器调用是否只是通过gl_HelperInvocation输入在原语之外的辅助调用.
| 归档时间: |
|
| 查看次数: |
139 次 |
| 最近记录: |