我正在学习在OpenGL中使用法线贴图(像素级光照?)的2D图形技术。
对于法线贴图还不太熟悉,我通过Sobel算子和法线贴图生成(主要感谢这里)来理解如何从像素数据的(2D)数组创建法线数据的(2D)数组。
大部分教程和论坛帖子都是关于3D应用和建模软件的,我想在C++中自己实现这个功能。
- 获得法线贴图后我该怎么做?
- 需要将它注册到OpenGL吗?
- 如果需要与纹理关联,应该如何实现?
- 如何将它映射到2D纹理四边形上?
- (是否可以在没有着色器/GLSL的情况下完成?)
我建议你看一下:
虽然我有一段时间没有看过它了,但我记得它涵盖了实现凹凸贴图着色器的大部分细节,应该会给你一些启示。
我知道这些都不是完整法线贴图,但它们是一个好的开始。
此外,虽然着色器语言存在差异,但如果您想使用GLSL,将公式转换成其他语言也不应该太难。
正如ybungalobill所说,你可以不使用着色器,但除非你正在进行教育项目(为了你的教育)或特定的嵌入式设备,否则我不知道你为什么要这样做,但如果你确实需要这里是你需要查看的地方,它是在着色器出现之前编写的,并在后来更新以引用它们。
我想你可以不使用着色器来完成,如果需要的话,甚至可以不使用OpenGL... 着色器是为这些操作设计的,使用着色器将更容易。
所以,法线贴图是将法线向量编码成颜色的纹理... 法线向量是一个三维向量,而颜色也是三维向量。当你使用光照时,通常会从顶点着色器将法线发送到片段着色器,片段着色器将插值得到像素自己的法线向量的近似值。这是默认设置...
使用法线贴图时,您不使用顶点法线向量,而是在纹理中编码的法线向量。
首先,您需要将光照计算从世界空间转换为切线空间。这是在顶点着色器中完成的。
然后,在片段着色器中像普通纹理一样对法线贴图进行采样。您将获得像素的RGB颜色。您将需要将该值转换为法线向量,即将其乘以2并减去1,即rgb*2-1,然后在光照计算中使用它作为您的法线向量。