OpenGL
NelsonCheung
这个作者很懒,什么都没留下…
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
3.6多光源
多光源将“投光物”一章的三个光源的场景整合即可。#include "../env/glm/glm.hpp"#include "../env/glm/gtc/matrix_transform.hpp"#include "../env/glm/gtc/type_ptr.hpp"#include <iostream>#define STB_IMAGE_IMPLEMENTATION#include "../env/std_image.h"#include "../env/glad.h"原创 2020-11-01 15:10:07 · 233 阅读 · 0 评论 -
3.5 投光物
投光物将光投射(Cast)到物体的光源叫做投光物(Light Caster)。平行光当我们使用一个假设光源处于无限远处的模型时,它就被称为定向光,因为它的所有光线都有着相同的方向,它与光源的位置是没有关系的。因为所有的光线都是平行的,所以物体与光源的相对位置是不重要的,因为对场景中每一个物体光的方向都是一致的。由于光的位置向量保持一致,场景中每个物体的光照计算将会是类似的。点光源点光源是处于世界中某一个位置的光源,它会朝着所有方向发光,但光线会随着距离逐渐衰减。随着光线传播距离的增长逐渐削减光原创 2020-11-01 15:08:56 · 202 阅读 · 0 评论 -
3.4 光照贴图
光照贴图引入漫反射和镜面光贴图(Map),允许我们对物体的漫反射分量)和镜面光分量有着更精确的控制。漫反射贴图漫反射贴图相当于纹理,实际上这两者都已一张覆盖物体的图像,让我们能够逐片段索引其独立的颜色值。镜面光贴图通过使用镜面光贴图我们可以可以对物体设置大量的细节,比如物体的哪些部分需要有闪闪发光的属性,我们甚至可以设置它们对应的强度。镜面光贴图能够在漫反射贴图之上给予我们更高一层的控制。code漫反射贴图+镜面光贴图#include "../env/glm/glm.hpp"#includ原创 2020-10-31 23:57:30 · 324 阅读 · 0 评论 -
3.3 材质
材质如果我们想要在OpenGL中模拟多种类型的物体,我们必须为每个物体分别定义一个材质(Material)属性。我们为每个冯氏光照模型的分量都定义一个颜色向量。ambient材质向量定义了在环境光照下这个物体反射得是什么颜色,通常这是和物体颜色相同的颜色。diffuse材质向量定义了在漫反射光照下物体的颜色。(和环境光照一样)漫反射颜色也要设置为我们需要的物体颜色。specular材质向量设置的是镜面光照对物体的颜色影响(或者甚至可能反射一个物体特定的镜面高光颜色)。shininess影响镜面原创 2020-10-31 23:56:14 · 288 阅读 · 0 评论 -
3.2 基础光照
基础光照现实世界的光照是极其复杂的,而且会受到诸多因素的影响,这是我们有限的计算能力所无法模拟的。因此OpenGL的光照使用的是简化的模型。其中一个模型是Phong光照模型,其主要有三个分量组成,环境(ambient)、漫反射(diffuse)和镜面光照(specular)。环境光照我们使用一个很小的常量(光照)颜色,添加到物体片段的最终颜色中,这样子的话即便场景中没有直接的光源也能看起来存在有一些发散的光。把环境光照添加到场景里非常简单。我们用光的颜色乘以一个很小的常量环境因子,再乘以物体的颜色原创 2020-10-31 23:55:24 · 318 阅读 · 0 评论 -
3.1 颜色
颜色现实世界中有无数种颜色,每一个物体都有它们自己的颜色。我们需要使用有限的数值来模拟真实世界中无限的颜色,所以并不是所有现实世界中的颜色都可以用数值来表示的。颜色可以数字化的由红色(Red)、绿色(Green)和蓝色(Blue)三个分量组成,它们通常被缩写为RGB。仅仅用这三个值就可以组合出任意一种颜色。我们在现实生活中看到某一物体的颜色并不是这个物体真正拥有的颜色,而是它所反射的颜色。换句话说,那些不能被物体所吸收的颜色就是我们能够感知到的物体的颜色在图形领域中,当我们把光源的颜色与物体的颜色值原创 2020-10-31 17:36:24 · 667 阅读 · 0 评论 -
2.7 摄像机
摄像机摄像机的位置由其在世界空间的位置、观察的方向、一个指向他右侧的向量、指向它上方的向量构成。实际上,我们创建了一个三个单位轴相互垂直的、以摄像机位置为原点的坐标系。摄像机位置摄像机位置使用一个指向摄像机位置的向量来表示。ZZZ轴从屏幕指向我。摄像机方向摄像机指向ZZZ轴的负方向,我们希望摄相机的方向向量指向ZZZ轴的正向,因此方向向量direction=摄像机位置−观察位置方向向量direction=摄像机位置-观察位置方向向量direction=摄像机位置−观察位置上向量上向量u原创 2020-10-31 09:47:29 · 282 阅读 · 0 评论 -
2.6 坐标系统
坐标系统我们总共会涉及到5个不同的坐标系统。局部空间(Local Space,或者称为物体空间(Object Space))世界空间(World Space)观察空间(View Space,或者称为视觉空间(Eye Space))裁剪空间(Clip Space)屏幕空间(Screen Space)我们的顶点坐标起始于局部空间(Local Space),在这里它称为局部坐标(Local Coordinate),它在之后会变为世界坐标(World Coordinate),观察坐标(View C原创 2020-10-31 09:46:33 · 938 阅读 · 0 评论 -
2.5 变换
变换有个易于使用,专门为OpenGL量身定做的数学库,那就是GLM。GLM是OpenGL Mathematics的缩写,它是一个只有头文件的库,也就是说我们只需包含对应的头文件就行了,不用链接和编译。OpenGL开发者通常使用一种内部矩阵布局,叫做列主序(Column-major Ordering)布局。GLM的默认布局就是列主序。code旋转、平移变换#include "../env/glm/glm.hpp"#include "../env/glm/gtc/matrix_transform.原创 2020-10-31 09:45:38 · 188 阅读 · 0 评论 -
2.4纹理
纹理纹理是一个2D图片(甚至也有1D和3D的纹理),它可以用来添加物体的细节。为了能够把纹理映射到三角形上,我们需要指定三角形的每个顶点各自对应纹理的哪个部分。这样每个顶点就会关联着一个纹理坐标(Texture Coordinate),用来标明该从纹理图像的哪个部分采样。之后在图形的其它片段上进行片段插值(Fragment Interpolation)。纹理坐标在x和y轴上,范围为0到1之间。纹理坐标起始于(0, 0),也就是纹理图片的左下角,终始于(1, 1),即纹理图片的右上角。纹理环绕方式当原创 2020-10-31 09:41:53 · 395 阅读 · 0 评论 -
2.3 着色器
着色器着色器是使用一种叫GLSL的类C语言写成的。GLSL是为图形计算量身定制的,它包含一些针对向量和矩阵操作的有用特性。着色器的开头总是要声明版本,接着是输入和输出变量、uniform和main函数。每个着色器的入口点都是main函数,在这个函数中我们处理所有的输入变量,并将结果输出到输出变量中。一个典型的GLSL编写的着色器有下面结构。#version version_numberin type in_variable_name;in type in_variable_name;out原创 2020-10-31 09:40:27 · 301 阅读 · 0 评论 -
2.2 你好,三角形
你好,三角形图形渲染管线在OpenGL中,任何事物都在3D空间中,而屏幕和窗口却是2D像素数组,这导致OpenGL的大部分工作都是关于把3D坐标转变为适应你屏幕的2D像素。3D坐标转为2D坐标的处理过程是由OpenGL的图形渲染管线管理的。图形渲染管线可以被划分为几个阶段,每个阶段将会把前一个阶段的输出作为输入。所有这些阶段都是高度专门化的,并且很容易并行执行。正是由于它们具有并行执行的特性,当今大多数显卡都有成千上万的小处理核心,它们在GPU上为每一个阶段运行各自的小程序,从而在图形渲染管线中快速处原创 2020-10-29 18:36:50 · 292 阅读 · 0 评论 -
2.1 你好,窗口
你好,窗口#include "../env/glad.h"#include "../env/glfw3.h"#include <iostream>void framebuffer_size_callback(GLFWwindow *window, int width, int height);void processInput(GLFWwindow *window);int main(){ // 初始化GLFW glfwInit(); // 配置GLFW原创 2020-10-29 18:32:32 · 193 阅读 · 0 评论 -
1 简介
1 简介资料地址:Learn OpenGL CNOpenGL是一个图形API,并不是一个独立的平台,它需要一个编程语言来工作,在这里我们使用的是C++。一般它被认为是一个API(Application Programming Interface, 应用程序编程接口),包含了一系列可以操作图形、图像的函数。然而,OpenGL本身并不是一个API,它仅仅是一个由Khronos组织制定并维护的规范(Specification)。OpenGL自身是一个巨大的状态机(State Machine):一系列的原创 2020-10-29 18:31:43 · 167 阅读 · 0 评论
分享