请教高手,皮肤材质的问题

Bobby136 2006-03-05 11:29:02
GUP Gems里面Dawn的材质有些地方,不是很理解,望高人不吝赐教

OUT.SkinSilhouetteVec = float4(objectNormal.w,
oneMinusVdotN * oneMinusVdotN,
oneMinusVdotN,
vecMul(G_DappleXf, worldNormal.xyz).z);

1.objectNormal.w ,我们一般的法线只有xyz ,这个w(环境遮挡?)如何计算得到?
2.G_DappleXf这个立方体映射矩阵如何得到?
...全文
151 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
xyz 2006-03-22
  • 打赏
  • 举报
回复
UP
UPUP
UPUP
UPUP
UPUP
UPUP
UPUP
UPUP
UP
Bobby136 2006-03-22
  • 打赏
  • 举报
回复
谢谢楼上,下面是相关的章节的连接
http://download.nvidia.com/developer/GPU_Gems_2/CD/Resources/Chapter_3.pdf

这个程序的其他地方都不难理解,也没有涉及到什么开发包,就是用的cg语言,可以转化成hlsl

里面的变形动画部分可以不需理会,其他的都是顶点数据
const uniform float4 GlobalCamPos, 眼睛位置
const uniform float4x4 ViewXf, view矩阵
const uniform float4x4 G_DappleXf, ???
const uniform float4x4 ProjXf) proj矩阵
寻开心 2006-03-21
  • 打赏
  • 举报
回复
要回答你的问题,需要对GUP Gems内容非常熟悉
这个不是一个一般的三维技术问题
而是专用的平台或者开发包的使用问题
需要有相关经验的人来问
最好到其自身的论坛当中去讨论
或者你对其中的一些函数和变量的结构和用法作出先期的说明解释
Bobby136 2006-03-08
  • 打赏
  • 举报
回复
float4 faceFragmentShader(v2fConnector IN,
uniform sampler2D SkinColorFrontSpecMap,
uniform sampler2D SkinNormSideSpecMap, // xyz normal map
uniform sampler2D SpecularColorShiftMap, // and spec map in "w"
uniform samplerCUBE DiffuseCubeMap,
uniform samplerCUBE SpecularCubeMap,
uniform samplerCUBE HilightCubeMap) : COLOR
{
half4 normSideSpec tex2D(SkinNormSideSpecMap,
IN.SkinUVST.xy);
half3 worldNormal;
worldNormal.x = dot(normSideSpec.xyz, IN.WorldTanMatrixX);
worldNormal.y = dot(normSideSpec.xyz, IN.WorldTanMatrixY);
worldNormal.z = dot(normSideSpec.xyz, IN.WorldTanMatrixZ);
fixed nDotV = dot(IN.WorldEyeDir, worldNormal);
half4 skinColor = tex2D(SkinColorFrontSpecMap, IN.SkinUVST.xy);
fixed3 diffuse = skinColor * texCUBE(DiffuseCubeMap, worldNormal);
diffuse = diffuse * IN.SkinSilhouetteVec.x;
fixed4 sideSpec = normSideSpec.w * texCUBE(SpecularCubeMap,
worldNormal);
fixed3 result = diffuse * IN.SkinSilhouetteVec.y + sideSpec;
fixed3 hilite = 0.7 * IN.SkinSilhouetteVec.x *
IN.SkinSilhouetteVec.y *
texCUBE(HilightCubeMap, IN.WorldEyeDir);
fixed reflVect = IN.WorldEyeDir * nDotV – (worldNormal * 2.0x);
fixed4 reflColor = IN.SkinSilhouetteVec.w *
texCUBE(SpecularCubeMap, reflVect);
result += (reflColor.xyz * 0.02);
fixed hiLightAttenuator = tex2D(SpecularColorShiftMap,
IN.SkinUVST.xy).x;
result += (hilite * hiLightAttenuator);
fixed haze = reflColor.w * hiLightAttenuator;
return float4(result.xyz, haze);
}
Bobby136 2006-03-08
  • 打赏
  • 举报
回复
float3 vecMul(const float4x4 matrix, const float3 vec)
{
return(float3(dot(vec, matrix._11_12_13),
dot(vec, matrix._21_22_23),
dot(vec, matrix._31_32_33)));
}

v2fConnector faceVertexShader(a2vConnector IN,
const uniform float MorphWeight0,
const uniform float MorphWeight1,
const uniform float MorphWeight2,
const uniform float MorphWeight3,
const uniform float MorphWeight4,
const uniform float4x4 BoneXf[8],
const uniform float4 GlobalCamPos,
const uniform float4x4 ViewXf,
const uniform float4x4 G_DappleXf,
const uniform float4x4 ProjXf)
{
v2fConnector OUT;

float4 objectCoord = IN.coord;
objectCoord.xyz += (MorphWeight0 * IN.coordMorph0);
objectCoord.xyz += (MorphWeight1 * IN.coordMorph1);
objectCoord.xyz += (MorphWeight2 * IN.coordMorph2);
objectCoord.xyz += (MorphWeight3 * IN.coordMorph3);
objectCoord.xyz += (MorphWeight4 * IN.coordMorph4);

float4 worldCoord = IN.boneWeight0_3.x *
mul(BoneXf[IN.boneIndex0_3.x], objectCoord);
worldCoord += (IN.boneWeight0_3.y *
mul(BoneXf[IN.boneIndex0_3.y], objectCoord));
worldCoord += (IN.boneWeight0_3.z *
mul(BoneXf[IN.boneIndex0_3.z], objectCoord));
worldCoord += (IN.boneWeight0_3.w *
mul(BoneXf[IN.boneIndex0_3.w], objectCoord));

float4 objectNormal = IN.normal;
objectNormal += (MorphWeight0 * IN.normalMorph0);
objectNormal += (MorphWeight1 * IN.normalMorph1);
objectNormal += (MorphWeight2 * IN.normalMorph2);
objectNormal += (MorphWeight3 * IN.normalMorph3);
objectNormal += (MorphWeight4 * IN.normalMorph4);
objectNormal.xyz = normalize(objectNormal.xyz);
float3 worldNormal = IN.boneWeight0_3.x *
vecMul(BoneXf[IN.boneIndex0_3.x],
objectNormal.xyz));

