我尝试使用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进程中进行此操作,我会得到一个最终颜色的像素,因此我的结果很脆弱。
这里有什么建议吗?我想知道手动计算一种mipmaps并通过检查连续像素选择水平,但不确定这是否正确,我也怀疑如何处理,因为它可能在水平上快速变化但在垂直或反之亦然。
事实上,我不知道这是如何在OpenGL / DirectX内部计算的,因为我长时间使用这种代码但从未想过内部。
答案 0 :(得分:1)
你走在正确的轨道上。
要选择mipmap级别或应用各向异性过滤,您需要一个渐变。该渐变在GL(片段着色器)中自然出现,因为它是在光栅化后为所有插值变量计算的。如果您尝试使用顶点着色器中的mipmap过滤对纹理进行采样,这一切都变得非常明显。
ρ= max(((du / dx) 2 +(dv / dx) 2 ) 1 / 2 子> ,((du / dy) 2 +(dv / dy) 2 ) 1 / 2 功能)
λ= log 2 ρ
答案 1 :(得分:0)
在重投影后,根据屏幕上的尺寸拾取纹理。发射三角形后,检查光栅化大小并选择适当的mipmap。
至于过滤,它并不难实现,即手动进行双线性过滤。