我正在寻找最简单、最简单和最快的技术来渲染具有每像素法线的 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;
}
那么在这种情况下,您甚至不需要形成一个切线基础,这使得它变得非常容易。假设,定向照明,如果你将你的光转换到视图空间,那么你可以直接对法线贴图中的法线 (N) 进行 NL 光 (L)。您只需将光向量乘以视图矩阵即可将其转换为视图空间。
如果你想要点光源,那就有点复杂了。您需要首先将您的灯光位置转换为视图空间。然后你需要从你的像素位置中减去你的光位置,归一化得到的向量并将其用作 NL 计算中的 L 向量:)
要么,方式......工作完成!:D