Войти
ПрограммированиеФорумГрафика

Зачем нужна инструкция dst?

#0
6:59, 30 июля 2010

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
;...
#1
10:47, 30 июля 2010

Зачем тебе шейдерный ассемблер? Пиши на нормальном С.

#2
11:18, 30 июля 2010

kvakvs
ну вообще-то есть и HLSL интринсик

Maeglin
это скорее всего тяжкое наследство от SM1.0
на ум приходит заюзать её только для расчёта attenuation

#3
20:11, 30 июля 2010

kvakvs
> Зачем тебе шейдерный ассемблер?
Потому что существует некоторое количество унаследованного кода на ассемблере, в ShaderX и многих других источниках.

_ShaMan_
> на ум приходит заюзать её только для расчёта attenuation
Действительно, эту инструкцию можно использовать для расчета Light intensity :-)

ПрограммированиеФорумГрафика

Тема в архиве.