[OpenGL] 法线贴图

2024-05-24 21:04
文章标签 贴图 opengl 法线

本文主要是介绍[OpenGL] 法线贴图,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

目录

一 为什么要使用法线贴图

二 二种不同法线方式的使用

2.1 插值法线

2.1 法线贴图


本章节源码 点击此处

一 为什么要使用法线贴图

法线贴图我们可以使用更少的顶点表现出同样丰富的细节。高精度网格和使用法线贴图的低精度网格几乎区分不出来。所以法线贴图不仅看起来漂亮,它也是一个将高精度多边形转换为低精度多边形而不失细节的重要工具。

我们知道不是所有的物体表面都是光滑平整的平面,比如我么要绘制一个人脸,但人脸会由,头发,五官,甚至是微表情等组成这些都是具有凹凸感的,那我们该如何体现出这种凹凸感呢?

  • 第一种方式: 传入大量的顶点坐标,让大量的顶点来帮我们实现人脸中的各个细节。但这无疑是会增大额外的开销。
  • 第二种方式: 我们使用法线贴图,来为每个像素上都设置不同的法线值,这样实现的效果和大量的顶点坐标几乎一样。

如下图所示: 左边第一个是传入了上百万的顶点坐标实现的效果,而最中间的是传入了500个顶点实现的效果,最后一个是在中间的基础上运用的法线贴图实现的效果,他们的效果几乎是一样的。

二 二种不同法线方式的使用

  • 通俗的理解法线的作用是在计算光照时根据角度的不同,反映在颜色上的变化,比如如果法线与光线垂直那么就会光照效果最大,颜色最亮。
  • 一般有两种不同方式来传递给GPU法线,一种是采样插值法线,也就是为每个顶点传递它的法线,另一种是采用法线贴图

2.1 插值法线

  • 观察下面这个图我们是使用插值法线得到的效果,我们传入的是6个顶点也就是2个三角形,而这6个顶点位于同一个平面,我们使用插值法线一般也是会插入6个法线向量,但同一个平面我们此时传入的法线其实是相同的,那会造成什么问题呢?
  • 例如,砖块的表面。砖块的表面非常粗糙,显然不是完全平坦的:它包含着接缝处水泥凹痕,以及非常多的细小的空洞。如果我们在一个有光的场景中看这样一个砖块的表面,问题就出来了。下图中我们可以看到砖块纹理应用到了平坦的表面,我们并看不到砖缝以及砖块表面的一些细节或者说不是很明显。

  • 对于插值法线,同一个片段上我们可以理解为法线是相同的,以光的视角来说,这个表面就是完全平坦的,即使本身提供的纹理图片上可能会看到一些砖缝但这并不能完全体现出这种凹凸不平的平面的细节。
  • 我们可以使用一种技术,让每个顶点拥有自己单独的法线,当光源照射到顶点时,根据法线的不同就能体现出更过的细节。替代一个面上所有fragment使用同一个法线的技术叫做法线贴图(normal mapping)或凹凸贴图(bump mapping)

2.1 法线贴图

原理

  • 在使用法线贴图前我们应该了解一下法线贴图的原理。其实就是用一个2D的纹理来保存每个片段的法线.
  • 纹理中的rgb就刚好对应了法线的xyz坐标
  • 这也就是我们为什么看到下面这个纹理大部分是蓝色,而在砖缝中表现的偏绿色,是因为这个纹理贴图大部分是指向z轴的也就是rgb中的b(蓝色),而砖缝中就偏向于绿色也就是指向y轴。

  • 这里有个值得注意的点,纹理中的像素颜色是0-1之间的,我们需要把它转换到标准坐标中的-1-1之间。
        vec3 normTemp = vec3(texture(texture_normal1,TexCoords));norm = normalize(normTemp * 2.0 -1.0);
  • 这样我们在片段着色器中,就能够获取到每个片段上对于的法线值了(其实就是纹理颜色值)。

效果:

  • 这样我们就能看到这个墙壁的诸多细节了。

三 代码开关

  • 在源码中我们使用一个开关bIsTexture,当我们点击dockwidgt中的插值法线时,该值为false,则采用默认的插值法线来计算,如果点击法线贴图改值为true,采用法线贴图来渲染

 vec3 norm;if(bIsTexture == true){vec3 normTemp = vec3(texture(texture_normal1,TexCoords));norm = normalize(normTemp * 2.0 -1.0);}else{norm = normalize(Normal);}

这篇关于[OpenGL] 法线贴图的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/999520

相关文章

