Показать сообщение отдельно
Старый 03.07.2011, 18:45   #124
dsd
Мастер
 
Аватар для dsd
 
Регистрация: 13.06.2011
Сообщений: 1,103
Написано 481 полезных сообщений
(для 1,836 пользователей)
Ответ: Имитация водной поверхности.

Написал первый порношейдер методом... В общем, неправильным методом . Делает он следующее рисует текстуру и все. Потом мне захотелось добавить функциональности в вершинный шейдер, сделал ввод переменной из хорса в шейдер. Далее решил умножить координаты вертексов на синус от введенной переменной.

//Матрицы
//xSetEffectMatrixSemantic tModel,"MatWorldViewProj",WORLDVIEWPROJ
//xSetEffectMatrixSemantic tModel,"MatWorld",WORLD
float4x4 MatWorldViewProj;
float4x4 MatWorld;

// вношу время из хорса
float time;

// Объявление переменных в данном случае вывод пиксельного шейдера
static float3 Color;
static 
float4 cD;

//Передача тестуры в шейдер
//xSetEffectTexture tModel,    "InShaderTextureName",texDiffuse
const texture InShaderTextureName;            
sampler TexDiffuse=sampler_state //тут я говорю что текстура Diffuse типа
    
Texture   = <InShaderTextureName>;
   };


//######  Ввод в вершинный шейдер  ##################
struct VertexShaderInput {
   
float4 Position POSITION0;     // мировая позиция вершины
   
float3 Normal NORMAL;            // нормаль к этой вершине
   
float2 TexCoords TEXCOORD0;     // координаты точки на текстуре
};
//#  Вывод вершинного шейдера = ввод пиксельного  ###
struct PixelShaderInput {
    
float4 Position POSITION0;    //новая мировая позиция вершины
    
float4 pWorld TEXCOORD0;
    
float3 Normal TEXCOORD1;
    
float2 TexCoords TEXCOORD2;
};


//вершинный шейдер
void NameOfVertexShaderFunctionin VertexShaderInput INout PixelShaderInput OUT ) {
    
//OUT.Position    = mul((mul(IN.Position,MatWorldViewProj)),cos(time));
    
[b]OUT.Position    mul(IN.Position,MatWorldViewProj)*cos(time);[/b]
    
OUT.pWorld        mul(IN.Position,MatWorld);
    
OUT.Normal        normalize(mul(IN.Normal,MatWorld));
    
OUT.TexCoords    IN.TexCoords;
}

//пиксельный шейдер
float4 NameOfPixelShaderin PixelShaderInput IN ) : COLOR {
    
cD            tex2D(TexDiffuse,IN.TexCoords);
    
Color        cD.rgb;    
    return 
float4(Color,cD.a);
}


//##################  Technique  ##################
// здесь расположен проход этот кусок заставляет исполняться шейдер
//xSetEffectTechnique tModel,"TechniqueName"
technique TechniqueName {
    
pass p0 //проход рендера их может быть несколько с разными шейдерами
        
AlphaBlendEnablefalse;
        
vertexshader    compile vs_2_0 NameOfVertexShaderFunction(); 
        
pixelshader        compile ps_2_0 NameOfPixelShader();
    }

Но вместо плавного морфинга получилось моргание меша, на который применен мой чудо шейдер, это от того что в float4 Position : POSITION0; есть еще и W и умножение на синус и дает такой чудный эффект моргания?
(Offline)
 
Ответить с цитированием
Сообщение было полезно следующим пользователям:
Program23 (03.07.2011)