directx 11使用PSSetShaderResources更改纹理

directx 11 change texture using PSSetShaderResources

本文关键字:纹理 PSSetShaderResources 使用 directx      更新时间:2023-10-16

嗨,我刚刚学习directx11,遇到了PSSetShaderResources 的问题

如果在调用swapchain->Present之前更改纹理,则只显示第一个纹理。如果我在Present调用之间更改纹理,则这两个调用都显示在连续帧上。

有没有用PSSetShaderResources更改纹理,这样我就可以在一帧上同时使用这两种(或更多)?

我知道我可以使用纹理阵列,但在我看来,你们必须有相同大小的纹理?

我也可以一次上传两个纹理(或更多),但我必须在着色器中有条件语句。

下面是我正在使用的绘图循环。我使用的简单着色器

任何帮助都将不胜感激。

Paul

2014年10月24日


tempBool = false;
    for (int j = 0; j < 2; j++)             //change 2 to texCount
    {
    devcon->UpdateSubresource(pConstantBuffer, 0, NULL, &cb, 0, 0);
    devcon->VSSetConstantBuffers(0, 1, &pConstantBuffer);
    devcon->PSSetConstantBuffers(0, 1, &pConstantBuffer);
    tempBool = !tempBool;
    if (tempBool)
    {
        devcon->PSSetShaderResources(0, 1, &pTex[0]);
    }
    else
    {
        devcon->PSSetShaderResources(0, 1, &pTex[1]);
    }
        for (int i = 0; i < texRun[j]; i++)
        {
            devcon->Draw(obLens[curPos+i], obStarts[curPos+i]);
        }
        curPos += texRun[j];
    }
    swapchain->Present(0, 0);

Texture2D txDiffuse : register( t0 );
SamplerState samLinear : register( s0 );
cbuffer ConstantBuffer : register( b0 )
{
    matrix World;
    matrix View;
    matrix Projection;
    float4 vLightDir;
    float4 vLightColor;
};
struct VOut
{
    float4 Pos : SV_POSITION;
    float3 Norm : NORMAL;
    float2 Tex : TEXCOORD;
};
VOut VShader(float4 position : POSITION, float3 Norm : NORMAL, float2 Tex : TEXCOORD)
{
    VOut output = (VOut)0;
    output.Pos = mul( position, World );
    output.Pos = mul( output.Pos, View );
    output.Pos = mul( output.Pos, Projection );
    output.Norm = mul(Norm, World);
    output.Tex = Tex;
    return output;
}

float4 PShader0(float4 position : SV_POSITION, float3 Norm : NORMAL,
         float2 Tex : TEXCOORD ) :     SV_TARGET
{
    float4 diffuse = 0;
    diffuse = txDiffuse.Sample( samLinear, Tex  );

    float4 finalColor = 0;
    finalColor = diffuse; // * 0.2;
    finalColor += saturate( dot((float3)vLightDir,Norm) * diffuse); 

    finalColor.a = 1.0;
    return finalColor;
} 

最终找到了错误,它是在我的对象加载代码中,与宽度无关direct3d

我在第一批上装载第二批物体

对于我正在读取的第一批对象,它是我的顶点数据指针

对于第二批,我也在读verts,而不是&verts[firstVertsCount]

无论如何,感谢的帮助

Paul