自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(182)
  • 资源 (3)
  • 收藏
  • 关注

原创 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 368

原创 显示列表 VBO IBO Pbuffer 帧缓冲 获取屏幕数据

显示列表打包所有状态到显存 不需要每次都调用那么多函数创建显示列表_cubeDisplay = 1;glNewList(_cubeDisplay,GL_COMPILE); renderCube();结束指令glEndList();绘制glCallList(_cubeDisplay);一个指令完成之前的绘制命令也可以将显示列表放在一个数组里面 unsigned char list[] = {_cubeDisplay,_maskDisplay};绘制

2021-04-10 15:17:35 349

原创 帧动画 视频纹理

帧动画动态修改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 239

原创 纹理矩阵 多张纹理叠加 云雾效果 环境纹理

纹理矩阵使用纹理矩阵实现之前的广告牌效果取消之前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 235

原创 纹理包装滤波 多重纹理 纹理局部更新 广告牌效果

纹理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 138

原创 使用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 198

原创 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 293

原创 线条样式颜色 以及平滑

#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 105

原创 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 1001

原创 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 287

原创 屏幕后处理效果

建立一个基本的屏幕后处理脚本系统屏幕后处理:指的是渲染完整个场景得到屏幕图像后,再对整个图像进行一系列操作,实现各种屏幕特效。使用这种技术,可以为游戏画面添加更多效果,景深,运动模糊想要实现屏幕后处理的基础在于得到渲染后的屏幕图像,抓取屏幕Unity提供了接口OnRenderImage函数Unity会把当前渲染得到的图像存储在第一个参数对应的渲染纹理中,通过函数中一系列操作后,再把目标渲染纹理,第二个参数对应的渲染纹理显示到屏幕上。在OnRenderImage函数中,通常利用Garphics.Bilt函数

2021-01-26 20:14:43 374

原创 动画

Unity Shader中内置变量(时间)动画效果往往都是把时间添加到一些变量的计算中,以便时间变化画面跟着变化。UnityShader提供了一系列关于时间的内置变量来允许我们方便的在Shader中进行访问运行时间,实现动画效果。纹理动画序列帧动画依次播放一系列关键帧图像,播放速度达到一定数值,看起来是一个连续动画,优点在于灵活性强,不需要进行任何物理计算就可以得到细腻的动画效果,缺点明显,序列帧需要美术工程量较大。Shader "Unity Shaders Book/SequenceAnima

2021-01-14 18:56:07 125

原创 高级纹理

立方体纹理立方体纹理时环境映射的一种实现方法,环境映射可以模拟物体的周围环境。立方体采样需要提供一个三维的纹理坐标,这个三维纹理坐标表示在世界空间下的一个方向。该方向从立方体中心出发,外部延伸时会和立方体6个纹理之一发生相交,采样得到的结果就是由该交点计算而来。使用立方体纹理的好处在于,实现简单快速,效果较好。缺点,场景中引入新的物体光源,或者物体位移,需要重新生成立方体纹理。立方体纹理仅可以反射环境,不能反射使用了该立方体纹理的本身。立方体不能模拟多次反射结果,由于这样,尽量对凸面体使用立方体纹理。天

2021-01-06 19:51:36 273

原创 Unity复杂光照

Unity渲染路径Unity里,渲染路径决定了光照是如何应用到Unity Shader中的,因此,如果跟光源打交道,需要为每个Pass指定使用的渲染路径,只有这样,Unity才会把光源和处理后的光照信息放到数据里,也就是说只有为Shader正确选择和设置了需要的渲染路径,Shader的光照计算才能正确执行。Unity支持多种类型的渲染路径,前向渲染,延迟渲染。大多情况下,一个项目只使用一种渲染路径,因此可以为整个项目设置渲染路径,需要在Project Setting设置,默认选择是前向渲染路径,有时候

2020-12-25 12:36:14 230

原创 透明效果

