На първо място, бих искал да ви предложа да разгледате по-задълбочено конвейера за рендиране и значението на вертексните шейдъри и пикселните шейдъри. Не ми се сърдете, но изглежда, че трябва малко по-основно разбиране за тази тема.
Ще се опитам да дам бърз преглед на вашия проблем: няма да постигнете добър кръг в шейдъра на върховете, освен че ще направите много теселна геометрия. Имате нужда от пикселния шейдър, за да получите вашата сфера с нормали.
Какво се случва във вертекс шейдъра?
Това е основният проблем тук: Vertex Shader трансформира вашата дадена геометрия, така че може да бъде растеризирана, за да рендира пиксели на вашия екран. Растеризаторът ще вземе получените триъгълници и ще генерира пиксел за всеки пиксел, който триъгълникът обхваща на екрана. Този пиксел ще бъде обработен от pixelshader и полученият цвят ще бъде показан. За данните, които всеки пиксел носи, растеризаторът интерполира данните за върха на трите ъгъла, така че всеки пиксел има свои собствени позиционно зависими данни. Това си е твой проблем.
Ако попълните вашите върхове с данните за окръжността, тези четири точки получават там картографиране към окръжността и ще бъдат линейно интерполирани за другите точки между тях, но една окръжност не може да бъде описана линейно по този начин. Малко изображение за пояснение:
Както виждате, координатите на четирите ъгъла на текстурата са нанесени на координати на кръг. Те лежат отвън, така че тяхната y-височина ще бъде нанесена на нула. Сега тези четири точки са интерполирани за пикселния шейдър, което води до още по-нулева височина и липса на реален кръг. Всяка интерполация във vertexshader завършва с нещо ромбично, ако разделите своя квадрат веднъж, ще получите ромб, ако го разделяте все повече и повече, той ще се доближи до кръг, но никога няма да бъде перфектен.
Следователно имате нужда от пикселен шейдър. Така че всеки пиксел получава своята интерполирана позиция, за да определи правилната норма на сферата вместо грешни интерполирани нормали.
Поради този проблем най-модерните изчисления за осветление се правят в пикселния шейдър. Особено за огледалното осветление е от съществено значение да се получат фини и прецизни акценти.
Надявам се, че обяснението ми беше лесно за разбиране :)
person
Gnietschow
schedule
12.06.2015