Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/136.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ DirectX着色器工作不正常?_C++_Directx_Shader_Hlsl_Occlusion - Fatal编程技术网

C++ DirectX着色器工作不正常?

C++ DirectX着色器工作不正常?,c++,directx,shader,hlsl,occlusion,C++,Directx,Shader,Hlsl,Occlusion,好的,我有一个用于环境光遮挡的着色器。它正确地加载到world,但它只是将所有模型显示为白色。我不知道为什么。我只是在模型渲染时运行着色器,对吗?或者我需要制作一个渲染目标还是什么?如果是的话,那怎么办?我使用C++。这是我的着色器 float sampleRadius; float distanceScale; float4x4 xProjection; float4x4 xView; float4x4 xWorld; float3 cornerFustrum; struct VS_OUT

好的,我有一个用于环境光遮挡的着色器。它正确地加载到world,但它只是将所有模型显示为白色。我不知道为什么。我只是在模型渲染时运行着色器,对吗?或者我需要制作一个渲染目标还是什么?如果是的话,那怎么办?我使用C++。这是我的着色器

float sampleRadius;
float distanceScale;
float4x4 xProjection;
float4x4 xView;
float4x4 xWorld;

float3 cornerFustrum;

struct VS_OUTPUT
{
    float4 pos              : POSITION;
    float2 TexCoord         : TEXCOORD0;
    float3 viewDirection    : TEXCOORD1;
}; 

VS_OUTPUT VertexShaderFunction(
    float4 Position : POSITION, float2 TexCoord : TEXCOORD0)
{
    VS_OUTPUT Out = (VS_OUTPUT)0;

    float4 WorldPosition = mul(Position, xWorld);
    float4 ViewPosition = mul(WorldPosition, xView);
    Out.pos = mul(ViewPosition, xProjection);
    Position.xy = sign(Position.xy);
    Out.TexCoord = (float2(Position.x, -Position.y) + float2( 1.0f, 1.0f ) ) * 0.5f;
    float3 corner = float3(-cornerFustrum.x * Position.x,
            cornerFustrum.y * Position.y, cornerFustrum.z);
    Out.viewDirection =  corner;

    return Out;
}


texture depthTexture;
texture randomTexture;

sampler2D depthSampler = sampler_state
{
    Texture = <depthTexture>;
    ADDRESSU = CLAMP;
    ADDRESSV = CLAMP;
    MAGFILTER = LINEAR;
    MINFILTER = LINEAR;
};

sampler2D RandNormal = sampler_state
{
    Texture = <randomTexture>;
    ADDRESSU = WRAP;
    ADDRESSV = WRAP;
    MAGFILTER = LINEAR;
    MINFILTER = LINEAR;
};

float4 PixelShaderFunction(VS_OUTPUT IN) : COLOR0
{
    float4 samples[16] =
    {
        float4(0.355512,    -0.709318,  -0.102371,  0.0 ),
        float4(0.534186,    0.71511,    -0.115167,  0.0 ),
        float4(-0.87866,    0.157139,   -0.115167,  0.0 ),
        float4(0.140679,    -0.475516,  -0.0639818, 0.0 ),
        float4(-0.0796121,  0.158842,   -0.677075,  0.0 ),
        float4(-0.0759516,  -0.101676,  -0.483625,  0.0 ),
        float4(0.12493,     -0.0223423, -0.483625,  0.0 ),
        float4(-0.0720074,  0.243395,   -0.967251,  0.0 ),
        float4(-0.207641,   0.414286,   0.187755,   0.0 ),
        float4(-0.277332,   -0.371262,  0.187755,   0.0 ),
        float4(0.63864,     -0.114214,  0.262857,   0.0 ),
        float4(-0.184051,   0.622119,   0.262857,   0.0 ),
            float4(0.110007,    -0.219486,  0.435574,   0.0 ),
        float4(0.235085,    0.314707,   0.696918,   0.0 ),
        float4(-0.290012,   0.0518654,  0.522688,   0.0 ),
        float4(0.0975089,   -0.329594,  0.609803,   0.0 )
    };

    IN.TexCoord.x += 1.0/1600.0;
    IN.TexCoord.y += 1.0/1200.0;

    normalize (IN.viewDirection);
    float depth = tex2D(depthSampler, IN.TexCoord).a;
    float3 se = depth * IN.viewDirection;

    float3 randNormal = tex2D( RandNormal, IN.TexCoord * 200.0 ).rgb;

    float3 normal = tex2D(depthSampler, IN.TexCoord).rgb;
    float finalColor = 0.0f;

    for (int i = 0; i < 16; i++)
    {
        float3 ray = reflect(samples[i].xyz,randNormal) * sampleRadius;

        //if (dot(ray, normal) < 0)
        //  ray += normal * sampleRadius;

        float4 sample = float4(se + ray, 1.0f);
        float4 ss = mul(sample, xProjection);

        float2 sampleTexCoord = 0.5f * ss.xy/ss.w + float2(0.5f, 0.5f);

        sampleTexCoord.x += 1.0/1600.0;
        sampleTexCoord.y += 1.0/1200.0;
        float sampleDepth = tex2D(depthSampler, sampleTexCoord).a;

        if (sampleDepth == 1.0)
        {
            finalColor ++;
        }
        else
        {       
            float occlusion = distanceScale* max(sampleDepth - depth, 0.0f);
            finalColor += 1.0f / (1.0f + occlusion * occlusion * 0.1);
        }
    }

    return float4(finalColor/16, finalColor/16, finalColor/16, 1.0f);
}


