我正在寻找最简单,最容易和最快的技术来渲染每个像素法线的2D纹理四边形。我的意思是,在一个3D世界中,摄像头是固定的,所有的纹理四边形都朝向相同的方向(摄像头),它们之间会有光点,我希望纹理具有每像素的法线值,这样它们就会像3D模型一样被照亮。
我在网上找到的大多数技术都太复杂和笨重了,因为它们引用了真实的3D模型,而我所需要的只是简单的二维四边形。
有没有人知道合适的技术或者可以发布一个有用的教程?哦,请只给我DX。
谢谢。
发布于 2009-12-16 05:52:38
我对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-17 17:10:44
在这种情况下,你甚至不需要形成一个切基,这使得它变得非常容易。假设,定向照明,如果您将灯光转换到视图空间,则可以直接将灯光(L)与法线贴图中的法线(N)进行N.L。您只需将光矢量与视图矩阵相乘,即可将其转换为视图空间。
如果你想要点光源,那就有点复杂了。您需要首先将灯光位置转换到视图空间。然后你需要从你的像素位置减去你的光照位置,归一化结果向量,并在N.L计算中使用它作为你的L向量:)
不管是哪种方式...任务完成!:D
https://stackoverflow.com/questions/1910300
复制相似问题