加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c – HLSL中的镜面反射

发布时间:2020-12-16 09:54:58 所属栏目:百科 来源:网络整理
导读:我试图了解HLSL和DirectX11中的镜面反射 cbuffer ConstantBuffer : register( b0 ){ matrix World; // Матрица мира matrix View; // Матрица вида matrix Projection; // Матрица проекции float4 vLightDir[3]; // D
我试图了解HLSL和DirectX11中的镜面反射

cbuffer ConstantBuffer : register( b0 )
{
    matrix World;           // Матрица мира
    matrix View;            // Матрица вида
    matrix Projection;      // Матрица проекции
    float4 vLightDir[3];    // Dir of light
    float4 vLightColor[3];  // color of light
    float4 vOutputColor;    // Active color
    //float3 Eye;
}

struct VS_INPUT                 // Входящие данные вершинного шейдера
{
    float4 Pos : POSITION;      // Позиция по X,Y,Z
    float3 Norm : NORMAL;       // Нормаль по X,Z
};

struct PS_INPUT                 // Входящие данные пиксельного шейдера
{
    float4 Pos : SV_POSITION;   // Позиция пикселя в проекции (экранная)
    float3 Norm : TEXCOORD0;    // Относительная нормаль пикселя по tu,tv
};


PS_INPUT VS( VS_INPUT input )
{
    PS_INPUT output = (PS_INPUT)0;
    output.Pos = mul( input.Pos,World );
    output.Pos = mul( output.Pos,View );
    output.Pos = mul( output.Pos,Projection );
    output.Norm = mul( input.Norm,World );

    return output;
}


float4 Diffuse( PS_INPUT input) : SV_Target
{
    float4 diffuse = float4(1.0,1.0,1.0);
    float4 finalColor = diffuse *0.1;

    // Adding all light colours
    for(int i=0; i<3; i++)
    {
        finalColor += saturate( dot( (float3)vLightDir[i],input.Norm) * vLightColor[i] );
    }
    finalColor.a = 1;
    return finalColor;
}

float4 Specular(PS_INPUT input) : SV_Target
{   
    float4 diffuse = float4(1.0,0.0,1.0);
    float4 finalColor = diffuse *0.1;
    float3 Eye = float3(0.0f,4.0f,-20.0f);
    float4 intensity = 0.1;
    float power = 4;

    float3 R = reflect(-normalize(Eye),input.Norm);
    for (int i = 0; i < 3; i++)
    {
        finalColor += saturate(intensity * vLightColor[i] * pow(dot(R,Eye),power));
    }   
    return finalColor;
}


float4 PSSolid( PS_INPUT input) : SV_Target
{
    return vOutputColor;
}

现在我只有漫反射,镜面反射只显示白色立方体.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读