第十课,OpenGL光照之贴图

2024-03-16 18:20
文章标签 贴图 opengl 光照 第十课

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

光照贴图

光照贴图,及使用纹理代替物体颜色,物体的实际颜色由物体材质和光照决定。

漫反射贴图

使用一张覆盖物体的图像,让我们能够逐片段索引其独立的颜色值。

方式
1 将纹理传入
GLuint texture1 = loadTexture("./container2.png");//加载纹理
lightShader.setInt("material.sampler", 0);//将着色器中采样器分配到GL_TEXTURE0纹理单元
glActiveTexture(GL_TEXTURE0);
glBindTexture(GL_TEXTURE_2D, texture1);//将0号纹理单元与纹理绑定
2 用纹理颜色代替物体顶点颜色。
vec3 objectColor = texture(material.sampler, TexCoords).rgb; 

其他 同上节

镜面光贴图

专门用于镜面高光的纹理贴图,用于显示物体高光部分的颜色值。

在如下贴图中

在这里插入图片描述
为了让木箱周边能散发金属光泽,我们使用镜面光贴图
在这里插入图片描述
让光线的反射位置显示镜面光贴图,以达到高光反射的效果。
在这里插入图片描述
这可能不能明显的看出镜面光贴图的原理,如果我们将镜面光贴图改为如下贴图
在这里插入图片描述
再来看效果
在这里插入图片描述
就可以很好的理解镜面光贴图的原理了。

代码

#version 330 core
out vec4 FragColor;in vec3 Normal;  
in vec3 FragPos;  
in vec2 TexCoords;struct Material {sampler2D sampler;  sampler2D sampler1;float shininess;float ambientStrength;float diffuseStrength;float specularStrength;
}; struct Light {vec3 position;vec3 color;
};uniform Material material;
uniform Light light;uniform vec3 viewPos;void main()
{//纹理颜色vec3 objectColor = texture(material.sampler, TexCoords).rgb; vec3 specularColor = texture(material.sampler1, TexCoords).rgb; // ambientvec3 ambient = (material.ambientStrength * light.color) * objectColor;// diffuse vec3 norm = normalize(Normal);//单位法向量vec3 lightDir = normalize(light.position - FragPos);//该渲染点指向光源float diff = max(dot(norm, lightDir), 0.0);//向量点乘,角度越大数值越小.(不为负数)vec3 diffuse = (material.diffuseStrength * light.color) * diff * objectColor;//漫反射强度与光线到该点与该平面的夹角有关,夹角越小,光照越弱.// specularvec3 viewDir = normalize(viewPos - FragPos);//绘制点指向摄像机vec3 reflectDir = reflect(-lightDir, norm); //reflect(入射光线,法线),返回反射向量float spec = pow(max(dot(viewDir, reflectDir), 0.0), material.shininess);//两向量点乘后的32次方,次方数大--集中程度高vec3 specular = (material.specularStrength * light.color) * spec * specularColor; //反光强度*反光角度权值*光照颜色 vec3 result = ambient + diffuse + specular;FragColor = vec4(result, 1.0);
}

贴图的使用

在这里插入图片描述
在这里插入图片描述
在如上高光部分都使用了镜面光贴图。

贴图的不真实感

相对于简单光滑的物体,使用贴图并不能看出和真实物体的差别,但如果是较为复杂的形状,用简单的形状搭配贴图以模拟层次感会有较大的不真实感。如上方的盒子。
且镜面光贴图并不是物理意义上的高光,只是达到了这种效果,为了达到逼真效果往往需要很大工作量,而使用物理引擎,则能很大程度减小人力。

这篇关于第十课,OpenGL光照之贴图的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



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

相关文章

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

java复习第十课,方法的本质,形参和实参(很重要)

java的方法类似于其他语言的函数,是一段用来完成特定功能的代码片段,声明格式: 修饰符[public]  修饰符2[static]  返回值类型[int、String等]  方法名 (形参列表){ java语句列表..... } 形式参数:在方法被调用时用于接受外界输入的数据 实参:调用方法时实际传递给方法的数据 返回值:方法在执行完毕后返还给调用它的环境的数据 返回值类型:事先约

容器第十课,迭代器遍历List和Set,List迭代器源码分析

Iterator接口 所有实现了Collection接口的容器类都有一个iterator方法用以返回一个实现了Iterator接口的对象。 Iterator对象称作迭代器,用以方便的实现对容器内元素的遍历操作。 Iterator接口定义了如下方法: boolean hasNext():判断是否有元素没有被遍历Object next():返回游标当前位置的元素并将游标移动到下一个位置vo

试用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