如何在OpenGL中应用法线贴图?

zyn*_*dor 8 c++ opengl graphics

我正在学习使用OpenGL在2D图形中使用法线贴图(每像素光照?).

作为法线贴图的新手,我设法绕过Sobel算子并生成法线贴图(主要归功于),即从(2D)像素数据阵列创建(2D)法线阵列.

(我发现的大多数教程和论坛主题都是针对3D使用和建模软件的.我的目标是在C++中自己实现这个功能.)

  • 一旦我得到了正常的地图,我该怎么办?
  • 我需要在OpenGL中注册吗?
  • 它是否需要与纹理相关联,如果是,它是如何完成的?
  • 它是如何映射到2D纹理四边形的?
  • (这是我可以在没有着色器/ GLSL的情况下做的事吗?)

Tom*_*mas 6

我建议你看看:

关于bumb映射的这个nvidia演示文稿

我暂时没有看过这个问题,但是我记得它在实现凹凸贴图着色器时会考虑大部分细节,应该会有一些想法在运行.

这个用于在cg着色器语言中实现凹凸贴图的其他nvidia教程

凹凸贴图教程也可能有所帮助.

我知道所有这些都不是完全正常的映射,但它们是一个良好的开端.

此外,虽然着色器语言存在差异,但如果您想使用GLSL,则不应该很难在它们之间转换制表器.

正如ybungalobill所说,你可以在没有着色器的情况下做到这一点,但除非你正在从事一个教育项目(为了你的教育)或一个特定的嵌入式设备,我不知道为什么你想要的 - 但如果你确实需要这个是你想看的地方,它是在着色器之前写的,并且更新后再引用它们.


ybu*_*ill 5

  • 一旦我得到了正常的地图,我该怎么办?
  • 我需要在OpenGL中注册吗?

是的,您需要将其作为纹理加载.

  • 它是否需要与纹理相关联,如果是,它是如何完成的?

如果你的意思是与颜色纹理相关联,那么没有.您需要创建一个包含法线贴图的纹理,以便稍后在OpenGl中使用它.

  • 它是如何映射到2D纹理四边形的?

你的法线贴图只是另一个贴图,你将它绑定并映射为任何其他纹理.

法线贴图将法线存储在切线空间坐标中,因此要计算每个像素的光照,您需要知道光源在切线空间坐标系中的相对位置.这是通过为每个顶点设置附加参数(法线,切线,副法线),计算切线空间坐标中的光源位置并沿三角形插入此位置来完成的.在片段着色器中,您可以在法线贴图中查找法线,并根据插值参数执行所需的光照计算.

  • (这是我可以在没有着色器/ GLSL的情况下做的事吗?)

是的,您可以使用一些旧版扩展来编程多纹理环境组合功能.从来没有自己做过,但它看起来像地狱.