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; } 现在我只有漫反射,镜面反射只显示白色立方体. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |