2017-05-30 49 views
-1

到目前为止,我发现你需要创建一个ID3D10BlendState对象,用D3D10_BLEND_DESC结构调用CreateBlendState(),并调用OMSetBlendState()。但我不知道如何调用Draw()函数以及如何应用()纹理。我有需要与普通纹理混合的光照贴图纹理。我是否需要顶点的多个纹理坐标?我是否需要绘制每个聚合物两次,一次绘制纹理,一次绘制光照贴图?我也不想使用纹理数组。如何在Direct3D 10中进行纹理混合?

在此先感谢。

+0

好的,为什么downvote? :/ – Hermetix

+0

欢迎来到SO!我没有下降,但这里有可能的原因:(1)你不要问一个SO格式可回答的问题(即短文)。 (2)你说的唯一确切的问题是“我不知道如何...”,对此解决方案是“学习和尝试”。 (3)一次可以帮助你学习一件简单的事情,但你基本上需要对整个管道(缓冲区,着色器等)的解释。(4)如果没有,光照贴图可能不是最好的开始知道如何画画。 (5)没有代码,也没有努力显示研究和解决问题 – Drop

+0

以下是您现在可以做的事情:尝试将问题分成更小,更简单的子问题,您可以一次处理一个问题。找一个在线教程,可以帮助您绘制三角形或四边形,着色器,但没有纹理或混合。例如directxtutorial,rastertek或braynzarsoft。渐渐地,添加纹理,尝试使用像素着色器中的颜色进行播放,例如颠倒它们。添加混合,检查例如两个透明四边形重叠时可以正确混合。然后检查关于光照贴图的理论。在这个阶段,实施它们将是微不足道的。 – Drop

回答

0

没有理由使用DirectX 10. DirectX 11在所有相同平台上完全取代它(Windows Vista SP2或更高版本全部支持DirectX 11),并且支持范围更广的video hardware。另外,唯一可以找到DirectX 10样本和实用程序代码的地方是传统的DirectX SDK。对于DirectX 11,对于旧的已弃用的D3DX库以及samples,有许多open-source replacements

Direct3D 10及更高版本全部使用可编程着色器,而不是传统的“固定功能”流水线。因此,你会实现光映射的方法是在写在HLSL像素着色器:

Texture2D<float4> Texture : register(t0); 
Texture2D<float4> Texture2 : register(t1); 

sampler Sampler : register(s0); 
sampler Sampler2 : register(s1); 

float4 PSDualTextureNoFog(PSInputTx2NoFog pin) : SV_Target0 
{ 
    float4 color = Texture.Sample(Sampler, pin.TexCoord); 
    float4 overlay = Texture2.Sample(Sampler2, pin.TexCoord2); 

    color.rgb *= 2; 
    color *= overlay * pin.Diffuse; 

    return color; 
} 

你会建立这个脱机FXC,然后在运行时与顶点着色器一起绑定。通常,对于光的地图你会使用两个纹理坐标集输入布局:

const D3D11_INPUT_ELEMENT_DESC VertexPositionDualTexture::InputElements[] = 
{ 
    { "SV_Position", 0, DXGI_FORMAT_R32G32B32_FLOAT, 0, D3D11_APPEND_ALIGNED_ELEMENT, D3D11_INPUT_PER_VERTEX_DATA, 0 }, 
    { "TEXCOORD", 0, DXGI_FORMAT_R32G32_FLOAT,  0, D3D11_APPEND_ALIGNED_ELEMENT, D3D11_INPUT_PER_VERTEX_DATA, 0 }, 
    { "TEXCOORD", 1, DXGI_FORMAT_R32G32_FLOAT,  0, D3D11_APPEND_ALIGNED_ELEMENT, D3D11_INPUT_PER_VERTEX_DATA, 0 }, 
}; 

一个好地方与C++开始编码的DirectX 11是DirectX Tool Kit。它包括使用上面着色器的DualTextureEffect

+0

好吧,这是我想知道的一件事,即使用多个纹理坐标。因为光照贴图具有不同的坐标。我使用的是DX10,因为我的显卡不支持DX11。 (我知道这很旧) – Hermetix

+0

您正在混淆“DirectX API版本”和“Direct3D硬件功能级别”。您可以也应该使用Direct3D 11 API,该API支持一系列硬件,包括“D3D_FEATURE_LEVEL_10_0”,这实际上是“支持Direct3D 10 API所需功能的视频卡”。正如我所说的,根本没有理由使用DirectX 10 API。请参阅[本博客文章](https://blogs.msdn.microsoft.com/chuckw/2012/06/20/direct3d-feature-levels/) –