Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/155.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 使用逐像素照明/法线贴图的2D渲染-directX_C++_Graphics_Directx_Shader - Fatal编程技术网

C++ 使用逐像素照明/法线贴图的2D渲染-directX

C++ 使用逐像素照明/法线贴图的2D渲染-directX,c++,graphics,directx,shader,C++,Graphics,Directx,Shader,我正在寻找一种最简单、最简单、最快的技术,用每像素法线渲染2D纹理四边形。 我的意思是一个3D世界,相机是固定的,所有的纹理四边形都朝向同一个方向(相机),它们之间会有光点,我希望纹理具有每像素法线值,这样它们就会像3D模型一样被照亮 我在网上发现的大多数技术都过于复杂和沉重,因为它们涉及真实的3D模型,而我所需要的只是简单的2d四边形 是否有人知道适当的技巧或可以发布有用的教程? 哦,请只给我DX 谢谢。我对XNA比directX更有经验,但原理是一样的 你需要一个法线贴图,这会准确地告诉你的

我正在寻找一种最简单、最简单、最快的技术,用每像素法线渲染2D纹理四边形。 我的意思是一个3D世界,相机是固定的,所有的纹理四边形都朝向同一个方向(相机),它们之间会有光点,我希望纹理具有每像素法线值,这样它们就会像3D模型一样被照亮

我在网上发现的大多数技术都过于复杂和沉重,因为它们涉及真实的3D模型,而我所需要的只是简单的2d四边形

是否有人知道适当的技巧或可以发布有用的教程? 哦,请只给我DX


谢谢。

我对XNA比directX更有经验,但原理是一样的

你需要一个法线贴图,这会准确地告诉你的着色器在一个给定的点上曲面法线是什么。然后,需要对四边形进行纹理贴图(它们可能已经进行了纹理贴图,因此这并不是什么额外的工作)。然后使用像素着色器绘制四边形,在着色器内执行以下操作:

//This shader only handles one directional light, there are various tecnhiques for handling multiple lights.
float3 LightDirection;

//Normal map, set this before rendering the quad
Texture NormalMap;
//sampler
sampler normalSampler = sampler_state
{
  texture = <NormalMap>;
}

//Diffusemap, set this before rendering the quad. This is just your normal texture you want applied to the quad
Texture DiffuseMap;
//sampler
sampler diffuseSampler = sampler_state
{
  texture = <DiffuseMap>;
}

/* you probably need a vertex shader to run all your translations etc, that's pretty bog standard stuff so I won't include one here */

float4 PixelShader(float2 texCoord : TEXCOORD0) : COLOR0
{
  //standard directional lighting equation with normals
  float3 Normal = tex2D(normalSampler, texCoord);
  float dot = dot(LightDirection, Normal);
  return tex2D(normalSampler, texCoord) * dot;
}
//此着色器仅处理一个平行光,有多种技术可用于处理多个灯光。
漂浮方向;
//法线贴图,在渲染四边形之前设置此选项
纹理法线贴图;
//采样器
采样器法线采样器=采样器\状态
{
纹理=;
}
//Diffusemap,在渲染四边形之前设置此选项。这只是要应用于四边形的普通纹理
纹理扩散图;
//采样器
采样器扩散采样器=采样器状态
{
纹理=;
}
/*你可能需要一个顶点着色器来运行你所有的翻译等等,这是相当标准的东西,所以我这里不包括一个*/
float4像素着色器(float2 texCoord:TEXCOORD0):COLOR0
{
//带法线的标准定向照明方程
float3 Normal=tex2D(normalSampler,texCoord);
浮动点=点(光照方向,法线);
返回tex2D(normalSampler,texCoord)*点;
}

在这种情况下,您甚至不需要形成切线基,这使它变得非常简单。假设,定向照明,如果将灯光转换为视图空间,则可以直接从法线贴图中选择灯光(L)与法线(N)的对比。只需将光向量乘以视图矩阵,即可将其转换为视图空间

如果您想要点光源,它会稍微复杂一些。首先需要将灯光位置转换为视图空间。然后,您需要从像素位置减去灯光位置,将结果向量归一化,并将其用作N.L计算中的L向量:)


不管怎样。。。工作完成了!:D

“真实”3D模型只是由一组2D多边形组成。“真实”3D模型只是由一组2D多边形组成。”-没错,但在处理“真实”3D模型时,也要处理3D空间中的旋转,这使得一切都变得复杂得多(由于我发现的技术就是为了解决这个问题而设计的,它们对于我的需求来说太复杂了,太致命了)。另外,请注意,一个平面四边形恰好位于三维空间中,而一个由几十个多边形(如果不是更多的话)组成的网格分布在三维空间中,而每个多边形法线都是多边形因子和法线贴图的因子,这是另一个复杂性。所有法线都是相同的?完全相同?那么您需要做的就是要做的是修改我在回答中建议的方法,但不需要法线贴图,只需传入所需的单个法线。为了提高效率,只需直接传入灯光方向和法线的点积。请注意,如果使用旋转(用于平铺目的)你需要在法线转换方面处理它。Mds Elvheim-对,我对这个网站有点陌生:)Martin-非常感谢,但我正在寻找支持多个灯光的东西。在DX中也会更好。。斯特林格·贝尔——你可能是对的。我的引擎将只需要X轴翻转,这将使我需要反转红色通道。我提交了一些编辑您的文章,但这是正确的。OP应该接受这个答案。非常感谢eodabash。一个被接受的答案会很好,但两年后我并没有屏住呼吸:(