博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
DirectX11 多重纹理
阅读量:4087 次
发布时间:2019-05-25

本文共 1981 字,大约阅读时间需要 6 分钟。

多重纹理

1. 什么是多重纹理?

多重纹理效果是在一个物体表面显示 2 张纹理图像。 我们可以通过对两者的纹理图像采样,使用 color1×color2 作为最终的像素颜色值。

多重纹理是一个十分有用的技术。有时我们需要表现诸如光照贴图,阴影贴图,细节贴图等,就可以一次使用多张纹理图像来获得最终效果。

2. 多重纹理如何实现?

在多重纹理 Demo 中,我们载入两张纹理图像,并且都传递给我们的着色器,就像之前处理一张纹理那样。在 MultiTextureDemo 类中添加了用于处理第二张纹理的资源视图:

ID3D11ShaderResourceView* colorMap_;    ID3D11ShaderResourceView* secondMap_;

Demo 中,我们只需简单的拷贝用于第 1 张纹理的代码,处理第 2 张纹理。 在着色器中,我们简单的对两张纹理图像采样,并且返回颜色乘积作为最终渲染效果:

float4 PS_Main( PS_Input frag ) : SV_TARGET{    float4 col = colorMap.Sample( colorSampler, frag.tex0 );    float4 col2 = secondMap.Sample( colorSampler, frag.tex0 );    return col * col2;}

注意一点: 在 HLSL 文件中,第一张使用 t0 变量绑定, 第二张纹理使用 t1 变量绑定:

Texture2D colorMap : register( t0 );Texture2D secondMap : register( t1 );

3. HLSL代码

/*    Beginning DirectX 11 Game Programming    By Allen Sherrod and Wendy Jones    Multi-Texturing Shader*/Texture2D colorMap : register( t0 );Texture2D secondMap : register( t1 );SamplerState colorSampler : register( s0 );cbuffer cbChangesEveryFrame : register( b0 ){    matrix worldMatrix;};cbuffer cbNeverChanges : register( b1 ){    matrix viewMatrix;};cbuffer cbChangeOnResize : register( b2 ){    matrix projMatrix;};struct VS_Input{    float4 pos  : POSITION;    float2 tex0 : TEXCOORD0;};struct PS_Input{    float4 pos  : SV_POSITION;    float2 tex0 : TEXCOORD0;};PS_Input VS_Main( VS_Input vertex ){    PS_Input vsOut = ( PS_Input )0;    vsOut.pos = mul( vertex.pos, worldMatrix );    vsOut.pos = mul( vsOut.pos, viewMatrix );    vsOut.pos = mul( vsOut.pos, projMatrix );    vsOut.tex0 = vertex.tex0;    return vsOut;}float4 PS_Main( PS_Input frag ) : SV_TARGET{    float4 col = colorMap.Sample( colorSampler, frag.tex0 );    float4 col2 = secondMap.Sample( colorSampler, frag.tex0 );    return col * col2;}technique11 MultiTexture{    pass P0    {        SetVertexShader( CompileShader( vs_5_0, VS_Main() ) );        SetGeometryShader( NULL );        SetPixelShader( CompileShader( ps_5_0, PS_Main() ) );    }}

贴图1:

1

贴图2:

2

贴图1+贴图2,实现多重纹理:

3

你可能感兴趣的文章
Objective-C 基础入门(三) 读写文件与回调
查看>>
C++ STL标准库与泛型编程(一)概述
查看>>
C++ STL标准库与泛型编程(四)Deque、Queue、Stack 深度探索
查看>>
C++ STL标准库 算法
查看>>
JVM内存模型_Minor GC笔记
查看>>
SpringCloud学习之PassCloud——(一)PassCloud源代码下载
查看>>
Linux下安装Python环境并部署NLP项目
查看>>
Nginx篇-springCloud配置Gateway+Nginx进行反向代理和负载均衡
查看>>
Nginx篇-Nginx配置动静分离
查看>>
缓存篇-Redis缓存失效以及解决方案
查看>>
缓存篇-使用Redis进行分布式锁应用
查看>>
缓存篇-Redisson的使用
查看>>
phpquery抓取网站内容简单介绍
查看>>
找工作准备的方向(4月22日写的)
查看>>
关于fwrite写入文件后打开查看是乱码的问题
查看>>
用结构体指针前必须要用malloc,不然会出现段错误
查看>>
Linux系统中的美
查看>>
一些实战项目(linux应用层编程,多线程编程,网络编程)
查看>>
我觉得专注于去学东西就好了,与世无争。
查看>>
原来k8s docker是用go语言写的,和现在所讲的go是一个东西!
查看>>