1,
为了将坐标从一个坐标系变换到另一个坐标系,我们需要用到几个变换矩阵,最重要的几个分别是模型(Model)、观察(View)、投影(Projection)三个矩阵。


Vclip
=MprojectionMviewMmodelVlocal

//colors.vs
layout (location = 0) in vec3 aPos;
uniform mat4 model;
uniform mat4 view;
uniform mat4 projection;
void main()
{gl_Position = projection * view * model * vec4(aPos, 1.0);}

2,

glm::mat4 _model;
glm::mat4 _view;
glm::mat4 _projection;
_model = glm::translate(_model, glm::vec3(1.2f, 1.0f, 2.0f));
_model = glm::scale(_model, glm::vec3(0.2f));
_model = glm::rotate(_model, glm::radians(-55.0f), glm::vec3(1.0f, 0.0f, 0.0f));
_view = glm::translate(_view, glm::vec3(0.0f, 0.0f, -3.0f));
_projection = glm::perspective(glm::radians(45.0f), screenWidth / screenHeight, 0.1f, 100.0f);
glUniformMatrix4fv(glGetUniformLocation(ID, "projection"), 1, GL_FALSE, &_projection[0][0]);
glUniformMatrix4fv(glGetUniformLocation(ID, "view"), 1, GL_FALSE, &_view[0][0]);
glUniformMatrix4fv(glGetUniformLocation(ID, "model"), 1, GL_FALSE, &_model[0][0]);

3,
//两个对象使用各自的片元着色器。
//使用同一个顶端缓存表示cube模型,在设置世界空间矩阵的时候各自调整scale、translate和rotate以放在不同位置。

unsigned int VBO ;
glGenBuffers(1, &VBO);
glBindBuffer(GL_ARRAY_BUFFER, VBO);
glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW);

unsigned int cubeVAO;
glGenVertexArrays(1, &cubeVAO);
glBindVertexArray(cubeVAO);
glBindBuffer(GL_ARRAY_BUFFER, VBO);
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 3 * sizeof(float), (void*)0);
glEnableVertexAttribArray(0);

// second, configure the light's VAO (VBO stays the same; the vertices are the same for the light object which is also a 3D cube)
// we only need to bind to the VBO (to link it with glVertexAttribPointer), no need to fill it; the VBO's data already contains all we need (it's already bound, but we do it again for educational purposes)

unsigned int lightVAO;
glGenVertexArrays(1, &lightVAO);
glBindVertexArray(lightVAO);
glBindBuffer(GL_ARRAY_BUFFER, VBO);
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 3 * sizeof(float), (void*)0);
glEnableVertexAttribArray(0);

4,

Shader lightingShader("colors.vs", "colors.fs");//cube shader
Shader lampShader("colors.vs", "lamp.fs");//光源shader

while (…)
{
glClearColor(0.1f, 0.1f, 0.1f, 1.0f);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

// be sure to activate shader when setting uniforms/drawing objects
lightingShader.use();
lightingShader.setVec3("objectColor", 1.0f, 0.5f, 0.31f);
lightingShader.setVec3("lightColor", 1.0f, 1.0f, 1.0f);
lightingShader.setMat4("projection", projection);
lightingShader.setMat4("view", view);
lightingShader.setMat4("model", model);
glBindBuffer(GL_ARRAY_BUFFER, VBO);
glBindVertexArray(cubeVAO); // render the cube
glDrawArrays(GL_TRIANGLES, 0, 36);

// also draw the lamp object
lampShader.use();
lampShader.setMat4("projection", projection);
lampShader.setMat4("view", view);
lampShader.setMat4("model", model);
glBindBuffer(GL_ARRAY_BUFFER, VBO);
glBindVertexArray(lightVAO);
glDrawArrays(GL_TRIANGLES, 0, 36);
//…
}

5,
我们在现实生活中看到某一物体的颜色并不是这个物体真正拥有的颜色,而是它所反射的(Reflected)颜色。换句话说,那些不能被物体所吸收(Absorb)的颜色(被拒绝的颜色)就是我们能够感知到的物体的颜色。
如果我们将白光照在一个蓝色的玩具上,这个蓝色的玩具会吸收白光中除了蓝色以外的所有子颜色,不被吸收的蓝色光被反射到我们的眼中,让这个玩具看起来是蓝色的。
我们可以定义物体的颜色为物体从一个光源反射各个颜色分量的大小
光色与物体颜色相乘即是反射的延伸至。
//colors.fs
out vec4 FragColor;
uniform vec3 objectColor;
uniform vec3 lightColor;
void main()
{
FragColor = vec4(lightColor * objectColor, 1.0);
}

//lamp.fs
out vec4 FragColor;
void main()
{
FragColor = vec4(1.0); // set alle 4 vector values to 1.0
}

光源其实不可见的,这里专门在光源位置画个固定白色的方块表示光源。
model = glm::translate(model, lightPos);

转载于:https://www.cnblogs.com/liuhan333/p/7284905.html

