Directx11教程(46) alpha blend(3)-阿里云开发者社区

开发者社区> 迈克老狼1> 正文

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

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
Directx11教程38 纹理映射(8)
上篇日志中,我们用纹理和光照颜色调制的方式得到最终颜色,本章我们尝试用纹理采样的颜色,直接做为材质的漫反射系数Kd,并用它来做光照计算,最后再做个gamma校正,如果不做的话,效果会偏亮。      lighttex.
716 0
Directx11教程(50) 输出depth/stencil buffer的内容
有时候,我们需要查看depth/stencil buffer的内容,比如上一章中,我们要查看stencil buffer,看看我们设置的stencil值是否起作用,这时就要输出depth/stencil buffer内容,但这些内容在gpu中,我们并不能直接查看,需要通过纹理copy,资源映射的方式,拷贝到system memory中才可以直接查看。
724 0
更改vss默认登录名或自动登录教程
最简单的办法: 右键点 Microsoft Visual SourceSafe 6.0 启动的快捷方式,属性,修改目标栏   用 -y 参数输入用户名和密码(无密码的可以只输入和用户名,在-y之前加个空格)   最方便,可随时修改(用这个方法还可以通过多个快捷方式登录不同权限的用户),推荐。
1004 0
SharpDX之Direct2D教程I——简单示例和Color(颜色)
研究Direct2D已经有一段时间了,也写了一个系列的文章 Direct2D ,是基于Windows API Code Pack 1.1。在前文 Direct2D教程VIII——几何(Geometry)对象的运算,本系列的终结篇 中介绍,由于Windows API Code Pack 1.1有错误问题,加上长时间没有更新(可以看出是2010年推出的),于是终止了该系列的教程。
898 0
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函数的使用。
683 0
Directx11教程(45) alpha blend(2)
在myTutorialD3D11_40中,我们在场景中再添加一个box,并把box放在水里,实现半透明的效果。如下图所示:       我们要特别注意一点的就是场景中物体的渲染次序,先渲染山谷、第二个box,第三个水。
691 0
Directx11教程(47) alpha blend(4)-雾的实现
除了用来实现透明效果之外,我们还可以用alpha blend来实现雾(fog)的效果。通过逐渐清晰的雾气效果,可以增加场景的真实感。      雾的效果实现很简单,首先我们要一种颜色来表示雾,通常使用用灰色。
736 0
Directx11教程(48) depth/stencil buffer的作用
在D3D11中,有depth/stencil buffer,它们和framebuffer相对应,如下图所示,framebuffer中一个像素,有相对应的depth buffer和stencil buffer值:         D3D11中,depth buffer和stencil buffer一起定义,比如DXGI_FORMAT_D24_UNORM_S8_UINT,是指用一个无符号24位的值做为像素的深度缓冲值,并把它映射到[0,1],用一个8位的值表示像素stencil值,并把它映射到[0,255]。
817 0
Directx11教程(49) stencil的应用-镜面反射
本教程中,我们利用stencil来实现一个镜面反射效果。 1、首先我们要在D3DClass中增加几个成员变量及函数。 ID3D11DepthStencilState* m_depthStencilStateMirror; ID3D11DepthStencilState* ...
870 0
+关注
迈克老狼1
算法相关技术专家
240
文章
0
问答
文章排行榜
最热
最新
相关电子书
更多
《2021云上架构与运维峰会演讲合集》
立即下载
《零基础CSS入门教程》
立即下载
《零基础HTML入门教程》
立即下载