Я пытаюсь сделать передачу рендеринга HDR в своем 3D-приложении.XNA и HLSL: Пример всей текстуры для средней яркости
Я понимаю, что для того, чтобы получить средний свет на сцене, вам нужно уменьшить выходной результат рендеринга до текстуры 1x1. На данный момент я боюсь.
Я установил цель рендеринга разрешения 1x1, к которой я собираюсь сделать предыдущий вывод рендеринга. Я попытался вывести результат на эту цель рендеринга, используя простой вызов SpriteBatch Draw и использование целевого прямоугольника. Однако было слишком много надежд на то, что я обнаружил бы что-то, о чем никто не думал, результат этого не был на самом деле целым сценами, сбрасываемыми на 1x1 текстуру, кажется, что рисовался только верхний левый пиксель, независимо от того, насколько я играл с целевыми прямоугольниками или перегрузками масштаба.
Теперь я пытаюсь выполнить другой шаг рендеринга экрана-квадрата, используя технику шейдера, чтобы пробовать сцену и отображать один пиксель в цель рендеринга. Поэтому, чтобы быть справедливым, название немного вводит в заблуждение, что я пытаюсь сделать, это образец сетки пикселей, равномерно распределенных по поверхности, и средний результат. Но здесь я в тупике.
Я пришел через этот учебник: http://www.xnainfo.com/content.php?content=28
В файле, который может быть загружен, есть несколько примеров субдискретизации и тот, который мне нравится больше всего, используя цикл, который проходит через 16 пикселей, средние их и возвращает это.
Ничего из того, что я до сих пор не смог создать жизнеспособный выход. Текстура с пониженной выборкой отображается в угол моего экрана для целей отладки.
Я изменил код HLSL, чтобы выглядеть следующим образом:
pixelShaderStruct vertShader(vertexShaderStruct input)
{
pixelShaderStruct output;
output.position = float4(input.pos, 1);
output.texCoord = input.texCoord + 0.5f;
return output;
};
float4 PixelShaderFunction(pixelShaderStruct input) : COLOR0
{
float4 color = 0;
float2 position = input.texCoord;
for(int x = 0; x < 4; x++)
{
for (int y = 0; y < 4; y++)
{
color += tex2D(getscene, position + float2(offsets[x], offsets[y]));
}
}
color /= 16;
return color;
}
Эта специфическая линия здесь, где я полагаю, что я делаю ошибку:
color += tex2D(getscene, position + float2(offsets[x], offsets[y]));
Я никогда не правильно понял, как значения texCoord, используемые в выборке tex2D
, работают. При создании эффекта размытия движения мне приходилось пересылать такие значения бесконечности, которые я боялся, что он будет округлен до нуля, чтобы произвести нормальный эффект, в то время как в других случаях пересылка больших значений, таких как 30 и 50, была необходима для производят эффекты, которые занимают, возможно, треть экрана.
Так или иначе, мой вопрос:
Учитывая квад экрана (так, плоская поверхность), как я увеличить или изменить texCoord
значения иметь сетку пикселей, равномерно распространиться, отобранную через него?
Я попытался с помощью:
color += tex2D(getscene, position + float2(offsets[x] * (1/maxX), offsets[y] * (1/maxY)));
Где Maxx и MAXY являются разрешение экрана,
color += tex2D(getscene, position + float2(offsets[x] * x, offsets[y] * y));
... и другие "снимки в темноте", и все результаты оказались быть то же: конечный результирующий пиксель, похоже, идентичен таковому в середине моего экрана, как будто это единственный выбор.
Как это решить?
Также, как работают эти координаты текстуры? Где (0,0)? Какой максимум?
Спасибо всем заранее.
Это имеет смысл, на самом деле я собирался об идеальном решении, как это, но как только я решаю фактическую выборку. Как вы предлагаете мне решить это? – Eudaimonium