0

我正在尝试使用 UV gBuffer 编写纹理重投影(这是一个纹理,其中包含用于在该像素处映射的 UV 所需值)

我认为这应该很容易通过看到这张照片来理解(我不能附加由于低声誉): http ://www.andvfx.com/wp-content/uploads/2012/12/3-objectes.jpg

第一个图像(黑色/黄色/红色/绿色)是 UV gBuffer,它代表 uv 值,第二个是漫反射通道,第三个是所需的结果。

在 OpenGL 上实现这一点非常简单。

绘制一个简单的矩形并将此伪代码用作分段着色器:

float2 newUV=texture(UVgbufferTex,gl_TexCoord[0]).xy; float3 finalcolor=texture(DIFFgbufferTex,newUV);

返回 float4(finalcolor,0);

OpenGL 负责选择 mipmap 级别、各向异性过滤等,同时如果我在常规 CPU 进程上进行此操作,我会得到一个用于 finalcolor 的像素,所以我的结果很清晰。

这里有什么建议吗?我想知道手动计算一种mipmaps并通过检查连续像素来选择级别,但不确定这是否是正确的方法,我也怀疑如何处理它,因为它可能在水平方向上快速变化但在垂直方向上变慢或反之亦然。

事实上,我不知道这是如何在 OpenGL/DirectX 内部计算的,因为我使用这种代码很长时间,但从未考虑过内部结构。

4

2 回答 2

1

你在正确的轨道上。

要选择 mipmap 级别或应用各向异性过滤,您需要一个渐变。该梯度在 GL(在片段着色器中)中很自然地出现,因为它是在光栅化之后为所有插值变量计算的。如果您尝试在顶点着色器中使用 mipmap 过滤对纹理进行采样,这一切都会变得非常明显。

您可以这样计算 LOD (lambda):

    ρ = 最大值 (((du/dx) 2 + (dv/dx) 2 ) 1 / 2 , ((du/dy) 2 + (dv/dy) 2 ) 1 / 2 )

    λ = log 2 ρ

于 2015-02-05T18:08:10.087 回答
0

重新投影后根据屏幕上的大小选择纹理。发出三角形后,检查光栅化大小并选择适当的 mipmap。

至于过滤,手动实现即双线性过滤并不难。

于 2015-02-05T15:19:34.083 回答