technique SSAO
{
    pass P0
    {          
        VertexShader = compile vs_3_0 VertexShaderFunction();
        PixelShader  = compile ps_3_0 PixelShaderFunction();
    }
}
float-sampleRadius;
浮动距离标度;
浮动4x4 X项目;
浮动4x4xview;
浮动4x4xworld;
浮雕;
结构与输出
{
浮动4位:位置;
浮动2 TexCoord:TEXCOORD0;
float3视图方向:TEXCOORD1;
}; 
VS_输出VertexShaderFunction(
浮动4位置:位置,浮动2 TexCoord:TEXCOORD0)
{
VS_输出=(VS_输出)0;
float4 WorldPosition=mul(位置,xWorld);
float4 ViewPosition=mul(WorldPosition,xView);
Out.pos=mul(视图位置,X投影);
Position.xy=符号(Position.xy);
Out.TexCoord=(float2(Position.x,-Position.y)+float2(1.0f,1.0f))*0.5f;
浮动3角=浮动3(-cornerFustrum.x*位置x,
cornerFustrum.y*位置.y,cornerFustrum.z);
Out.viewDirection=角点;
返回;
}
纹理深度纹理;
纹理随机纹理;
采样器2D深度采样器=采样器\状态
{
纹理=;
地址U=夹具;
地址V=钳位;
磁滤波器=线性;
MINFILTER=线性;
};
采样器2D RandNormal=采样器\ U状态
{
纹理=;
地址u=包裹;
地址v=包裹;
磁滤波器=线性;
MINFILTER=线性;
};
float4像素着色器函数(VS_输出中):COLOR0
{
4个样本[16]=
{
浮动4(0.355512,-0.709318,-0.102371,0.0),
浮动4(0.534186,0.71511,-0.115167,0.0),
浮动4(-0.87866,0.157139,-0.115167,0.0),
浮动4(0.140679,-0.475516,-0.0639818,0.0),
浮动4(-0.0796121,0.158842,-0.677075,0.0),
浮动4(-0.0759516,-0.101676,-0.483625,0.0),
浮动4(0.12493,-0.0223423,-0.483625,0.0),
浮动4(-0.0720074,0.243395,-0.967251,0.0),
浮动4(-0.207641,0.414286,0.187755,0.0),
浮动4(-0.277332,-0.371262,0.187755,0.0),
浮动4(0.63864,-0.114214,0.262857,0.0),
浮动4(-0.184051,0.622119,0.262857,0.0),
浮动4(0.110007,-0.219486,0.435574,0.0),
浮动4(0.235085,0.314707,0.696918,0.0),
浮动4(-0.290012,0.0518654,0.522688,0.0),
浮动4(0.0975089,-0.329594,0.609803,0.0)
};
IN.TexCoord.x+=1.0/1600.0;
IN.TexCoord.y+=1.0/1200.0;
正常化(在视图方向);
浮子深度=tex2D(深度采样器,单位为TexCoord)。a;
float3 se=深度*沿视图方向;
float3 randNormal=tex2D(randNormal,IN.TexCoord*200.0).rgb;
float3 normal=tex2D(深度采样器,IN.TexCoord).rgb;
浮动最终颜色=0.0f;
对于(int i=0;i<16;i++)
{
float3射线=反射(样本[i].xyz,randNormal)*采样器半径;
//if(点(光线,法线)<0)
//射线+=正常*半径;
浮动4样品=浮动4(se+射线,1.0f);
float4 ss=mul(样本,X投影);
float2-sampleTexCoord=0.5f*ss.xy/ss.w+float2(0.5f,0.5f);
sampleTexCoord.x+=1.0/1600.0;
样本坐标y+=1.0/1200.0;
浮动采样深度=tex2D(深度采样器,采样坐标)。a;
如果(采样深度==1.0)
{
finalColor++;
}
其他的
{       
浮动遮挡=距离比例*最大值(采样深度-深度,0.0f);
最终颜色+=1.0f/(1.0f+遮挡*遮挡*0.1);
}
}
返回浮动4(最终颜色/16,最终颜色/16,最终颜色/16,1.0f);
}
SSAO技术
{
通过P0
{          
VertexShader=编译vs_3_0 VertexShaderFunction();
PixelShader=编译ps_3_0 PixelShaderFunction();
}
}

回答核心问题:此着色器用于渲染目标处理——在运行它之前,需要填充深度缓冲区。它不适用于在模型曲面上渲染。

您的问题可能来自许多不同的方面,一些显示如何调用着色器的代码将派上用场。而且那些屏幕空间AO着色器通常是后期处理的,所以应该在场景渲染后调用它们。是的,现在听起来确实如此。谢谢你的问题回答了吗?然后请发表自己的答案来完成这个问题。