Xna 显示模型纹理
我已经问了一个问题,但没有任何回应,所以我想我应该问一下这里的大师 是否可以让模型显示其纹理而不是该项目输出的灰度 代码可以在这个页面上找到 编辑Xna 显示模型纹理,xna,Xna,我已经问了一个问题,但没有任何回应,所以我想我应该问一下这里的大师 是否可以让模型显示其纹理而不是该项目输出的灰度 代码可以在这个页面上找到 编辑 我已经上传了源代码,因为我仍然无法让它正常工作。有人能帮忙吗?我只是快速查看了一下着色器代码,我怀疑像素着色器没有使用任何类型的纹理 // Calculates the contribution for a single light source using phong lighting float3 CalcLighting ( float3
我已经上传了源代码,因为我仍然无法让它正常工作。有人能帮忙吗?我只是快速查看了一下着色器代码,我怀疑像素着色器没有使用任何类型的纹理
// Calculates the contribution for a single light source using phong lighting
float3 CalcLighting ( float3 vDiffuseAlbedo,
float3 vSpecularAlbedo,
float fSpecularPower,
float3 vLightColor,
float3 vNormal,
float3 vLightDir,
float3 vViewDir )
{
float3 R = normalize(reflect(-vLightDir, vNormal));
// Calculate the raw lighting terms
float fDiffuseReflectance = saturate(dot(vNormal, vLightDir));
float fSpecularReflectance = saturate(dot(R, vViewDir));
// Modulate the lighting terms based on the material colors, and the attenuation factor
float3 vSpecular = vSpecularAlbedo * vLightColor * pow(fSpecularReflectance, fSpecularPower);
float3 vDiffuse = vDiffuseAlbedo * vLightColor * fDiffuseReflectance;
// Lighting contribution is the sum of the diffuse and specular terms
return vDiffuse + vSpecular;
}
正如您所看到的,纹理没有被反射,漫反射是作为各种其他变量的组合计算的
这几乎肯定是为了降低代码的复杂性,但是添加对纹理的支持应该是相当简单的。您应该查看的底部的像素和顶点着色器,以了解如何在着色器中使用纹理,并将其与CalcLighting()函数集成
您需要自己在代码中设置模型纹理,以便着色器看到它。我记不清确切的语法,但大致如下:
effect.SetTexture("texture_name", texture);
是您要查找的,其中“texture_name”是您在着色器文件中声明的类型纹理的名称
你需要考虑的另一件事是重新编写CalcLyTIN所需的参数,你需要从顶点着色器中传递纹理坐标,你可以移除VoffiSaleBoDo,因为它可以被纹理的颜色所替代。 遗憾的是,如果没有实际编写代码(并且我目前无法访问XNA安装),我无法使答案更彻底,请考虑这些指针并尝试找到一个教程,用于使用着色器加载纹理模型。因为您似乎对使用自定义着色器感兴趣,所以避免教程讨论BasicFect,因为BasicFect几乎隐藏了所有相关的着色器代码,您不会学到任何东西
我很难推荐你们可以从中学习的教程,因为网上有很多教程,每一个都让别人喜欢。因此,请记住我所说的,请随意查找一个您熟悉的教程,其中解释了如何加载和正确渲染纹理模型,然后使用这些知识将其应用于此示例。这真的不像一开始看起来那么难 刚刚为您对示例代码进行了快速的“n”脏修改,它应该可以很好地演示着色器中的纹理映射 我在model.fx中添加了一个纹理变量,通过代码设置该变量,使其绘制纹理而不是白色,并确保顶点着色器将顶点的纹理坐标传递给像素着色器。请记住,我故意打破了照明计算,以简化纹理采样器的紫色//=========================================================================
//
// DeferredShadowMaps
//
// by MJP (mpettineo@gmail.com)
// 12/14/08
//
//=========================================================================
//
// File: Model.fx
//
// Desc: Outputs the lighting contribution for a single directional
// light source. Also samples shadow occlusion from a texture.
//
//=========================================================================
float4x4 g_matWorld;
float4x4 g_matViewProj;
float4x4 g_matWorldIT;
float2 g_vRTDimensions;
float3 g_vDiffuseAlbedo = {0.5f, 0.5f, 0.5f};
float3 g_vSpecularAlbedo = {1.0f, 1.0f, 1.0f};
float g_fSpecularPower = 32.0f;
float3 g_vLightDirectionWS;
float3 g_vLightColor;
float3 g_vAmbientColor;
float3 g_vCameraPositionWS;
texture ShadowOcclusion;
sampler2D ShadowOcclusionSampler = sampler_state
{
Texture = <ShadowOcclusion>;
MinFilter = Point;
MagFilter = Point;
MipFilter = Point;
};
texture ModelTexture;
sampler2D ModelSampler = sampler_state
{
Texture = <ModelTexture>;
MinFilter = Linear;
MagFilter = Linear;
MipFilter = Linear;
};
void ModelVS( in float4 in_vPositionOS : POSITION,
in float3 in_vNormalOS : NORMAL,
in float2 in_vTexCoord : TEXCOORD0,
out float4 out_vPositionCS : POSITION,
out float3 out_vNormalWS : TEXCOORD0,
out float3 out_vPositionWS : TEXCOORD1,
out float4 out_vPositionCS2 : TEXCOORD2,
out float2 out_vTexCoord : TEXCOORD3 )
{
// Figure out the position of the vertex in world space, and clip space
out_vPositionWS = mul(in_vPositionOS, g_matWorld).xyz;
out_vPositionCS = mul(float4(out_vPositionWS, 1), g_matViewProj);
// Rotate the normal so it's in world space
out_vNormalWS = mul(in_vNormalOS, g_matWorldIT);
// Also store the clip-space position in a TEXCOORD, since we can't
// read from the POSITION register in the pixel shader.
out_vPositionCS2 = out_vPositionCS;
// Pass out the texture coordinates to the pixel shader
out_vTexCoord = in_vTexCoord;
}
// Calculates the contribution for a single light source using phong lighting
float3 CalcLighting ( float3 vDiffuseAlbedo,
float3 vSpecularAlbedo,
float fSpecularPower,
float3 vLightColor,
float3 vNormal,
float3 vLightDir,
float3 vViewDir )
{
float3 R = normalize(reflect(-vLightDir, vNormal));
// Calculate the raw lighting terms
float fDiffuseReflectance = saturate(dot(vNormal, vLightDir));
float fSpecularReflectance = saturate(dot(R, vViewDir));
// Modulate the lighting terms based on the material colors, and the attenuation factor
float3 vSpecular = vSpecularAlbedo * vLightColor * pow(fSpecularReflectance, fSpecularPower);
float3 vDiffuse = vDiffuseAlbedo * vLightColor * fDiffuseReflectance;
// Lighting contribution is the sum of the diffuse and specular terms
return vDiffuse + vSpecular;
}
// Gets the screen-space texel coord from clip-space position
float2 CalcSSTexCoord (float4 vPositionCS)
{
float2 vSSTexCoord = vPositionCS.xy / vPositionCS.w;
vSSTexCoord = vSSTexCoord * 0.5f + 0.5f;
vSSTexCoord.y = 1.0f - vSSTexCoord.y;
vSSTexCoord += 0.5f / g_vRTDimensions;
return vSSTexCoord;
}
float4 ModelPS( in float3 in_vNormalWS : TEXCOORD0,
in float3 in_vPositionWS : TEXCOORD1,
in float4 in_vPositionCS : TEXCOORD2,
in float2 in_vTexCoord : TEXCOORD3) : COLOR0
{
// Sample the shadow term based on screen position
float2 vScreenCoord = CalcSSTexCoord(in_vPositionCS);
float fShadowTerm = tex2D(ShadowOcclusionSampler, vScreenCoord).r;
// Normalize after interpolation
float3 vNormalWS = normalize(in_vNormalWS);
float3 vLightDirWS = normalize(-g_vLightDirectionWS);
float3 vViewDirWS = normalize(g_vCameraPositionWS - in_vPositionWS);
// Calculate the lighting term for the directional light
float3 vLightContribition = 0;
vLightContribition = fShadowTerm * tex2D(ModelSampler, in_vTexCoord);
// Add in ambient term
vLightContribition.xyz += g_vDiffuseAlbedo * g_vAmbientColor;
return float4(vLightContribition, 1.0f);
}
technique Model
{
pass Pass1
{
VertexShader = compile vs_2_0 ModelVS();
PixelShader = compile ps_2_0 ModelPS();
ZEnable = true;
ZWriteEnable = true;
CullMode = CCW;
FillMode = Solid;
AlphaBlendEnable = false;
AlphaTestEnable = false;
}
}
//=========================================================================
//
//延迟阴影贴图
//
//MJP(mpettineo@gmail.com)
// 12/14/08
//
//=========================================================================
//
//文件:Model.fx
//
//Desc:输出单个方向的照明贡献
//光源。还对纹理中的阴影遮挡进行采样。
//
//=========================================================================
浮动4x4 g_matWorld;
浮动4x4 g_matViewProj;
漂浮式4x4克马托维特;
浮动2 g_VRT尺寸;
浮动3 g_vDiffuseAlbedo={0.5f,0.5f,0.5f};
float3 g_vSpecularAlbedo={1.0f,1.0f,1.0f};
浮子g_fSpecularPower=32.0f;
浮标3 g_vLightDirectionWS;
3 g_vLightColor;
浮动3 g_vAmbientColor;
浮动3 g_vCameraPositionWS;
纹理阴影遮挡;
sampler2D ShadowOcclusionSampler=采样器\ U状态
{
纹理=;
MinFilter=点;
磁过滤器=点;
MipFilter=点;
};
纹理模型纹理;
sampler2D ModelSampler=采样器\状态
{
纹理=;
MinFilter=线性;
磁滤波器=线性;
MipFilter=线性;
};
void ModelVS(浮动4中的位置:位置,
在浮动3中,在正常情况下:,
在TEXCOORD0中的float2中,
输出浮动4输出位置CS:位置,
out float3 out\u vNormalWS:TEXCOORD0,
out float3 out_vPositionWS:TEXCOORD1,
输出浮动4输出位置CS2:TEXCOORD2,
出浮点数2出浮点数:TEXCOORD3)
{
//计算出顶点在世界空间中的位置,并剪裁空间
out_vPositionWS=mul(in_vPositionOS,g_matWorld).xyz;
out_vPositionCS=mul(float4(out_vPositionWS,1),g_matViewProj);
//旋转法线,使其位于世界空间中
out_vNormalWS=mul(in_vNormalOS,g_matWorldIT);
//还可以将剪辑空间位置存储在TEXCOORD中,因为我们无法
//从像素着色器中的位置寄存器读取。
out_vPositionCS2=out_vPositionCS;
//将纹理坐标传递给像素着色器
out_vTexCoord=in_vTexCoord;
}
//使用phong照明计算单个光源的贡献
浮动3计算照明(浮动3 vDiffuseAlbedo,
浮体3 V特殊情况下,
浮动fSpecularPower,
float3 vLightColor,
浮动3 V正常,
float3 vLightDir,
浮动3(vViewDir)
{
float3 R=标准化(反射(-vLightDir,vNormal));
//计算原始照明条件
浮点FDiffUserReflection=饱和(点(vNormal,vLightDir));
float fSpecularReflectance=饱和(点(R,vViewDir));
//根据材质颜色和衰减因子调整照明条件
float3 vSpeccular=vSpeccularBedo*vLightColor*pow(fsSpeccularReflectance,fsSpeccularPower);
float3 vDiffuse=vDiffuseAlbedo*vLightColor*fdiffusereflection;
//照明贡献
// Loads the texture here (note this is put here for the skae of simplicity, the texture should generally be retrieved from the model)
Texture texture = Content.Load<Texture>("Models/Beast_1");
// Begin the Effect
modelEffect.Begin();
modelEffect.CurrentTechnique.Passes[0].Begin();
// Draw the models
foreach (ModelInstance modelInstance in modelList)
{
modelEffect.Parameters["ModelTexture"].SetValue(texture);
modelInstance.Draw(GraphicsDevice, modelEffect);
}