Тема: Stage3D Генерация ShadowMap.
Показать сообщение отдельно
Старый 21.01.2016, 21:51
Alex Lexcuk вне форума Посмотреть профиль Отправить личное сообщение для Alex Lexcuk Посетить домашнюю страницу Alex Lexcuk Найти все сообщения от Alex Lexcuk
  № 9  
Ответить с цитированием
Alex Lexcuk

блогер
Регистрация: Mar 2008
Адрес: Донецк_city
Сообщений: 1,094
Записей в блоге: 5
Тут разжевано
http://www.kirupa.com/forum/showthre...l-thread/page9
Код AS3:
/*
*    v0 = Pixel Position in Lights Clip Space
*   fc0 = [zFar,1.0,1.0,1.0]
*    fc1 = [1.0,255.0,65025.0,16581375.0]
*   fc2 = [(1.0/255.0),(1.0/255.0),(1.0/255.0),0.0]
*/
 
depthPassFragmentShader = new AGALMiniAssembler()
depthPassFragmentShader.assemble(Context3DProgramType.FRAGMENT,                                                                         
                                 "div ft0 v0.z fc0.x \n" +         //FT0 Ranges From 0 to 1 and its the depth of the pixel from the light                                     
                                 "mul ft0 ft0 fc1 \n" +         //FT0 = [FT0,255*FT0,(255^2)*FT0,(255^3)*FT0] for encoding 32 bit floating point into RGBA
                                 "frc ft0 ft0 \n" +             //FT0 = [f(FT0),f(255*FT0), f((255^2)*FT0), f((255^3)*FT0)] where f(number) = number - floor(number)
                                 "mul ft1 ft0.yzww fc2 \n" +     //FT1 = [(f(255*FT0))/255.0, (f((255^2)*FT0))/255.0, (f((255^3)*FT0))/255.0, 0.0]
                                 "sub ft0 ft0 ft1 \n" +         //FT0 = [f(FT0) - ((f(255*FT0))/255.0), f(255*FT0) - ((f((255^2)*FT0))/255.0), f((255^2)*FT0) -  ((f((255^3)*FT0))/255.0), f((255^3)*FT0)]
                                 "mov oc ft0 \n" 
                                 )
Так понятней будет, что там в регистрах находится.
div деление
mul умножение
frc похоже на как-бы остаток деления (не может быть больше 1 естественно)
sub вычитание
итого глубина кодируется в серо-синий с преобладанием все-же серого цвет, а потом достается снова как-то так
Код AS3:
/*
* v0 = Pixel Position In Lights Screen Space
* v1 = Pixel Position In World Space
* v2 = Vertex Normals
* v3 = Vertex UV's
* FC0 = [zFar,1.0,0.5,(-(blurSamples/2.0))]
* FC1 = [1.0,1.0,1.0,(1.0/2048.0)]
* FC2 = [1.0,(1.0/255.0),(1.0/65025.0),(1.0/16581375.0)]
* FC3 = [depthComparisonThreshold,blurSamples,shadowAlpha,0.0]
* FC4 = [lightPosition.x,lightPosition.y,lightPosition.z,0.0]
*/
 
var loopAssembly:String = ""
for ( var i:int = -(blurSamples/2.0); i < (blurSamples/2.0); i++){
    loopAssembly += "tex ft3 ft2.xy fs0<2d,wrap,linear> \n" + 
                    "dp4 ft3 ft3 fc2 \n" + 
                    "sub ft3 ft3 ft0 \n" + 
                    "sge ft4 ft3 fc3.x \n" +
                    "add ft5 ft5 ft4 \n" +                                                            
                    "add ft2.x ft2.x fc1.w \n"
}
__________________
Гоночка