У меня есть вершинный шейдер как таковой
void main (){
vec4 wPos = modelMatrix * vec4( position , 1. );
vWorldPosition = wPos.xyz;
float mask = step(
0.,
dot(
cameraDir,
normalize(normalMatrix * aNormal)
)
);
gl_PointSize = mask * uPointSize;
gl_Position = projectionMatrix * viewMatrix * wPos;
}
Я не совсем уверен, как проверить работоспособность шейдера, и исключить другие факторы, такие как overdraw. Я думаю, что точка размера 1, расположенная в сетке в пространстве экрана без какого-либо наложения, будет работать?
В противном случае мне любопытны эти твики:
(удаляет step
, удаляет умножение, вводит if
else
)
void main (){
if(dot(
cameraDir,
normalize(normalMatrix * aNormal) //remove step
) < 0.) {
gl_Position = vec4(0.,.0,-2.,.1);
gl_PointSize = 0.;
} else {
gl_PointSize = uPointSize; //remove a multiplication
vec4 wPos = modelMatrix * vec4( position , 1. );
vWorldPosition = wPos.xyz;
gl_Position = projectionMatrix * viewMatrix * wPos;
}
}
против чего-то подобного:
void main (){
if(dot(
cameraDir,
normalize(normalMatrix * aNormal)
) < 0.) {
gl_Position = vec4(0.,.0,-2.,.1);
return;
}
gl_PointSize = uPointSize;
vec4 wPos = modelMatrix * vec4( position , 1. );
vWorldPosition = wPos.xyz;
gl_Position = projectionMatrix * viewMatrix * wPos;
}
Будут ли эти шейдеры вести себя по-разному и почему / как?
Мне интересно, есть ли что-то, чтобы измерить разницу в производительности.
- Есть ли какое-то значение, например, число MAD или что-то еще, что, очевидно, даст другой код?
- Различают ли графические процессоры разных поколений эти различия по-разному?
- Если пошаговая версия гарантированно будет самой быстрой, существует ли известный список шаблонов того, как можно избежать ветвления, и какие операции предпочитать? (Также возможно использование
floor
вместо step
?) :
.
float condition = clamp(floor(myDot + 1.),0.,1.); //is it slower?