J.C. Lelterman в книге "Learn Vertex and Pixel Shaders" пишет о использовании инструкции dst:
dst: Distance vector
dst Dst, aSrc, bSrc
This instruction calculates the distance between the source aSrc
and the source bSrc and stores the result in the destination Dst.
...
Pseudocode:
dx=1.0 dy=ayby dz=az dw=bw
Vertex Shader:
// Find the distance from v1 to the origin {0,0,0} mov r1.xyz, v1.xyz // vec = {xyz#} Position dp3 r1.yz, r1, r1 // d={##yz} = sum of squares rsq r2.y, r1.y // {# # 1/ d #} rcp r2.yw, r2.y // { d d # #} = 1/(1/ d) dst r0,r1,r2 // = r1#yz# r2#yw#
MSDN также пишет:
The first source operand (src0) is assumed to be the vector (ignored, d*d, d*d, ignored) and the second source operand (src1) is assumed to be the vector (ignored, 1/d, ignored, 1/d). The destination (dest) is the result vector (1, d, d*d, 1/d).
Но о какой "distance" идёт речь, и что на самом деле выполняет инструкция dst? Если dst рассчитывает расстояние между двумя точками в трехмерном пространстве, то почему ожидаемые параметры aSrc и bSrc, не содержат самих координат первой и второй точки?
Не проще ли рассчитать расстояние между точками как-то так?
;... def c20, 3.3f, 3.4f, 3.5f, 1.0f def c21, 3.4f, 3.5f, 3.6f, 1.0f add r0, c21, -c20 dp3 r1.y, r0, r0 rsq r0.y, r1.y rcp r0.w. r0.y ;...
Зачем тебе шейдерный ассемблер? Пиши на нормальном С.
kvakvs
ну вообще-то есть и HLSL интринсик
Maeglin
это скорее всего тяжкое наследство от SM1.0
на ум приходит заюзать её только для расчёта attenuation
kvakvs
> Зачем тебе шейдерный ассемблер?
Потому что существует некоторое количество унаследованного кода на ассемблере, в ShaderX и многих других источниках.
_ShaMan_
> на ум приходит заюзать её только для расчёта attenuation
Действительно, эту инструкцию можно использовать для расчета Light intensity :-)
Тема в архиве.