实时渲染中实现透明效果,通常会在渲染模型时控制透明通道。当开启透明混合后,一个物体被渲染到屏幕上时,每个片元除了颜色值和深度值之外,还有另外的属性,透明度。透明度为1表示像素完全不透明,当为0时,表示像素完全不显示。Unity中有两种方法实现透明效果,一种是透明度测试,这种方法无法得到真正的半透明效果,另一种是透明度混合。对于不透明物体,不考虑渲染顺序也能得到正确的排序效果,是因为强大的深度缓冲的存在。实时渲染中,深度缓冲用于解决可见性问题,决定了哪个物体的哪些部分会被渲染在前面,哪些部分会被其他物体遮

2020-12-16 18:50:47 382

原创 基础纹理

纹理最初的目的是使用一张图片来控制模型的外观,使用纹理映射技术,可以把一张图黏在模型表面,逐纹素的控制模型颜色。美术人员建模时候,通常会在建模软件中利用纹理展开技术把纹理坐标存储在每个顶点。纹理映射坐标定义了该顶点在纹理中对应的2D坐标。通常,这些坐标使用一个二维变量uv来表示,u是横向坐标v是纵向坐标因此纹理坐标也称为UV坐标。顶点UV坐标的范围通常都被归一化到[0,1]之间,需要注意的是,纹理采样的纹理坐标不一定在这个范围,实际上,这种不在[0,1]的范围内的纹理坐标有时候非常有用,与之相关的是纹理的

2020-12-08 11:25:08 260

原创 Unity中的基础光照

标准光照模型只关心直接光照,也就是直接从光源发射到物体表面后,经过物体表面的一次反射直接进入摄像机的光线。基本方法是,把进入摄像机内的光线分为4各部分,每个部分使用一种方法计算贡献度。自发光部分:用于描述给给定一个方向时,一个表面本身会向该方向发射多少的辐射量,如果没有使用全局光照技术,这些自发光表面并不会真的照亮周围的物体,而是他本身看起来更亮了。高光反射部分:用于描述当光线从光源照射到模型表面时,该表面会在完全镜面反射方向散射多少辐射量。漫反射部分:用于描述光线从光源照射到模型表面时,该表面会向每

2020-12-03 18:34:39 293

原创 UnityShader结构基础

