rendermonkey练习第二天opengl光照模型

3D入魔 3D入魔     2022-08-27     748

关键词:

光照模型

3D渲染中, 物体表面的光照计算公式为:

I = 环境光(Iambient) + 漫反射光(Idiffuse) + 镜面高光(Ispecular);

 

其中,环境光(ambient)计算公式为:

Iambient = Aintensity * Acolor ;             (Aintensity表示环境光强度,Acolor表示环境光颜色)

 

漫反射光(diffuse)计算公式为:

Idiffuse = Dintensity*Dcolor*N.L ;                   (Dintensity表示漫反射强度,Dcolor表示漫反射光颜色,N为该点的法向量,L为光源向量)

 

镜面光照(specular)计算公式为:

Ispecular = Sintensity*Scolor*(R.V)n ;         (Sintensity表示镜面光照强度,Scolor表示镜面光颜色,R为光的反射向量,V为观察者向量)

 

综上所得:整个光照公式为:

I = Aintensity * Acolor +Dintensity*Dcolor*N.L + Sintensity*Scolor*(R.V)n ;

将一些值合并,并使用白色作为光照颜色,则上述公式可简化为:

I = A + D*N.L + (R.V)n

漫反射光照:

1. 打开RenderMonkey, 右击WorkSpace的Effect WorkSpace结点,选择Add Default Effect->OpenGL->OpenGL;

2. 添加光源向量: 右击Effect节点选择Add Variable->float->float4;  修改名称为vecLightPosition, 双击设置其值

4. 编写Vertex Shader:

uniform vec4 vecLightPosition;


varying vec3 lightdir;
varying vec3 normal;

void main(void)
{
   gl_Position = ftransform();  
   normal = normalize(gl_NormalMatrix * gl_Normal);
   vec4 fvObjectPosition = gl_ModelViewMatrix * gl_Vertex;
   lightdir = normalize(vecLightPosition.xyz - fvObjectPosition.xyz);  
}

5.    编写Pixel Shader:

varying vec3 lightdir;
varying vec3 normal;

void main(void)
{
   vec4 diffuse = vec4(0.8,0.8,0.8,1.0);  
   vec4 ambient = vec4(0.3,0.2,0.1,1.0); 
   
   vec3 lightDirection = normalize(lightdir);
   float fNDotL = dot(normal,lightDirection);  
 
   gl_FragColor = ambient + fNDotL * diffuse ;
}

6. 预览效果

 

 

镜面反射光照:

1. 添加光源位置 vecLightPosition

2. 添加相机位置 vecEye

3. 顶点shader

uniform vec4 vecLightPosition;
uniform vec4 vecEye;

varying vec3 lightdir;
varying vec3 normal;
varying vec3 viewdir;

void main(void)
{
   gl_Position = ftransform();  
   normal = normalize(gl_NormalMatrix * gl_Normal);
   vec4 fvObjectPosition = gl_ModelViewMatrix * gl_Vertex;
   lightdir = normalize(vecLightPosition.xyz - fvObjectPosition.xyz);   
   viewdir = normalize(vecEye.xyz - fvObjectPosition.xyz);
}

4. 片元shader

varying vec3 lightdir;
varying vec3 normal;
varying vec3 viewdir;

void main(void)
{
   vec4 diffuse = vec4(0.8,0.8,0.8,1.0);  
   vec4 ambient = vec4(0.3,0.2,0.1,1.0);   
   vec4 specular = vec4(0.0,0.0,0.0,1.0);
   
   vec3 lightDirection = normalize(lightdir);
   vec3 viewDirection = normalize(viewdir);
   float fNDotL = dot(normal,lightDirection);
   
   vec3 Reflection = normalize(2 * fNDotL * normal - lightDirection);
   
   float fRDotV = dot(Reflection,viewDirection);

 /* compute the specular term if NdotL is  larger than zero */
   if (fRDotV > 0.0)
   {
      specular = vec4(0.49,0.48,0.49,1.0) * pow(fRDotV,8.0);
   }
   gl_FragColor = ambient + fNDotL * diffuse + specular;
}

5. 效果图

 

opengles着色语言-光照效果之散射光

  OpenGL光照模型,在固定管线中,主要是调用OpenGL函数实现,如果使用着色器,该怎么实现。本文的例子是移植OpenGL4.0ShadingLanguageCookbook中第二章的例子。代码已经移植到Android上。  散射光计算主要涉及到两个向量... 查看详情

算法练习-第二天(合并两个排序的链表)(代码片段)

业精于勤荒于嬉🐧主页详情:旷世奇才李先生主页📢作者简介:🏅优质创作者🏅and🏅阿里专家博主🏅and🏅华为云享专家🏅✍️人生格言:把一生一分为二,前半生不犹豫,... 查看详情

算法练习-第二天(合并两个排序的链表)(代码片段)

业精于勤荒于嬉🐧主页详情:旷世奇才李先生主页📢作者简介:🏅优质创作者🏅and🏅阿里专家博主🏅and🏅华为云享专家🏅✍️人生格言:把一生一分为二,前半生不犹豫,... 查看详情