worldNormal += (IN.boneWeight0_3.y *
vecMul(BoneXf[IN.boneIndex0_3.y],
objectNormal.xyz));
worldNormal += (IN.boneWeight0_3.z *
vecMul(BoneXf[IN.boneIndex0_3.z],
objectNormal.xyz));
worldNormal += (IN.boneWeight0_3.w *
vecMul(BoneXf[IN.boneIndex0_3.w],
objectNormal.xyz));
worldNormal = normalize(worldNormal);

float4 objectTangent = IN.tangent;
objectTangent.xyz = normalize(objectTangent.xyz -
dot(objectTangent.xyz,
objectNormal.xyz) *
objectNormal.xyz);
float4 worldTangent;
worldTangent.xyz = IN.boneWeight0_3.x *
vecMul(BoneXf[IN.boneIndex0_3.x],
objectTangent.xyz);
worldTangent.xyz += (IN.boneWeight0_3.y *
vecMul(BoneXf[IN.boneIndex0_3.y],
objectTangent.xyz));
worldTangent.xyz += (IN.boneWeight0_3.z *
vecMul(BoneXf[IN.boneIndex0_3.z],
objectTangent.xyz));
worldTangent.xyz += (IN.boneWeight0_3.w *
vecMul(BoneXf[IN.boneIndex0_3.w],
objectTangent.xyz));
worldTangent.xyz = normalize(worldTangent.xyz);
worldTangent.w = objectTangent.w;

float3 worldBinormal = worldTangent.w *
normalize(cross(worldNormal,
worldTangent.xyz));
OUT.WorldTanMatrixX = float3(worldTangent.x,
worldBinormal.x, worldNormal.x);
OUT.WorldTanMatrixY = float3(worldTangent.y,
worldBinormal.y, worldNormal.y);
OUT.WorldTanMatrixZ = float3(worldTangent.z,
worldBinormal.z, worldNormal.z);

float4 worldEyePos = GlobalCamPos;
OUT.WorldEyeDir = normalize(worldCoord.xyz - worldEyePos.xyz);
float4 eyespaceEyePos = {0.0f, 0.0f, 0.0f, 1.0f};
float4 eyespaceCoord = mul(ViewXf, worldCoord);
float3 eyespaceEyeVec = normalize(eyespaceEyePos.xyz –
eyespaceCoord.xyz);
float3 eyespaceNormal = vecMul(ViewXf, worldNormal);
float VdotN = abs(dot(eyespaceEyeVec, eyespaceNormal));
float oneMinusVdotN = 1.0 - VdotN;
OUT.SkinUVST = IN.skinColor_frontSpec;
OUT.SkinSilhouetteVec = float4(objectNormal.w,
oneMinusVdotN * oneMinusVdotN,
oneMinusVdotN,
vecMul(G_DappleXf, worldNormal.xyz).z);
float4 hpos = mul(ProjXf, eyespaceCoord);
OUT.HPOS = hpos;
return OUT;
}
Bobby136 2006-03-08
  • 打赏
  • 举报
回复
这整个程序的代码

struct a2vConnector {
float4 coord; // 3D location
float4 normal;
float4 tangent;
float3 coordMorph0; // 3D offset to target 0
float4 normalMorph0; // matching offset
float3 coordMorph1; // 3D offset to target 1
float4 normalMorph1; // matching offset
float3 coordMorph2; // 3D offset to target 2
float4 normalMorph2; // matching offset
float3 coordMorph3; // 3D offset to target 3
float4 normalMorph3; // matching offset
float3 coordMorph4; // 3D offset to target 4
float4 normalMorph4; // matching offset
float4 boneWeight0_3; // skull and neck bone
float4 boneIndex0_3; // indices and weights
float4 skinColor_frontSpec; // UV indices
};

struct v2fConnector {
float4 HPOS : POSITION;
float4 SkinUVST : TEXCOORD0;
float3 WorldEyeDir : TEXCOORD2;
float4 SkinSilhouetteVec : TEXCOORD3;
float3 WorldTanMatrixX : TEXCOORD5;
float3 WorldTanMatrixY : TEXCOORD6;
float3 WorldTanMatrixZ : TEXCOORD7;
};

8,303

社区成员

发帖
与我相关
我的任务
社区描述
游戏开发相关内容讨论专区
社区管理员
  • 游戏开发
  • 呆呆敲代码的小Y
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