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