![](https://img-blog.csdnimg.cn/20201014180756780.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
计算机图形学
文章平均质量分 69
天将明兮
小白
展开
-
Learn OpenGL Anti Aliasing
超采样抗锯齿(Super Sample Anti-aliasing, SSAA):使用比正常分辨率更高的分辨率(即超采样)来渲染场景,当图像输出在帧缓冲中更新时,分辨率会被下采样(Downsample)至正常的分辨率。这些额外的分辨率会被用来防止锯齿边缘的产生。虽然它确实能够解决走样的问题,但是由于这样比平时要绘制更多的片段,它也会带来很大的性能开销。所以这项技术只拥有了短暂的辉煌。光栅化时,判断像素中心点是否位于要绘制的三角形内。多重采样抗锯齿(Multisample Anti-aliasing原创 2021-01-23 21:59:51 · 161 阅读 · 1 评论 -
LearnOpengl_高级数据
OpenGL中的缓冲只是一个管理特定内存块的对象。在我们将它绑定到一个缓冲目标(Buffer Target)时,我们才赋予了其意义。当我们绑定一个缓冲到GL_ARRAY_BUFFER时,它就是一个顶点数组缓冲,但我们也可以很容易地将其绑定到GL_ELEMENT_ARRAY_BUFFER。OpenGL内部会为每个缓冲目标储存一个缓冲,并且会根据目标的不同,以不同的方式处理缓冲。缓冲目标 Buffer TargetGL_ARRAY_BUFFERGL_ELEMENT_ARRAY_BUFFER操作缓冲 填充原创 2020-09-09 12:10:45 · 142 阅读 · 0 评论 -
LearnOpengl_StencilTest
模板测试模板测试在片段着色器之后,深度测试之前。一个Stencil Buffer中,每个模板值是8位的,glEnable(GL_STENCIL_TEST);glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);glStencilMask(0xFF); // 每一位写入模板缓冲时都保持原样glStencilMask(0x00); // 每一位在写入模板缓冲时都会变成0(禁用写入)//指定什么时候片原创 2020-09-01 12:30:24 · 127 阅读 · 0 评论 -
LearnOpengl_DepthTest
深度测试深度缓冲精度通常为24位GLSL内建变量gl_FragCoord的x、y分量代表了片段的屏幕空间坐标(原点在左下角)gl_FragCoord的z分量包含了片段真正的深度值,z值需要与震度缓冲内容所对比Early Depth Testing 提前深度测试会在片段着色器之前运行glEnable(GL_DEPTH_TEST);glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);glDepthMask(GL_FALSE);//设置深度缓冲为只读原创 2020-09-01 09:00:17 · 110 阅读 · 0 评论 -
LearnOpengl_assimp模型导入库
这篇文章主要记录一下opengl加载模型并显示的过程,涉及到了assimp库的下载、cmake编译、配置,以及Vertex、Mesh、Model对象的封装,使得我们可以直接使用一条指令就可以绘制一个包含多个网格的模型。一、assimp库的下载、编译、配置1.github的下载速度只有20kb,所以我们将github的工程转移到国内的gitee上进行下载。2.使用cmke编译assimp源代码时,会出现缺少dx的报错,我们需要下载安装dx,安装dx时我们需要先卸载掉c++ 2010 Redistribu原创 2020-08-29 00:04:56 · 322 阅读 · 0 评论 -
LearnOpengl_LightCaster
太阳光,即平行光,我们假设太阳光的位置离我们无限远,但是它的光照方向对于每个顶点都是相同的。//方向光着色器代码struct DirLight{ vec3 direction; vec3 ambient; vec3 diffuse; vec3 specular;};vec3 CalcDirLight(DirLight light, vec3 normal, vec3 viewDir){ vec3 lightDir = normalize(-light.direction);//平行原创 2020-08-27 11:04:41 · 108 阅读 · 0 评论 -
LearnOpengl_光照贴图
漫反射贴图 DiffuseMap镜面光贴图 SpecularMap放射光贴图Emission Map片元着色器代码:#version 330 coreout vec4 FragColor;in vec3 Normal; in vec3 FragPos; in vec2 TexCoords; struct Material { sampler2D diffuse;//漫反射贴图 sampler2D specular;//镜面光贴图 float shinine原创 2020-08-26 15:45:19 · 156 阅读 · 0 评论 -
LearnOpengl_LightingModel
简要记录一下opengl中的光照模型:冯氏光照模型:环境光、漫反射、镜面反射简化的全局照明模型:环境光照漫反射:片元到光源方向向量与片元法向量的夹角镜面反射:入射光线反射产生光线与观察向量的夹角//这是顶点着色器#version 330 corelayout (location = 0) in vec3 aPos;layout (location = 1) in vec3 aNormal;out vec3 FragPos;out vec3 Normal;uniform mat4 m原创 2020-08-26 00:35:17 · 81 阅读 · 0 评论 -
LearnOpengl_摄像机
键盘的WASD输入改变了摄像机的位置鼠标的移动改变了Pitch俯仰角和Yaw偏航角,我们根据Pitch和Yaw计算出摄像机新的Front向量鼠标滑轮改变Fov每帧都会根据摄像机的属性计算出新的LookAt矩阵由于改变了Fov,所以每帧也要重新计算投影矩阵下面是封装的摄像机类:#ifndef MYCAMERA_H#define MYCAMERA_H#include <glm/glm.hpp>#include <glm/gtc/matrix_transform.hpp>原创 2020-08-19 17:54:08 · 150 阅读 · 0 评论 -
LearnOpengl_坐标系统
我们之所以将顶点变换到各个不同的空间的原因是有些操作在特定的坐标系统中才有意义且更方便。例如,当需要对物体进行修改的时候,在局部空间中来操作会更说得通;如果要对一个物体做出一个相对于其它物体位置的操作时,在世界坐标系中来做这个才更说得通,等等。如果我们愿意,我们也可以定义一个直接从局部空间变换到裁剪空间的变换矩阵,但那样会失去很多灵活性。局部空间世界空间观察空间裁剪空间由投影矩阵创建的观察箱(Viewing Box)被称为平截头体(Frustum),每个出现在平截头体范围内的坐标都会最终出现在用原创 2020-08-18 16:58:18 · 105 阅读 · 0 评论 -
LearnOpengl_纹理
纹理环绕方式纹理坐标的范围通常是从(0, 0)到(1, 1),那如果我们把纹理坐标设置在范围之外会发生什么?OpenGL默认的行为是重复这个纹理图像(我们基本上忽略浮点纹理坐标的整数部分),但OpenGL提供了更多的选择:GL_REPEAT 对纹理的默认行为。重复纹理图像。GL_MIRRORED_REPEAT 和GL_REPEAT一样,但每次重复图片是镜像放置的。GL_CLAMP_TO_EDGE 纹理坐标会被约束在0到1之间,超出的部分会重复纹理坐标的边缘,产生一种边缘被拉伸的效果。GL_CLAM原创 2020-08-18 13:38:47 · 187 阅读 · 0 评论 -
LearnOpengl_变换
向量矩阵矩阵与向量相乘单位矩阵缩放位移旋转弧度转角度:角度=弧度*(180.0f / PI)角度转弧度:弧度=角度*(PI / 180.0f)矩阵的组合原创 2020-08-18 11:23:01 · 77 阅读 · 0 评论 -
LearnOpengl_封装着色器程序对象
在opengl中使用shader时,我们将glShaderProgram封装成一个Shader类,执行构造函数时,可以从本地文件中读出vertex和fragment的shader代码字符串,完成shader创建、编译,着色器程序的创建、链接。这是Shader.h#ifndef SHADER_H#define SHADER_H#include <glad/glad.h>#include <string>#include <fstream>#include原创 2020-08-17 14:49:57 · 125 阅读 · 0 评论 -
LearnOpengl_着色器_顶点属性
一个典型的着色器有下面的结构:#version version_numberint type in_variable_name;int type in_variable_name;out type out_variable_name;uniform type uniform_name;int main(){ ... out_variable_name = weird_stuff_we_processed;}顶点属性Vertex AttributeGL_MAX_VERTEX_A原创 2020-08-17 14:49:19 · 312 阅读 · 0 评论 -
LearnOpengl_glfw+glad_draw triangles
#include <glad/glad.h>#include <GLFW/glfw3.h>#include <iostream>void framebuffer_size_callback(GLFWwindow* window, int width, int height);void processInput(GLFWwindow *window);// settingsconst unsigned int SCR_WIDTH = 800;const原创 2020-08-16 18:45:12 · 144 阅读 · 0 评论 -
LearnOpengl_first
顶点数组对象:Vertex Array Object,VAO顶点缓冲对象:Vertex Buffer Object,VBO索引缓冲对象:Index Buffer Object,IBO顶点着色器:转换坐标。图元装配:将顶点装配成指定图元的形状,例如三角形、线段。几何着色器:产生新的顶点,构造出新的图元。光栅化:把图元映射为最终屏幕上相应的像素,生成供片段着色器使用的Fragment。片段着色器:计算一个像素的最终颜色。测试与混合:深度、模板、Alpha测试|混合。标准化设备坐标(Norma.原创 2020-08-16 17:54:05 · 90 阅读 · 0 评论