Opengl_20 _复习变换矩阵+复习光源+两个模型使用不同的shader相关推荐

  1. PE知识复习之PE的两种状态

    PE知识复习之PE的两种状态 一丶熟悉PE的整体结构 从下面依次网上看.可以得出PE结构 其中DOS头有DOS头结构 也就是 IMAGE_DOS_HEADER 关于结构体的各项属性.前边已经写过了.本 ...

  2. 宿迁学院计算机考点,考研:一年辛苦复习敌不过考试两天奔波 为什么宿迁学院不能设考点...

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 尊敬的校长: 您好! 很冒昧的给您写这封建议信,如果校长您看到了这封信我感到万分的荣幸.我是一名即将考研也是刚刚经历过研究生考试的大三学生,给您写这封信的 ...

  3. 【复习巩固】OSI七层模型

    [复习巩固]OSI七层模型 文章目录 [复习巩固]OSI七层模型 1.解释 2.分层 3.OSI模型通信过程 4.总结 1.解释 OSI七层模型 (Open System Interconnect), ...

  4. Heckman两阶段模型学习笔记

    有近两周的时间都在学习Heckman两阶段模型.网上看了一些资料,在CSDN里找到了几篇珍贵的学习笔记,有一篇相当于带我入了门学习笔记 | Heckman两阶段法介绍_Claire_chen_jia的 ...

  5. Pytorch两种模型保存方式

    以字典方式保存,更容易解析和可视化 Pytorch两种模型保存方式 大黑_7e1b关注 2019.02.12 17:49:35字数 13阅读 5,907 只保存模型参数 # 保存 torch.save ...

  6. 我跑了ERNIE和BERT两个模型,结果出乎意料......

    BERT和ERNIE,NLP领域近来最受关注的2大模型究竟怎么样? 刚刚有人实测比拼了一下,结果在中文语言环境下,结果令人意外又惊喜. 具体详情究竟如何?不妨一起围观下这篇技术评测. 写在前面 随着2 ...

  7. 运用高斯核模型进行最小二乘回归_数据科学 | 第8讲:模型选择与正则化

    点击上方"蓝字"带你去看小星星 模型选择,是指利用统计方法,从众多自变量中,选择显著的.最能解释因变量变化的那一部分自变量参与建模.在统计建模中,模型选择是重要的也是核心的步骤之一 ...

  8. (03)两个模型的交集、并集、差集

    前言 在做一碰撞检测时,犹豫一直无法实现,就行想到直接对两个模型求交集,如果交集部分为空,就说明其没有相交,于是使用了下面的方法,求模型的交集.(后来由于在不相交时一直有报错误,但在后来的研究中发现及 ...

  9. session-based recommendation的两个模型对比NARM, STAMP

    文章目录 介绍 模型介绍 NARM global encoder local encoder final model STAMP short-term memory long-term memory ...

最新文章

  1. 干货 | 第六期课程回顾遗传病基因检测和解读
  2. post postman 传值_postman参数传递
  3. 076_浏览器对象模型
  4. CocosCreator内置函数实现物体拖动
  5. java程序包怎么更新,从Java 8升级到Java 11-软件包sun.util不存在
  6. 数据、运营相关试题(三)【牛客网:数据运营试题广场】
  7. HenCoder Android 开发进阶:自定义 View 1-3 drawText() 文字的绘制
  8. 改手机为自动开机的车载导航仪
  9. plc secs通讯协议_一种SECS/GEM通讯方法与流程
  10. welearn考试切屏会有显示吗_welearn随行课堂班级测试答案
  11. 用模拟退火算法估价heston期权定价模型的五个参数
  12. 全球与中国具有集成保护功能的共模滤波器(CMF)市场深度研究分析报告
  13. 备案网站未正规绑定服务器,网站备案对收录到底有没有影响
  14. android tif浏览器,简单三步评测几款TIFF格式图片浏览器
  15. ONF执行主席Dan Pitt:SDNFV会聚而合
  16. 照片如何转换成pdf?手机电脑都可以轻松转换
  17. 进销存设计与分析_库存汇总表(13)
  18. javascript 模板_了解JavaScript中的模板文字
  19. 统计工作随笔—同比与环比(同期为负值)、百分点
  20. JavaScript学习笔记(九)(验证框架,layer弹出层)

热门文章

  1. 基于rancher在线安装k8s集群
  2. Python3 编程示例:斐波纳契数列
  3. Python3逻辑运算符
  4. springboot支持三种嵌入式servlet容器:tomcat(默认),jetty,undertow
  5. springboot集成redis配置多数据源
  6. MySQL数据库优化实战
  7. Spring Bean的获取与实例化
  8. 信号与线性系统分析_什么是线性系统?如何辨别控制系统?控制系统基本要求是什么?...
  9. centos安装android应用程序,centos7软件安装系列【二十一】安装android打包环境
  10. spring集成redis(ehcache缓存改成redis)