开学第二天

...知识吧,感觉计算机语言最重要的是积累,再就是变通和练习。一.    1.class Program(项目类)    2.static void Main(string[]args)(主函数,函数的入口,一个项目只有一个 查看详情

opengles之基础光照模型的实现(代码片段)

一、OpenGLES基础光照模型OpenGLES目前还无法模拟现实世界的复杂光照效果,为了在效果要求和实现难度之间做一个平衡,往往采用一些简化的模型来模拟光照效果。冯氏光照模型(PhongLightingModel)便是其中常用的一个光照模型,... 查看详情

✠opengl-7-光照(代码片段)

目录光照模型光源材质ADS光照计算公式汇总实现ADS光照Phong反射模型自转与绕轴旋转(mMat*rMat!=rMat*mMat)法向量变换用到『逆转置矩阵』Blinn-Phong反射模型结合光照与纹理补充说明光照模型最常见的光照模型称为“ADS”模型:... 查看详情

opengl光照

 前面代码:https://files.cnblogs.com/files/zach0812/zcb202007121246.zip颜色:资料:https://learnopengl-cn.github.io/02%20Lighting/01%20Colors/  查看详情

OpenGL中的光照问题

】OpenGL中的光照问题【英文标题】:LightingissueinOpenGL【发布时间】:2009-06-1202:58:48【问题描述】:我在开发OpenGL应用程序时遇到问题。奇怪的是,我和我的一个朋友正在Linux下使用OpenGL开发3d场景,并且存储库中有一些代码,但... 查看详情

git第二天:git安装与常用命令

↑↑Java语法基础—>小型项目练习—>MySQL更多学习内容均更新在专栏了,记得关注专栏哦↑↑ 查看详情

问题理解 OpenGL 中的光照

】问题理解OpenGL中的光照【英文标题】:IssueUnderstandingLightinginOpenGL【发布时间】:2011-11-1102:13:49【问题描述】:我在理解光照在OpenGL中的工作原理时遇到了一些问题(尤其是理解预定义变量。在某处是否有它们的列表?)。我... 查看详情

OpenGL:如何解决 Cube 的光照问题?

】OpenGL:如何解决Cube的光照问题?【英文标题】:OpenGL:HowtoresolvethelightingproblemofCube?【发布时间】:2020-04-0202:58:34【问题描述】://VerticesinformationGLfloatvertices[]=1,1,1,-1,1,1,-1,-1,1,1,-1,1,//(front)1,1,1,1,-1,1,1,-1,-1,1,1,-1,//(right)1, 查看详情

opengl入门04.光照(代码片段)

光照包括环境光、漫反射和镜面反射。在OpenGL中,我们要使用光照,首先要初始化光照信息。//关闭背面渲染,提高效率glEnable(GL_CULL_FACE); //初始化灯光floatwhiteColor[]=1.0f,1.0f,1.0f,1.0f;//灯源位置floatlightPos[]=0.0f,1.0f,... 查看详情

OpenGL 光照着色器

】OpenGL光照着色器【英文标题】:OpenGLLightingShader【发布时间】:2018-04-1617:21:57【问题描述】:我无法理解OpenGL中较小着色器的概念。它是如何工作的?例如:我是否需要创建一个着色器用于在空间中定位对象,然后为另一个着... 查看详情

opengl学习----光照(代码片段)

0.光照处理时候,向量点乘一定要是标准化后的单位向量!!!1.冯氏光照模型:光照=环境光+漫反射+镜面反射vec3result=ambient+diffuse+specular;一般每一项的计算又分为几个小部分 partLight=S*K*M*O;S指光源颜色,K指这部分光照的显示... 查看详情

opengles光照效果

一个立方体光照模型环境光散射光镜面光为了演示光照效果,在前面学习过的内容基础上我们首先创建一个立方体,同时为了看起来直观一些,这个立方体每个面采用中心为白色,周围红色的渐变方案,不然看上去同样的颜色混... 查看详情

OpenGL VBO 法线/光照问题

】OpenGLVBO法线/光照问题【英文标题】:OpenGLVBONormals/LightingIssue【发布时间】:2012-10-2601:59:59【问题描述】:我无法使用VBO正确渲染法线。下面是我正在使用的代码,顶点是一个包含顶点的数组,法线是一个包含法线的数组://Cre... 查看详情

OpenGL 的旋转和光照问题

】OpenGL的旋转和光照问题【英文标题】:OpenGLissuewithrotationandlighting【发布时间】:2012-03-1122:48:19【问题描述】:我正在使用用于OpenGL的OpenTK和用于C#ide的monodevelop进行简单的太阳系模拟。进展顺利,我有行星围绕太阳运行,照明... 查看详情

opengl可编程管线基础光照的实现

在OpenGL中创建基础光照,主要的工作将模型中的法线信息和法线空间运算矩阵传入到shader中。另一方面,LightDir,ViewDir通常是在shader中从引擎参数获取的,为了简化光照模型的实现,这里我们可以在shader中写死。至于经典的ambient+... 查看详情