3

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

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

有谁知道适当的技术或可以发布有用的教程?哦,只有DX请。

谢谢。

4

2 回答 2

3

我对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;
}
于 2009-12-15T21:52:38.037 回答
0

那么在这种情况下,您甚至不需要形成一个切线基础,这使得它变得非常容易。假设,定向照明,如果你将你的光转换到视图空间,那么你可以直接对法线贴图中的法线 (N) 进行 NL 光 (L)。您只需将光向量乘以视图矩阵即可将其转换为视图空间。

如果你想要点光源,那就有点复杂了。您需要首先将您的灯光位置转换为视图空间。然后你需要从你的像素位置中减去你的光位置,归一化得到的向量并将其用作 NL 计算中的 L 向量:)

要么,方式......工作完成!:D

于 2009-12-17T09:10:44.487 回答