Имитация отображения текстуры OpenGL на CPU для перепроецирования

Я пытаюсь закодировать репроекцию текстуры с помощью 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, так как я долгое время использовал этот вид кода, но никогда не думал о внутренностях.

0

Решение

Ты на правильном пути.

Чтобы выбрать уровень mipmap или применить анизотропную фильтрацию, вам нужен градиент. Этот градиент естественным образом появляется в GL (в фрагментных шейдерах), потому что он вычисляется для всех интерполированных переменных после растеризации. Все это становится совершенно очевидным, если вы когда-нибудь попробуете сэмплировать текстуру, используя фильтрацию mipmap в вершинном шейдере.

Вы можете вычислить LOD (лямбда) следующим образом:

    ρ = max (((du / dx)2 + (Ди / дх)2)1/2
, ((Ди / д)2 + (Ди / д)2)1/2)

    λ = log2 ρ

1

Другие решения

Текстура выбирается исходя из размера на экране после перепроецирования. После того, как вы испустите треугольник, проверьте размер растеризации и выберите соответствующий mipmap.

Что касается фильтрации, то не так сложно реализовать билинейную фильтрацию вручную.

0

По вопросам рекламы [email protected]