Open3D 基于法线的双边滤波

目录 一、概述 1.1原理 1.2实现步骤 1.3应用场景 二、代码实现 2.1关键函数 输入参数: 输出参数: 参数影响: 2.2完整代码 三、实现效果 3.1原始点云 3.2滤波后点云 Open3D点云算法汇总及实战案例汇总的目录地址: Open3D点云算法与点云深度学习案例汇总(长期更新)-CSDN博客 一、概述         基于法线的双边

OPENGL顶点数组, glDrawArrays,glDrawElements

顶点数组, glDrawArrays,glDrawElements  前两天接触OpenGL ES的时候发现里面没有了熟悉的glBegin(), glEnd(),glVertex3f()函数,取而代之的是glDrawArrays()。有问题问google,终于找到答案:因为OpenGL ES是针对嵌入式设备这些对性能要求比较高的平台,因此把很多影响性能的函数都去掉了,上述的几个函数都被移除了。接

OpenGL ES学习总结:基础知识简介

什么是OpenGL ES? OpenGL ES (为OpenGL for Embedded System的缩写) 为适用于嵌入式系统的一个免费二维和三维图形库。 为桌面版本OpenGL 的一个子集。 OpenGL ES管道(Pipeline) OpenGL ES 1.x 的工序是固定的,称为Fix-Function Pipeline,可以想象一个带有很多控制开关的机器,尽管加工

OpenGL雾(fog)

使用fog步骤: 1. enable. glEnable(GL_FOG); // 使用雾气 2. 设置雾气颜色。glFogfv(GL_FOG_COLOR, fogColor); 3. 设置雾气的模式. glFogi(GL_FOG_MODE, GL_EXP); // 还可以选择GL_EXP2或GL_LINEAR 4. 设置雾的密度. glFogf(GL_FOG_DENSITY, 0

opengl纹理操作

我们在前一课中,学习了简单的像素操作,这意味着我们可以使用各种各样的BMP文件来丰富程序的显示效果,于是我们的OpenGL图形程序也不再像以前总是只显示几个多边形那样单调了。——但是这还不够。虽然我们可以将像素数据按照矩形进行缩小和放大,但是还不足以满足我们的要求。例如要将一幅世界地图绘制到一个球体表面,只使用glPixelZoom这样的函数来进行缩放显然是不够的。OpenGL纹理映射功能支持将

OpenGL ES 2.0渲染管线

http://codingnow.cn/opengles/1504.html Opengl es 2.0实现了可编程的图形管线,比起1.x的固定管线要复杂和灵活很多,由两部分规范组成:Opengl es 2.0 API规范和Opengl es着色语言规范。下图是Opengl es 2.0渲染管线,阴影部分是opengl es 2.0的可编程阶段。   1. 顶点着色器(Vert

OpenGL/GLUT实践:流体模拟——数值解法求解Navier-Stokes方程模拟二维流体(电子科技大学信软图形与动画Ⅱ实验)

源码见GitHub:A-UESTCer-s-Code 文章目录 1 实现效果2 实现过程2.1 流体模拟实现2.1.1 网格结构2.1.2 数据结构2.1.3 程序结构1) 更新速度场2) 更新密度值 2.1.4 实现效果 2.2 颜色设置2.2.1 颜色绘制2.2.2 颜色交互2.2.3 实现效果 2.3 障碍设置2.3.1 障碍定义2.3.2 障碍边界条件判定2.3.3 障碍实现2.3.

OpenGL——着色器画一个点

一、 绘制 在窗口中间画一个像素点: #include <GL/glew.h>#include <GLFW/glfw3.h>#include <iostream>using namespace std;#define numVAOs 1GLuint renderingProgram;GLuint vao[numVAOs];GLuintcreateShaderProgram (){c

试用GLFW并创建OpenGL和DX的环境

介绍GLFW GLFW官网:https://www.glfw.org/ GLFW is an Open Source, multi-platform library for OpenGL, OpenGL ES and Vulkan development on the desktop. It provides a simple API for creating windows, contex

图形API学习工程(25):实现法线贴图

工程GIT地址:https://gitee.com/yaksue/yaksue-graphics 目标 在《图形API学习工程(10):基础光照》中,我实现了最基础的光照,同时也表现了法线的作用。 在《图形API学习工程(11):使用纹理》中,工程已经能够加载纹理贴图。 这样,法线贴图 所需的准备已经完成,可以在工程里实现这个技术了。 (关于法线贴图的意义,可见上一篇博客《从“法线贴图的意义