PSSetShaderResources 数组

上一节对我们所绘制的物体设置了纹理,但主要对其中一个函数有些疑问:

ID3D11DeviceContext :: PSSetShaderResource()
当我们对一个物体想设置多个纹理,或者想同时传入两个纹理进行混合时该怎么办?

第一种方法:

针对上面这个函数,第一个参数是穿入shader的槽。

我们在effect file中写的texture变量后面可以加寄存器(槽),如下

Texture2D texture04 : register(t0);
TextureCube myCubeMap : register(t1);
这样我们改变第一个参数为1时,就会传入到myCubeMap中,当然也可以一次传入多个贴图,

ID3D11DeviceContext :: PSSetShaderResource(0,2,&data);

这样的话就会同时给t0和t1传入,前提是data包含了两个贴图的数据。

最后在PS函数中修改对应的贴图即可。

第二种方法:

直接将effect file中的贴图变量声明为数组,在传入时传入两个贴图数据,说明代码如下:

for (int i = 0 ; i < nNumTex ; ++i) {
hr = D3DX11CreateShaderResourceViewFromFile(pDevice, texFileName[i], nullptr, nullptr, &pShaderResourceView[i], nullptr);
if (FAILED(hr)) {
MessageBox(nullptr, "ERROR::CreateShaderResourceView", "Error", MB_OK);
return hr;
}
}



PSSetShaderResources(0, nNumTex, pShaderResourceView); //here





effect file中的对应修改如下:

Texture2D tex[2];
float4 PS(VS_OUTPUT input) : SV_TARGET
{
return tex[0].Sample(samp, input.texcoord) * 0.5f + tex[1].Sample(samp, input.texcoord) * 0.5;
}
这样也可以实现一次传入两个贴图并且进行混合。
---------------------
作者:程序员菜鸟
来源:CSDN
原文:https://blog.csdn.net/qq_40947718/article/details/84777865
版权声明:本文为博主原创文章,转载请附上博文链接!

posted on 2019-05-17 16:15  guanxi0808  阅读(1467)  评论(0编辑  收藏  举报

导航