我正在研究 oculus Rift 失真着色器的 OpenGL 实现。着色器通过获取输入纹理坐标(包含先前渲染场景的纹理)并使用失真系数对其进行变换,然后使用变换后的纹理来确定片段颜色。
我希望通过预先计算失真并将其存储在第二个纹理中来提高性能,但结果实际上比直接计算 要慢。
直接计算版本基本上是这样的:
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 是作为制服传入的 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);
}
还有一些其他操作可用于校正纵横比和考虑镜头偏移,但它们非常简单。期望它优于简单的纹理查找真的合理吗?