English | Italian | Mandarin | Japanese
TOC: Of Effects and Shaders
Back: Mr. Wiggle
Next: Vertex Data
Para los siguientes ejemplos usaremos Grid (EX9.Geometry) como input. Ajusta la resolución cerca de 50x50.
Crear una nueva coordenada z por medio de x e y.
Si usamos el ejemplo the MrWiggle example podemos escribir:
float2 Frequency = 10; float2 Phase = 0; float2 Amplitude = 0.01; vs2ps VS( float4 PosO : POSITION, float4 TexCd : TEXCOORD0) { //declara la estructura de salida vs2ps Out; //calcula dos ondas float2 wave = sin(PosO.xy * Frequency + Phase) * Amplitude; //ajusta la coordenada z PosO.z = wave.x + wave.y; //transforma la posición Out.Pos = mul(PosO, tWVP); //transforma las coordenadas de textura Out.TexCd = mul(TexCd, tTex); return Out; }
El patch así :
Otro modo común es calcular una posición completamente nueva a partir de las coordenadas xy de la grilla. Suele llamarse superficie paramétrica aquella cuyos parámetros de entrada xy son llamados uv.
Por ejemplo un cono:
x = v*cos(u) y = v*sin(u) z = v
puede ser escrito como función:
float3 Cone(float2 uv) { float u = uv.x; float v = uv.y; float3 newPos; newPos.x = v * cos(u); newPos.y = v * sin(u); newPos.z = v; return newPos; }
Podría ser útil escalar u por dos Pi para obtener un ciclo completo en el rango 0 .. 1, así como tener un desplazamiento general y de escala para los parámetros de entrada.. El vertex shader quedaría algo así:
#define twopi 6.28318531 float2 Scale = 1; float2 Offset = 0; float3 Cone(float2 uv) { uv *= Scale; uv += Offset; float u = uv.x * twopi; float v = uv.y; float3 newPos; newPos.x = v * cos(u); newPos.y = v * sin(u); newPos.z = v; return newPos; } vs2ps VS( float4 PosO : POSITION, float4 TexCd : TEXCOORD0) { //declara la estructura de salida vs2ps Out; //ajusta la nueva posición PosO.xyz = Cone(PosO.xy); //transforma la posición Out.Pos = mul(PosO, tWVP); //transforma las coordenadas de textura Out.TexCd = mul(TexCd, tTex); return Out; }
Y el patch:
anonymous user login
~2d ago
~2d ago
~10d ago
~12d ago
~13d ago
~17d ago
~17d ago
~24d ago
~1mth ago
~1mth ago