![](https://img-blog.csdnimg.cn/20201014180756927.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
opengl
Fatestay_DC
这个作者很懒,什么都没留下…
展开
-
PBO 摄像机类的实现 第一人称第三人称的效果
PBO快速向显卡传输 读取数据读取数据声明 pbo创建一个 pbo对象 glGenBuffers(1,&_pbo);绑定glBindBuffer(GL_PIXEL_PACK_BUFFER,_pbo); //从显卡读取数据glBufferData(GL_PIXEL_PACK_BUFFER,_width*_height*4,0,GL_STREAM_READ);glBindBuffer(GL_PIXEL_PACK_BUFFER,0); //回复状态绘制完主窗口读取数据//DMA控制原创 2021-04-12 20:28:11 · 394 阅读 · 0 评论 -
显示列表 VBO IBO Pbuffer 帧缓冲 获取屏幕数据
显示列表打包所有状态到显存 不需要每次都调用那么多函数创建显示列表_cubeDisplay = 1;glNewList(_cubeDisplay,GL_COMPILE); renderCube();结束指令glEndList();绘制glCallList(_cubeDisplay);一个指令完成之前的绘制命令也可以将显示列表放在一个数组里面 unsigned char list[] = {_cubeDisplay,_maskDisplay};绘制原创 2021-04-10 15:17:35 · 364 阅读 · 0 评论 -
帧动画 视频纹理
帧动画动态修改uv 采样大图上面的区域 依次显示形成帧动画#include <windows.h>#include <tchar.h>#include <math.h>#include "FreeImage.h"#include "CELLMath.hpp"#include "OpenGLWindow.h"#include <gl/GLU.h>#include <vector>using namespace CELL;原创 2021-03-31 20:22:33 · 253 阅读 · 0 评论 -
纹理矩阵 多张纹理叠加 云雾效果 环境纹理
纹理矩阵使用纹理矩阵实现之前的广告牌效果取消之前cpu的顶点uv赋值直接使用纹理矩阵操作glMatrixMode(GL_TEXTURE); glTranslatef(0,0.001f,0);#include <windows.h>#include <tchar.h>#include <math.h>#include "FreeImage.h"#include "CELLMath.hpp"#include "OpenGLWindow.h"原创 2021-03-25 19:21:20 · 242 阅读 · 0 评论 -
纹理包装滤波 多重纹理 纹理局部更新 广告牌效果
纹理wrap设置其中一些repeat 默认 重复clamp 超过1用最边缘的往上填充clamp_to_edge 用其中一点去填充mirrored_repeat 镜像重复例如:glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_WRAP_S,GL_MIRRORED_REPEAT);纹理滤波放大 mag 采样方式NEARESTLINEAR缩小 minmipmap 如果纹理没有 就不支持mipmap glTexImage2D(GL_TEXTURE_2原创 2021-03-22 20:22:31 · 139 阅读 · 0 评论 -
使用FreeImage操作纹理映射
纹理映射1.扩展顶点结构体 增加uv坐标struct Vertex{ float x, y, z; float u,v;};声明纹理句柄标识GLuint _texture;初始化对纹理相关进行设置开启纹理映射生成纹理缓存绑定句柄标识到当前操作纹理对象随机生成颜色作为纹理数据纹理滤波设置根据上面的data生成一个2D纹理绘制时候 开启纹理数组指定uv坐标#include <windows.h>#include <tchar.h>#inc原创 2021-03-17 20:44:19 · 206 阅读 · 0 评论 -
opengl 透视投影以及模型矩阵的简单操作
透视投影使用glu方法gluPerspective#include <windows.h>#include <tchar.h>#include <math.h>#include "CELLMath.hpp"#include "OpenGLWindow.h"#include <vector>using namespace CELL;class SamplerPerspective :public OpenGLWindow{publ原创 2021-03-16 20:34:39 · 301 阅读 · 0 评论 -
线条样式颜色 以及平滑
#include <windows.h>#include <tchar.h>#include <math.h>#include "CELLMath.hpp"#include "OpenGLWindow.h"#include <vector>using namespace CELL;class SamplerSplineEditor :public OpenGLWindow{public: std::vector<float3&原创 2021-03-09 19:50:37 · 112 阅读 · 0 评论 -
spline曲线使用
spline曲线绘制导入头文件 CELLMath.hpp1.初始化spline对象 定义几个关键点 根据时间t插值 获得点集合2.进行绘制#include <math.h>#include "CELLMath.hpp"#include "OpenGLWindow.h"#include <vector>using namespace CELL;class SamplerSpline :public OpenGLWindow{public: std::ve原创 2021-03-09 19:47:47 · 1033 阅读 · 0 评论 -
opengl实现贝塞尔曲线
#include <windows.h>#include <tchar.h>#include <math.h>#include "OpenGLWindow.h"class SamplerTriangle :public OpenGLWindow{public: struct Vertex { float x,y,z,r,g,b; }; Vertex _line[360]; virtual void render()原创 2021-03-08 20:20:52 · 302 阅读 · 0 评论 -
多光源
整理之前三种光源的光照计算方式:#version 330 corein vec3 FragPos;in vec3 Normal;in vec2 texcoord;out vec4 FragColor;struct Materail{ vec3 ambient; sampler2D diffuse; sampler2D specular; float shininess;};uniform Materail materail;uniform vec3 objColor;un原创 2020-09-17 12:15:28 · 126 阅读 · 0 评论 -
光源
平行光当一个光源很远的时候,来自光源的每条光线接近于平行。这看起来就像所有的光线来自于同一个方向,无论物体和观察者在哪儿。当一个光源被设置为无限远时,它被称为平行光(Directional Light),因为所有的光线都有着同一个方向;它会独立于光源的位置。平行光跟光源的位置无关 与旋转角相关1.构建平行光类#pragma once#include <glm/glm.hpp>#include <glm/gtx/rotate_vector.hpp>class Ligh原创 2020-09-17 10:16:11 · 262 阅读 · 0 评论 -
光照贴图
漫反射贴图使用一张图片覆盖住物体,以便我们为每个原始像素索引独立颜色值。在光照场景中,通过纹理来呈现一个物体的diffuse颜色,这个做法被称做漫反射贴图。1.修改fragshader中diffuse的类型为 sampler2D,对贴图根据传入的UV坐标进行采样layout (location = 2) in vec2 aTexcoord;void main(){ ... texcoord = aTexcoord;}in vec2 texcoord;out vec4 FragColor原创 2020-09-10 10:21:32 · 132 阅读 · 0 评论 -
材质
描述物体的时候,我们可以使用3种光照元素:环境光照(Ambient Lighting)、漫反射光照(Diffuse Lighting)、镜面光照(Specular Lighting)定义一个材质颜色。通过为每个元素指定一个颜色,我们已经对物体的颜色输出有了精密的控制。现在把一个镜面高光元素添加到这三个颜色里1.片段着色器中添加材质结构体struct Materail{ vec3 ambient; vec3 diffuse; vec3 specular; float shininess;};原创 2020-09-07 11:36:41 · 140 阅读 · 0 评论 -
phong光照模型
phong光照模型 经验模型phong光照模型 = 环境光+漫反射+镜面高光环境光:光通常都不是来自于同一光源,而是来自散落于我们周围的很多光源,即使它们可能并不是那么显而易见。光的一个属性是,它可以向很多方向发散和反弹,所以光最后到达的地点可能并不是它所临近的直射方向;光能够像这样反射(Reflect)到其他表面,一个物体的光照可能受到来自一个非直射的光源影响。考虑到这种情况的算法叫做全局照明(Global Illumination)算法,但是这种算法既开销高昂又极其复杂。所以我们将会使用一种简化的原创 2020-09-04 16:50:20 · 938 阅读 · 0 评论 -
颜色
乘法经验公式光照/环境光 乘上 物体表面颜色 = 到人眼感知的颜色修改片段着色器 增加环境光 物体颜色变量#version 330 corein vec4 vertexColor;in vec2 texcoord;out vec4 FragColor;uniform sampler2D ourTexture;//uniform vec4 ourColor; uniform sampler2D ourFace;uniform vec3 objColor;uniform vec3原创 2020-08-19 12:10:38 · 133 阅读 · 0 评论 -
摄像机
观察矩阵把所有的世界坐标变换到观察坐标,这些新坐标是相对于摄像机的位置和方向的。定义一个摄像机,我们需要一个摄像机在世界空间中的位置、观察的方向、一个指向它的右测的向量以及一个指向它上方的向量。根据摄像机的位置 以及场景原点 上向量 构造出一个相机并且使用glm提供的lookAt方法计算出viewMatrixCamera::Camera(glm::vec3 position, glm::vec3 target, glm::vec3 worldUp){ Position = position; Fo原创 2020-08-14 16:48:19 · 115 阅读 · 0 评论 -
坐标系
OpenGL希望在所有顶点着色器运行后,所有我们可见的顶点都变为标准化设备坐标(Normalized Device Coordinate, NDC)。也就是说,每个顶点的x,y,z坐标都应该在-1.0到1.0之间,超出这个坐标范围的顶点都将不可见。我们通常会自己设定一个坐标的范围,之后再在顶点着色器中将这些坐标转换为标准化设备坐标。然后将这些标准化设备坐标传入光栅器(Rasterizer),再将他们转换为屏幕上的二维坐标或像素。将坐标转换为标准化设备坐标,接着再转化为屏幕坐标的过程通常是分步,也就是类似于原创 2020-08-13 10:49:55 · 352 阅读 · 0 评论 -
变换
1.缩放2.旋转3.位移4.组合变换使用矩阵进行变换的真正力量在于,根据矩阵之间的乘法,我们可以把多个变换组合到一个矩阵中。让我们看看我们是否能生成一个变换矩阵,让它组合多个变换。假设我们有一个顶点(x, y, z),我们希望将其缩放2倍,然后位移(1, 2, 3)个单位。我们需要一个位移和缩放矩阵来完成这些变换。结果的变换矩阵看起来像这样:注意,当矩阵相乘时我们先写位移再写缩放变换的。矩阵乘法是不遵守交换律的,这意味着它们的顺序很重要。当矩阵相乘时,在最右边的矩阵是第一个与向量相乘的原创 2020-08-11 14:20:02 · 145 阅读 · 0 评论 -
纹理
1.纹理坐标纹理坐标在x和y轴上,范围为0到1之间(注意我们使用的是2D纹理图像)。使用纹理坐标获取纹理颜色叫做采样(Sampling)。纹理坐标起始于(0, 0),也就是纹理图片的左下角,终始于(1, 1),即纹理图片的右上角。2.纹理环绕方式GL_REPEAT 对纹理的默认行为。重复纹理图像。 GL_MIRRORED_REPEAT 和GL_REPEAT一样,但每次重复图片是镜像放置的。 GL_CLAMP_TO_EDGE 纹理坐标会被约束在0到1之间,超出的部分会重复原创 2020-08-10 17:18:54 · 198 阅读 · 0 评论 -
shader-增加shader类
shader类1.读取shader文件,从文件中读取最终获取字符数组2.创建 编译 链接 使用着色器3.shader运行相关错误打印方法#pragma once#include <string>class Shader{public: Shader(const char* vertextPath, const char* fragmentPath); std::string vertexString; std::string fragmentStrimg; con原创 2020-07-31 17:20:56 · 175 阅读 · 0 评论 -
shader-顶点颜色属性
1.顶点除了包含位置信息之外增加颜色属性2.取顶点属性数据 步长 以及偏移量3.上面的0 1 对应shader中的location#include <iostream>using namespace std;#include <GL/glew.h>#include <GLFW/glfw3.h>void processInput(GLFWwindow *window);float vertices[] = { 0.5f, 0.5f, 0.0原创 2020-07-30 20:30:26 · 643 阅读 · 0 评论 -
shader输入输出 以及uniform
#include <iostream>using namespace std;#include <GL/glew.h>#include <GLFW/glfw3.h>void processInput(GLFWwindow *window);float vertices[] = { 0.5f, 0.5f, 0.0f, // top right 0.5f, -0.5f, 0.0f, // bottom right -0.5f, -0.5f,原创 2020-07-30 20:14:20 · 344 阅读 · 0 评论 -
三角形渲染
OpenGL渲染时涉及到的数据传输准备好需要绘制的顶点数据。(自己定义的或者是从某些模型文件中读取出来的)在GPU中开辟一块内存。将顶点数据传到上一步开辟的GPU的内存中。将着色器代码转化为着色器程序,并链接到当前的执行程序中。GPU根据着色器的逻辑将这块内存的数据进行计算。(指定该如何将数据发送给显卡)将这块已经计算完的数据一并发送给显卡进行渲染绘制。上述流程中涉及到的内存根据上面的流程,可知整个数据渲染的流程中,涉及到两个数据传输的流程,一个是将数据传输到GPU中的内存、另一个是将GPU原创 2020-07-28 19:20:54 · 469 阅读 · 0 评论 -
opengl绘制窗口
#include <iostream>using namespace std;#define GLEW_STATIC#include <GL/glew.h>#include <GLFW/glfw3.h>void processInput(GLFWwindow *window);int main(){ glfwInit(); //初始化glfw库 glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3); glfw原创 2020-07-17 11:20:33 · 228 阅读 · 1 评论 -
OpenGL介绍
OpenGL是图形硬件的一种软件接口,这个接口包含函数超过700个左右,这些函数用于指定物体和操作,创建交互式三维应用程序。 OpenGL图形系统的功能非常强大,程序相当复杂,但是许多实用的OpenGL的基本程序结构可能比较简单,主要任务是就是初始化一些状态,并制定需要渲染的物体。GLUT函数库 窗口管理 glutInit对GLUT进行初始化,并处理所有命令行参数,在其他glut函数之前调用原创 2015-08-21 16:11:55 · 397 阅读 · 0 评论 -
OpenGL简单图形绘制
#include "stdafx.h"#include <math.h>const int n=50;const GLfloat R=1;const GLfloat Pi=3.1415926f;const GLfloat factor = 0.1f;static int day=200;void myDisplay(){ int i; //glClear(GL_COL原创 2015-08-20 15:53:22 · 607 阅读 · 0 评论 -
顶点数组以及解引用单个数组
法线向量 物体的法线向量定义了他的表面在空间中的方向。具体地说定义了他相对于光源的方向。OpenGL使用法线向量确定了这个物体各个顶点所接受的光照。在定义物体的几何形状时,同时也定义了他的法线向量。可以使用glNormal*()函数,把当前法线向量设置为这个函数所标示的值,以后调用glVertex*()时,就会把当前法线向量分配给所指定的顶点。每个顶点尝尝具有不同的法线,所以需要交替调用这个函数。原创 2015-08-27 13:11:45 · 980 阅读 · 0 评论 -
绘制几何体(二)
基本状态管理 OpenGl维护了许多状态和状态变量。物体在进行渲染时可能会使用光照,纹理,隐藏表面消除,雾以及其它影响物体外观的状态。在默认情况下这些状态大部分是处于不活动状态的,激活这些状态可能需要较大开销。 打开关闭使用这些状态以下函数:可以向以下函数传枚举值作为参数Void glEnable();Void glDiasble();可以使用GLboolean glIsEnabled()函数原创 2015-08-24 15:57:27 · 834 阅读 · 0 评论 -
状态管理和绘制几何体(一)
状态管理和绘制几何体 绘图工具箱 清除窗口:在计算机中,保存图片的内存通常被计算机所绘制的前一幅图像所填充,因此在绘制新场景前,一般需要把它清楚为某背景颜色。像素颜色存储在名为位平面的图形硬件中采用两种存储方式:可以把像素颜色RGBA直接存储在位平面,也可以存储为一个颜色索引值,用它来饮用颜色查找表中的一个颜色项。glClearColor(0.0,0.0,0.0,0.0);glClear(GL原创 2015-08-24 11:22:17 · 624 阅读 · 0 评论