Я пытаюсь закодировать репроекцию текстуры с помощью UV gBuffer (это текстура, которая содержит желаемое значение UV для отображения в этом пикселе)
Я думаю, что это должно быть легко понять, просто посмотрев на эту картинку (я не могу придать должную репутацию):
http://www.andvfx.com/wp-content/uploads/2012/12/3-objectes.jpg
Первое изображение (чёрное / жёлтое / красное / зелёное) — это ультрафиолетовый gBuffer, оно представляет значения uv, второе — диффузный канал, а третье — желаемый результат.
Сделать это на OpenGL довольно тривиально.
Нарисуйте простой прямоугольник и используйте в качестве фрагментированного шейдера этот псевдокод:
float2 newUV = текстура (UVgbufferTex, gl_TexCoord [0]). xy;
float3 finalcolor = texture (DIFFgbufferTex, newUV);return float4 (finalcolor, 0);
OpenGL заботится о выборе уровня mipmap, анизотропной фильтрации и т. Д. В то же время, если я делаю это на обычном процессоре ЦП, я получаю один пиксель для финального цвета, поэтому мой результат получается четким.
Любой совет здесь? Я задавался вопросом о том, чтобы вручную вычислить своего рода мип-карты и выбрать уровень, проверив смежный пиксель, но не уверен, что это правильный путь, также я сомневаюсь, как с этим справиться, так как он может быстро меняться на горизонтальной, но медленнее на вертикальной или наоборот.
На самом деле я не знаю, как это вычисляется внутри OpenGL / DirectX, так как я долгое время использовал этот вид кода, но никогда не думал о внутренностях.
Ты на правильном пути.
Чтобы выбрать уровень mipmap или применить анизотропную фильтрацию, вам нужен градиент. Этот градиент естественным образом появляется в GL (в фрагментных шейдерах), потому что он вычисляется для всех интерполированных переменных после растеризации. Все это становится совершенно очевидным, если вы когда-нибудь попробуете сэмплировать текстуру, используя фильтрацию mipmap в вершинном шейдере.
ρ = max (((du / dx)2 + (Ди / дх)2)1/2
, ((Ди / д)2 + (Ди / д)2)1/2)
λ = log2 ρ
Текстура выбирается исходя из размера на экране после перепроецирования. После того, как вы испустите треугольник, проверьте размер растеризации и выберите соответствующий mipmap.
Что касается фильтрации, то не так сложно реализовать билинейную фильтрацию вручную.