首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >GLSL -顶点法线+法线贴图?

GLSL -顶点法线+法线贴图?
EN

Stack Overflow用户
提问于 2013-08-13 04:01:34
回答 2查看 1.6K关注 0票数 0

我正在尝试为我的照明系统创建一个简单的着色器。现在,我正致力于添加对法线映射的支持。在没有法线贴图的情况下,照明系统工作正常。我使用从顶点着色器转发的法线,它们工作得很好。我也正确地读取了法线贴图中的法线。在不包含法线贴图的情况下,照明可以完美工作。我尝试添加顶点法线和法线贴图的法线,但这不起作用。也尝试了乘法。下面是我是如何读取法线映射的:

代码语言:javascript
复制
vec4 normalHeight = texture2D(m_NormalMap, texCoord);
vec3 normals = normalize((normalHeight.xyz * vec3(2.0) - vec3(1.0)));

所以我有正确的顶点法线,以及来自法线贴图的法线。我应该如何组合这些来获得正确的法线?

EN

回答 2

Stack Overflow用户

发布于 2013-08-14 06:13:46

这取决于存储法线贴图的方式。如果它们一开始就在世界空间中(这是相当罕见的),并且你的场景永远不会改变,你可以按照你拥有的方式来查找它们。但是,它们通常位于相切空间中。切线空间是一个向量空间,它使用对象的法线和(s,t)纹理坐标的变化率来正确变换具有任意方向的曲面上的法线。

切线空间法线贴图通常在肉眼看来是蓝色的,而世界空间法线贴图是彩虹的每种颜色(并且需要进行偏移和缩放,因为颜色空间的一半应该表示负向量):

如果要更好地了解切线空间,请完成导出基础向量的实现,请参见this link

票数 2
EN

Stack Overflow用户

发布于 2013-08-14 03:00:30

您的法线贴图是否不包含调整后的法线?如果是,那么你只需要读取碎片着色器中的纹理,然后你应该有你的法线,如下所示:

代码语言:javascript
复制
vec4 normalHeight = texture2D(m_NormalMap, texCoord);
vec3 normal = normalize(normalHeight.xyz);

如果你试图解释负值,那么你不应该乘以向量,而应该乘以标量。

代码语言:javascript
复制
vec3 normal = normalize( (normalHeight.xyz * 2.0) - 1.0 );
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18195689

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档