一个最简单的顶点片元着色器顶点片元的基本结构Shader "ShaderStruct"{ Properties{ //属性 } SubShader { //针对显卡A的SubShader Pass { //设置渲染状态和标签 //开始CG代码片段 CGPROGRAM //代码片段的编译指令 #pragma vertex vert #pragma fragment frag //cg代码 ENDCG //其他设置 }

2020-11-30 19:15:09 190

原创 UnityShader数学基础

左手右手坐标系二维坐标系尽管x和y指向虽然可能不同,但总可以通过一些旋转操作来使他们的坐标轴指向相同,从这种意义上来说,所有的二维笛卡尔坐标系都是等价的。但对于三维笛卡尔坐标系,靠旋转并不能让两个不同朝向的坐标系重合,也就是说,三维笛卡尔坐标系并不都是等价的。因此,出现了两种不同的三维坐标系:左手坐标系和右手坐标系。我们可以用双手来判断一个坐标系的旋向性,举起左手,食指和大拇指摆出一个L手势,并且让食指指向上,大拇指向右,然后伸出中指,应该是指向前方,这样就是一个左手坐标系,大拇指食指以及中指分别对应了

2020-11-27 17:25:51 438

原创 UnityShader基础

Unity Shader是Unity为开发者提供的高级抽象渲染层,Unity希望通过这种方式让开发者更加轻松的控制渲染 如下图Unity Shader都是使用ShaderLab来编写的,ShaderLab是Unity提供的编写Unity Shader的一种说明性语言。使用了一些嵌套在花括号内部的语义来描述一个Unity Shader文件的结构。这些结构包含了许多渲染所需要的数据,例如Properties语句中定义了着色器需要的属性,这些属性将会出现在材质面板。他定义了要显示一个材质所需要的全部东西,而不

2020-11-17 15:41:51 251

原创 渲染流水线

渲染流水线渲染流水线的工作任务是:由一个三维场景触发 生成渲染一张二维图像,这个过程是由GPU与CPU共同完成的。一个渲染流程 可以分成三个部分:应用阶段 几何阶段以及光栅化阶段。这三个只是概念性阶段,每个阶段通常本身也是一个流水线系统,包含了子流水线阶段。概念流水线阶段应用阶段:由CPU负责实现,开发者具有这个阶段的绝对控制权。这一阶段的任务:首先需要准备好场景相关数据;其次为了提高渲染性能,一般需要做一个粗粒度的Culling,把那些不可见的物体剔除出去。最后需要设置每个模型的渲染状态,这些状态

2020-11-16 19:27:01 178

原创 实现棋盘图案

条纹我将采用模型表面的世界位置来生成棋盘纹理,这样我们以后就可以移动和旋转模型,并且生成的图案可以放在一起。 如果要图案化以随模型移动和旋转,则还可以使用对象空间坐标(来自appdata的坐标,不与任何东西相乘)。要在片段着色器中使用世界位置,我们将世界位置添加到顶点以对结构进行片段化,然后在顶点着色器中生成世界位置并将其写入结构中。//从顶点传递到片段着色器的数据同时被光栅化插值struct v2f{ float4 position : SV_POSITION; float3 worldPos

2020-11-05 18:23:09 448

原创 三向贴图

我之前做了一个有关平面贴图的教程。 该技术的最大缺点是,它只能从一个方向工作,并且我们绘制的表面如果未对准要映射的方向时会断裂(在上一个示例中为向上)。 改进自动uv生成的一种方法是,我们从不同的方向进行三次映射,并在这三种颜色之间进行混合。本教程将基于平面贴图着色器(这是一个未着色的着色器)建立的,但是您可以将该技术用于许多着色器,包括表面着色器计算投影平面要生成三组不同的UV坐标,我们首先更改获取UV坐标的方式。 从顶点着色器返回返回世界位置,然后在片段着色器中生成UV坐标。//从顶点传递到片段

2020-11-05 15:56:04 440

原创 颜色插值

通常,要在屏幕上绘制的输出中会有不止一种颜色。 组合两种颜色的一种简单方法是根据其他参数在它们之间进行插值。本教程将基于简单的纹理着色器,但是您可以将该技术与包括表面着色器在内的任何着色器一起使用。基于颜色的插值我们实现着色器的第一个版本将基于值在两个纯色之间进行插值。 因此,我们现在不需要连接到uv坐标或纹理的变量,而是添加了第二个颜色变量和一个简单的值,该值将确定材质是否显示第一个或者第二个颜色。 我们将该混合属性定义为“范围”,以便在编辑器中获得一个不错的滑块。//编辑器显示属性Proper

2020-11-03 19:08:08 4506

原创 平面映射

有时你的模型上没有纹理坐标,想使多个对象的纹理对齐,或者有不同的原因想生成自己的UV坐标……在本教程中,我们将从最简单的方法生成您自己的UV坐标,平面映射。本教程将基于简单的纹理着色器,但是您可以将该技术与包括表面着色器在内的任何着色器一起使用。基本步骤首先,从输入结构中删除uv坐标,因为我们将生成自己的纹理坐标。//顶点着色器读取的网格数据struct appdata{ float4 vertex:POSITION;};由于仍可以像以前一样在顶点之间插值UV坐标,因此我们可以在顶点着色

2020-11-03 18:07:54 512

原创 sprite shader

Unity渲染精灵的方式与渲染3D模型的方式很相似。大部分工作都是由精灵渲染组件完成的,接下来讨论组件的功能以及如何更改着色器用来执行默认sprite render的一些工作创建场景为了处理精灵着色器,我将场景更改为更简单。 摄像机改为正交投影,用精灵渲染器替换了先前示例中使用的立方体,并将我使用的图片资源转换为精灵。修改着色器Sprite Renderer组件会根据我们的图像自动生成一个网格并设置其UV坐标,因此它的工作方式就像我们以前使用的3D模型一样。它将精灵渲染器的颜色放入生成的网格

2020-11-03 11:47:35 496

原创 基础的透明效果

除了仅在屏幕上绘制颜色外,我们还可以保留屏幕上以前的某些颜色,使对象看起来是透明的。 我将说明如何在不带照明的基本着色器中实现此效果。为了使透明对象正确呈现,我们告诉unity对象是透明的。 为此,我们将更改渲染类型以及队列。 通过更改队列,我们确保渲染的材质晚于不透明的材质。 如果不是这种情况,则位于透明对象后面的不透明对象必须在透明对象的上方绘制,并将其完全覆盖。接下来,我们定义“混合模式”,它定义现有颜色和新颜色如何相互融合。 混合模式由2个关键字定义,第一个定义与新颜色相乘的值,第二个定义与旧颜

2020-11-02 19:49:05 147 1

原创 表面着色器

除了几乎从头开始编写着色器之外,unity还允许我们定义一些参数,并让unity生成执行复杂光照计算的代码。 这些着色器称为“表面着色器”。之前的basic shader转换到表面着色器使用表面着色器时,我们不必做其他的事情,因为unity会为我们生成它们。为了转换为你表面着色器,可以完全删除顶点着色器。可以删除顶点和片段函数的编译指示定义。可以删除输入以及将片段片段化的顶点。 可以删除进行纹理缩放的MainTex_ST变量,也可以删除UnityCG包含文件的包含。 然后我们删除pass的起点和终点,U

2020-11-02 19:21:25 214

原创 最基本的着色器程序

从前面三节课了解的shader基础概念以及结构 可以写出下面的基本着色器代码Shader "UnityShader/Basic_Unlit"{ //编辑器显示属性 Properties { _Color("Tint",Color) = (0,0,0,1) _MainTex("Texture",2D)="white"{} } SubShader { //这个材质完全不透明 并且与其他不透明的几何体同时渲染 Tags{"RenderType" = "Opaque" "Queue"

2020-11-02 09:55:04 350

原创 变量

讨论一下着色器需要起作用的变量以及如何将它们添加到代码中。 变量包括我们为每种材质进行设置的变量,作为网格数据一部分的变量以及从顶点传递到片段的数据。模型数据在较低的程序级别上,它们是定义将要呈现的内容的数据流,但在更高层次上将其想象为网格更容易理解。对于大多数情况,此数据必须包括顶点位置和它们之间的三角形。通常通过此传递的其他数据是顶点法线,uv坐标和顶点颜色。然后,在渲染之前,顶点阶段会处理每个顶点数据。位置和方向都在局部空间中,因此无论对象如何缩放或移动,我们都可以使用相同的顶点数据而无需额外准备

2020-10-30 10:56:40 73

原创 HLSL

Hlsl是编写unity着色器的“丰富多彩”部分的语言。这些部分包含自定义逻辑,并最终决定在屏幕上的何处绘制内容。这是Microsoft与其Direct3D API配合使用以编写gpu程序的语言。严格来讲,大多数Unity着色器被标记为用CG编写,而CG是Graphs的缩写,但是CG与hlsl共享了大多数语法和功能,并于2012年弃用。从理论上讲,Unity还支持编写为OpenGL设计的语言glsl shader,但是由于有更多hlsl的示例。最终这些语言将转换为我们要导出到的平台所需要的任何语言,无论如何

2020-10-29 20:49:01 830

原创 UnityShader结构

大多数现代着色器具有可变管线,该管线至少由顶点着色器和片段着色器组成。也可以在其中添加几何和曲面细分阶段,但你暂时不用知道这些。顶点着色器(有时也称为顶点阶段或函数)获取定义模型的数据,并将其转换为屏幕空间,以便可以对其进行渲染(使用矩阵乘法)。我们还可以使用自定义顶点着色器为顶点的位置设置动画,而无需更改网格数据并将更多数据传递给片段着色器。在定义了屏幕上顶点的位置之后,光栅化器将顶点之间的三角形变为像素。除了确定为对象渲染哪个像素外,光栅化器还对顶点着色器的输出中的所有数据进行插值,因此顶点之间的像素也

2020-10-29 19:44:42 125

原创 C#高级整理

C#高级oop 是一种思维方式 一种看到问题解决问题的思考方式 着眼点在于找到一个能帮我们解决问题的实体 然后委托这个实体来帮我们解决问题相反面向过程是自己一步一步去解决问题类和对象 具有一定功能 能够帮忙解决特定问题的实体 就是对象类 是一系列具有相同功能和特征的对象的集合类的设计语法 类名(标识符) 类体using System;namespace Program{ class Person { //特征 private string

2020-10-21 18:54:11 118

原创 AVG小demo

看了B站傅老师的视频,一边看一边做,好久没用很多的C#脚本来开发游戏了,做完后做一个小总结。demo实现了:1.剧情人物对白的展示2.人物以及对白的动态配置3.简单的FSM来控制游戏的流程4.分支剧情5.剧情触发游戏事件开发流程;1.对白人物的显示控制 public void ShowCanvas(bool canvasDisplay) { canvas.gameObject.SetActive(canvasDisplay); } public v

2020-10-16 17:15:06 193

原创 子数组最大平均数

给定 n 个整数,找出平均数最大且长度为 k 的连续子数组,并输出该最大平均数。示例 1:输入: [1,12,-5,-6,50,3], k = 4输出: 12.75著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。简单的滑动窗口题目:直接暴力求解会导致时间复杂度过高,大量数据输入超出最大运行时间使用滑动窗口优化减少循环嵌套1.初始前k个数的值sum2.从第k开始 遍历数组依次向前 +一个元素 同时减去后面的元素3.最后得出最大的值 求出结果public class So

2020-09-23 18:54:04 277

原创 摩尔投票解决主要元素问题

数组中占比超过一半的元素称之为主要元素。给定一个整数数组,找到它的主要元素。若没有,返回-1。示例 1:输入:[1,2,5,9,5,9,5,5,5]输出:5示例 2:输入:[3,2]输出:-1示例 3:输入:[2,2,1,1,1,2,2]输出:2说明:你有办法在时间复杂度为 O(N),空间复杂度为 O(1) 内完成吗?1.设置计数器cnt为0 初始元素major为数组第一个元素2.遍历数组 当cnt为0时候 将当前推选元素赋值给major 并且+1 如果不为0 判断当前元素是否等

2020-09-18 11:30:04 71

原创 寻找两个正序数组的中位数

给定两个大小为 m 和 n 的正序(从小到大)数组 nums1 和 nums2。请你找出这两个正序数组的中位数,并且要求算法的时间复杂度为 O(log(m + n))。你可以假设 nums1 和 nums2 不会同时为空。示例 1:nums1 = [1, 3]nums2 = [2]则中位数是 2.0示例 2:nums1 = [1, 2]nums2 = [3, 4]则中位数是 (2 + 3)/2 = 2.51.数组初始化2.遍历数组 从小到大 赋值到新的数组3.根据奇数偶数 返回不同

2020-09-17 18:17:14 119

原创 转置矩阵

给定一个矩阵 A, 返回 A 的转置矩阵。矩阵的转置是指将矩阵的主对角线翻转,交换矩阵的行索引与列索引。示例 1:输入:[[1,2,3],[4,5,6],[7,8,9]]输出:[[1,4,7],[2,5,8],[3,6,9]]示例 2:输入:[[1,2,3],[4,5,6]]输出:[[1,4],[2,5],[3,6]]1.C# 二维矩阵初始化2.二维数组的遍历以及赋值public class Solution { public int[][] Transpose(int[][]

2020-09-17 17:18:28 215

原创 多光源

整理之前三种光源的光照计算方式:#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 119

原创 光源

平行光当一个光源很远的时候,来自光源的每条光线接近于平行。这看起来就像所有的光线来自于同一个方向,无论物体和观察者在哪儿。当一个光源被设置为无限远时,它被称为平行光(Directional Light),因为所有的光线都有着同一个方向;它会独立于光源的位置。平行光跟光源的位置无关 与旋转角相关1.构建平行光类#pragma once#include <glm/glm.hpp>#include <glm/gtx/rotate_vector.hpp>class Ligh

2020-09-17 10:16:11 243

kbe+unity注册登录程序

kbe+unity3d 简单注册登录

2016-10-12

安卓入门小程序

安卓入门小例程,安卓目录结构,以及代码控制生成线性布局管理器。

2015-09-16

Unity自定义编辑器

资源包含工程和代码,示例代码给出Unity自定义编辑器的框架,实现了物体替换小功能。

2015-07-23

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除