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);
        }