Directx11教程(46) alpha blend(3)

简介: 现在我们尝试改变box的贴图,使用一张带alpha的dds文件wirefence.dds, 用directx texture tool打开文件界面如下:       实际上,这幅图中一些像素有alpha值,一些像素alpha值为0,我们点击View-alpha channel only,可以看到下面的图,其中黑色部分的alpha值为0:      现在我们把这幅图贴到box上,程序运行效果如下: 我们在lighttex.ps中增加以下代码,需要注意clip函数的使用。

      现在我们尝试改变box的贴图,使用一张带alpha的dds文件wirefence.dds,

用directx texture tool打开文件界面如下:

image

      实际上,这幅图中一些像素有alpha值,一些像素alpha值为0,我们点击View-alpha channel only,可以看到下面的图,其中黑色部分的alpha值为0:

image

     现在我们把这幅图贴到box上,程序运行效果如下:

image

我们在lighttex.ps中增加以下代码,需要注意clip函数的使用。

float3 N = normalize(input.worldnormal);
float4 textureColor = shaderTexture.Sample(SampleType, input.tex);

//从纹理图中得到alpha值
float alpha = shaderTexture.Sample(SampleType, input.tex).a;
//如果alpha小于0.25就放弃掉当前的像素
clip(alpha-0.25);

程序执行后的效果如下:

image

     程序运行结果还不错,但是对于篱笆box,它的背面被剔除掉了,下面我们尝试在D3DClass中增加关闭、打开cullmode的函数,在渲染box时候,禁止背面剔除。

void D3DClass::EnableBackCullMode(bool b)
    {
    D3D11_RASTERIZER_DESC rasterDesc;
    HRESULT result;

   // 设置光栅化描述,指定多边形如何被渲染.
    rasterDesc.AntialiasedLineEnable = false;
    if(b)
       rasterDesc.CullMode = D3D11_CULL_BACK;
    else
         rasterDesc.CullMode = D3D11_CULL_NONE;
    rasterDesc.DepthBias = 0;
    rasterDesc.DepthBiasClamp = 0.0f;
    rasterDesc.DepthClipEnable = true;
    rasterDesc.FillMode = D3D11_FILL_SOLID; //D3D11_FILL_SOLID
    rasterDesc.FrontCounterClockwise = false;
    rasterDesc.MultisampleEnable = false;
    rasterDesc.ScissorEnable = false;
    rasterDesc.SlopeScaledDepthBias = 0.0f;

   // 创建光栅化状态
    result = m_device->CreateRasterizerState(&rasterDesc, &m_rasterState);
    if(FAILED(result))
        {
        HR(result);
        return;
        }

    //设置光栅化状态,使其生效
    m_deviceContext->RSSetState(m_rasterState);
    }

在GraphicsClass中渲染box时候,我们增加下面的代码:

//渲染box时候关掉背面剔除
m_D3D->EnableBackCullMode(false);
//用light shader渲染
result = m_LightTexShader->Render(m_D3D->GetDeviceContext(), m_CubeModel->GetIndexCount(), worldMatrix3, viewMatrix, projectionMatrix,
    light, material, camera,m_TexManager->createTex(m_D3D->GetDevice(),string("wirefence.dds")));
m_D3D->EnableBackCullMode(true);

//打开背面剔除
m_D3D->EnableBackCullMode(true);

程序最终的运行效果如下:

image

完整的代码请参考:

工程文件myTutorialD3D11_41

代码下载:

http://files.cnblogs.com/mikewolf2002/d3d1139-49.zip

http://files.cnblogs.com/mikewolf2002/pictures.zip

相关文章
|
测试技术 C# Android开发
Xamarin Alpha预览
好像是几周前,Visual Studio 2017发布了,我们已经在为下一个Xamarin更新。我们刚刚发布了下一版本的alpha预览版,我想和你们分享一些我最感兴趣的特点。
1135 0
|
C++ Python JavaScript
为Cocos2d-x-2.1.5和3.0alpha1生成新项目
 新版本与之前使用的Cocos2d-x-2.0.4生成方式已经不同了,新版本已经没有之前的js生成项目模板,而是采用python来生成。  本文记录从网上查找的资料,以及安装过程,所使用的为Cocos2d-x-2.1.5,python-2.7.3。  python-2.7.3下载地址:http://www.python.org/getit/releases/2.7.3/   步骤
993 0
Directx11教程(45) alpha blend(2)
在myTutorialD3D11_40中,我们在场景中再添加一个box,并把box放在水里,实现半透明的效果。如下图所示:       我们要特别注意一点的就是场景中物体的渲染次序,先渲染山谷、第二个box,第三个水。
814 0
Directx11教程(44) alpha blend(1)
我们知道,D3D11中按Frame来渲染物体,每个Frame中又可能包含若干个primitive,如下面的示意图所示:      gpu在实际渲染中,会按帧来渲染,比如上图frame0中,有两个primitive(三角形),经过vs以后,PA(primitive assemble) block会进行体元装配,然后进行光栅化操作,光栅化操作时候,会比较depth buffer的值。
1188 0
Directx11教程(47) alpha blend(4)-雾的实现
除了用来实现透明效果之外,我们还可以用alpha blend来实现雾(fog)的效果。通过逐渐清晰的雾气效果,可以增加场景的真实感。      雾的效果实现很简单,首先我们要一种颜色来表示雾,通常使用用灰色。
950 0
Directx11教程(35) 纹理映射(5)
到现在为止,我们的TextureClass初始化函数非常简单,说白了就是一行代码: result = D3DX11CreateShaderResourceViewFromFile(device, filename, NULL, NULL, &m_texture, NULL);       这行代码装入一个dds文件,而且其它选项都设置为NULL,这时系统会使用装入文件本身的格式,比如我们装入的tong.dds, 前面我们为其产生了mipmaps层,并且设置surface格式为DXT5(对应于D3D11中BC3压缩格式)。
882 0
Directx11教程38 纹理映射(8)
上篇日志中,我们用纹理和光照颜色调制的方式得到最终颜色,本章我们尝试用纹理采样的颜色,直接做为材质的漫反射系数Kd,并用它来做光照计算,最后再做个gamma校正,如果不做的话,效果会偏亮。      lighttex.
837 0
|
C++ 索引
Directx11教程37 纹理映射(7)
本章是在教程35、36的基础上来实现一个光照纹理结合的程序,就是把场景中旋转的cube加上纹理。    lighttex.vs中顶点的结构现在为: struct VertexInputType {     float4 position : POSITION; ...
895 0
|
索引
Directx11教程36 纹理映射(6)
本章主要是整理代码,做以下两件事情: 1、把世界坐标矩阵的计算,放在GraphicsClass的渲染函数中,之前放在D3DClass中,而且只是返回一个单位矩阵,没任何作用。如果要使其起作用,就要对每个model类都单独设置,很麻烦,比如我要画两个颜色立方体,岂不是要建立两个model类,而只是世界坐标矩阵不同。
827 0