Прежде всего, я хотел бы предложить вам глубже изучить рендерпайплайн и значения вершинных и пиксельных шейдеров. Не сердитесь на меня, но, похоже, вам нужно более базовое понимание этой темы.
Я попытаюсь дать краткий обзор вашей проблемы: вы не добьетесь хорошего круга в вершинном шейдере, за исключением того, что вы сильно разметите свою геометрию. Вам нужен пиксельный шейдер, чтобы получить вашу сферу с нормалями.
Что происходит внутри вершинного шейдера?
Это главная проблема здесь: вершинный шейдер преобразует заданную вами геометрию, поэтому ее можно растрировать для рендеринга пикселей на экране. Растеризатор возьмет получившиеся треугольники и сгенерирует пиксель для каждого пикселя, заключенного треугольником на экране. Этот пиксель будет обработан пиксельным шейдером, и отобразится результирующий цвет. Для данных, которые несет каждый пиксель, растеризатор интерполирует данные вершин трех углов, поэтому каждый пиксель имеет свои собственные данные, зависящие от положения. Это твоя проблема.
Если вы заполните свои вершины данными круга, эти четыре точки получат сопоставление с кругом и будут линейно интерполированы для других точек между ними, но круг не может быть описан линейным таким образом. Небольшое изображение для пояснения:
![введите здесь описание изображения](https://i.stack.imgur.com/1W6e9.jpg)
Как вы видите, координаты текстуры четырех углов сопоставляются с координатами круга. Они лежат снаружи, поэтому их высота по оси Y будет равна нулю. Теперь эти четыре точки интерполируются для пиксельного шейдера, что приводит к еще большей нулевой высоте и отсутствию реального круга. Каждая интерполяция в вершинном шейдере заканчивается чем-то ромбическим, если вы разделите свой четырехугольник один раз, вы получите ромб, если вы будете разбивать его все больше и больше, он будет приближаться к кругу, но никогда не будет идеальным.
Поэтому вам нужен пиксельный шейдер. Таким образом, каждый пиксель получает свою интерполированную позицию для определения правильной нормали сферы вместо неправильных интерполированных нормалей.
![введите здесь описание изображения](https://i.stack.imgur.com/hdIGK.jpg)
Из-за этой проблемы самые современные расчеты освещения выполняются в пиксельных шейдерах. Особенно для зеркального освещения важно получить тонкие и точные блики.
Надеюсь, мое объяснение было легко понять :)
person
Gnietschow
schedule
12.06.2015