我正在进行一个基于OpenGL的Oculus Rift畸变着色器实现。该着色器的工作原理是通过使用畸变系数对输入纹理坐标(其中包含先前渲染场景的纹理)进行变换,然后使用变换后的纹理来确定片元颜色。
我本希望通过预计算畸变并将其存储在第二个纹理中来提高性能,但结果实际上比直接计算更慢。
直接计算的版本基本上看起来像这样:
我本希望通过预计算畸变并将其存储在第二个纹理中来提高性能,但结果实际上比直接计算更慢。
直接计算的版本基本上看起来像这样:
float distortionFactor(vec2 point) {
float rSq = lengthSquared(point);
float factor = (K[0] + K[1] * rSq + K[2] * rSq * rSq + K[3] * rSq * rSq * rSq);
return factor;
}
void main()
{
vec2 distorted = vRiftTexCoord * distortionFactor(vRiftTexCoord);
vec2 screenCentered = lensToScreen(distorted);
vec2 texCoord = screenToTexture(screenCentered);
vec2 clamped = clamp(texCoord, ZERO, ONE);
if (!all(equal(texCoord, clamped))) {
vFragColor = vec4(0.5, 0.0, 0.0, 1.0);
return;
}
vFragColor = texture(Scene, texCoord);
}
K是一个作为uniform传递的vec4。
另一方面,位移贴图查找看起来像这样:
void main() {
vec2 texCoord = vTexCoord;
if (Mirror) {
texCoord.x = 1.0 - texCoord.x;
}
texCoord = texture(OffsetMap, texCoord).rg;
vec2 clamped = clamp(texCoord, ZERO, ONE);
if (!all(equal(texCoord, clamped))) {
discard;
}
if (Mirror) {
texCoord.x = 1.0 - texCoord.x;
}
FragColor = texture(Scene, texCoord);
}
还有一些其他的操作用于校正宽高比和考虑镜头偏移,但它们都很简单。真的可以期望这样做比简单的纹理查找更加出色吗?