我正在尝试使用 UV gBuffer 对纹理重投影进行编码(这是一个纹理,其中包含在该像素处映射所需的 UV 值)
我觉得这个看这张图应该很容易理解(名气低不能附上): http://www.andvfx.com/wp-content/uploads/2012/12/3-objectes.jpg
第一个图像(黑色/黄色/红色/绿色)是 UV gBuffer,它表示 uv 值,第二个是漫反射 channel ,第三个是所需的结果。
在 OpenGL 上制作这个非常简单。
绘制一个简单的矩形并将此伪代码用作碎片着色器:
float2 newUV=texture(UVgbufferTex,gl_TexCoord[0]).xy; float3 finalcolor=texture(DIFFgbufferTex,newUV);
return float4(finalcolor,0);
OpenGL 负责选择 mipmap 级别、各向异性过滤等,与此同时,如果我在常规 CPU 进程上进行此操作,我会得到最终颜色的单个像素,因此我的结果很清晰。
这里有什么建议吗?我想知道如何手动计算一种 mipmap 并通过检查连续像素来选择级别,但不确定这是否是正确的方法,我也怀疑如何处理它,因为它可能在水平方向快速变化但在垂直方向或方向上变化较慢反之亦然。
事实上,我不知道这是如何在 OpenGL/DirectX 上内部计算的,因为我使用这种代码很长时间了,但从未想过内部原理。
最佳答案
你走在正确的轨道上。
要选择 mipmap 级别或应用各向异性过滤,您需要一个渐变。该梯度自然出现在 GL(在片段着色器中)中,因为它是在光栅化之后为所有插值变量计算的。如果您曾经尝试在顶点着色器中使用 mipmap 过滤对纹理进行采样,这一切都会变得非常明显。
您可以这样计算 LOD(lambda):
ρ = 最大值 (((du/dx)2 + (dv/dx)2)1/2 , ((du/dy)2 + (dv/dy)2)1/2 )
λ = log2 ρ
关于c++ - 在 CPU 上模拟 OpenGL 纹理映射以进行重投影,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28339602/