计算机图形学入门

7 篇文章 0 订阅

为什么要学习图形学?
图形学:
1,知其然亦知其所以然。
比如:纹理寻址。
2,游戏开发中经常需要平衡CPU 和 GPU 性能消耗。
比如:loading .
伴随着请求资源(网络和本地资源)
Loading 做法:
1,cpu 做若干张图交替 (播放若干张图片) 2,gpu 旋转一张图。

3,编写炫酷特效。
4,20K 以上高薪必备技能。

Opengl 渲染流程:
Cpu: FBX -Meshrender
Fbxobj : 模型文件里面包含了 uv 顶点位置,法线切线等渲染所需要的信息。

**MeshRender : 将这些信息传递到GPU 。
skin mesh render 带蒙皮的骨骼。
mesh render : mesh render主要是将顶点等信息传递到gpu .
mesh filter : 表示将哪个模型信息传递给gpu .
skin mesh render :

GPU:
渲染管线:
顶点着色器 - 光栅化 - 片段着色器 – alpha 测试 -模板测试 ---- 深度测试 — Blend — Gbuffer — frontBuffer — frame buffer — 显示器

顶点着色器作用:
1, 计算顶点的颜色。
2,将物体坐标系转换到相机坐标系。

光栅化作用:
将顶点转换成像素。(差值)
100*100
(0,0,0,0)
(1,1,1,1)
此图会变成由白到黑
在这里插入图片描述

片段着色器:
1, 已经是像素点。
像素:RGBA 4 通道组成。
RGBA 8888 8bit .

屏幕: 720*1280
横有 720个像素竖排 1280个像素。
Float[720 *1280]

顶点: 4个到了片段着色器 100*100. 10000次
结论:

(并行计算)点着色器会运行 4次片段着色器会运行 100X00.

顶点着色器 和 片段着色器运算次数不是一个量级。
所以能把运算放在顶点着色器就放这里。

片段着色器:
1, 纹理采样。从纹理像素赋给像素(从材质数据种读取像素显示到屏幕上)
2,像素跟灯光计算。

三大测试

Alpha 测试: 挑选合格的alpha 像素显示。

模板测试: 像素还可以携带模板信息。达到条件的模板值。

深度测试: (相机的距离) 符合条件的像素就通过不然就丢弃。

Blend : 将当前要渲染的像素和已经渲染出来的像素混合运算。

缓存区
GBuffer : RGBA 模板值深度值等。
Float[ 72012804 ]
Front Buffer : float[7201280]
framebuffer : float[720
1280] (显示器)

front Buffer/frame buffer 交换一帧帧的在动

Shader 介绍 :

1, shader 语言
opengl : SGI公司 跨平台。
GLSL语言 : opengl shader lauguage

dx : 微软开发。非跨平台性能非常好。
HLSL : high level shader lauguage .

CG : 微软和英伟达公司。 跨平台基于 C语言。

shader lab : Unity 自己的语言
在这里插入图片描述

unity  shader分类:
fiexed shader :          shader1.0      主要是开关式
顶点 片段着色器:         shader 2.0     功能里面的公式我们可以自己定义
Surface shader:         前两种的封装

4, shader 结构:

着色器组成:
//shader 的名字会显示在 Unity 的 Inspector 中选择 shader 的菜单里面


**Shader 属性定义的通用格式:**
Properties { Property [Property ...] }

name  : 变量的名字。以下划线开头。
display name:  供外界 参考说明 。

int : 表示 变量类型 。
= number:表示默认值。
为什么三维的世界要用四维去表示?
_MainTex ("Texture", 2D) = "white" {}:

White:表示默认值。

•	For 2D Textures, the default value is either an empty string, or one of the built-in default Textures: “white” (RGBA: 1,1,1,1), “black” (RGBA: 0,0,0,0), “gray” (RGBA: 0.5,0.5,0.5,0.5), “bump” (RGBA: 0.5,0.5,1,0.5) or “red” (RGBA: 1,0,0,0).


什么是材质球?
人的衣服。
什么是 shader ?
决定材质跟灯光的作用。


```csharp
Shader "shader 的名字" {
     //    属性  C#定义参数
     //    Properties { Property [Property ...] }
     //    定义一个 int  :    name ("display name", Int) = number
     //    display name  :   外界的参考说明
     //    int 类型  
     //    name :          参数
     //   类型关键字: 2D  Int   Float  Range()   Color     Vector  Cube 3D
     
	 //   CubeMap :	   有六个面的 纹理 。	
	 //   3D 纹理 :     1, 只能用 script 创建 。  
	 //                 2,  opengl 3.0 及以上 才支持 。

     Properties
    {
        _Color ("Color", Color) = (1,1,1,1)
        _MainTex ("Albedo (RGB)", 2D) = "white" {}
        _Glossiness ("Smoothness", Range(0,1)) = 0.5
        _Metallic ("Metallic", Range(0,1)) = 0.0
        _MainTex("Texture",2D)="white"{}
        _TestCube("cubeMap",Cube)=""{}
        _XX("display name",3D)="defaulttesture"{}
    }

    //    自动筛选硬件代码  显卡用的哪个subshader
    //    可能存在多个 subshader。
    //    Unity 会在所有 subshader 列表中选择当前环境中可用的第一个 subshader
    Subshader {
        // subshader 的标签
        [Tags]     Tags { "RenderType"="Opaque" }
                   LOD 200
                   
			        // 给多个 pass 公用的设置
			        [Common State]

			        // 可能存在多个 pass, 每个 pass 都会引起一次渲染过程
			        Pass {
			             // pass 的标签
			            [Pass Tags]
			            
			             // 渲染设置, 如颜色混合
			            [Render Setup]
			            
			             // 纹理设置,只有在 fixed function shader 中才可用
			            [Texture Setup]
			        }
			         // 可以有多个 pass
			        [其他的 Pass]
       }

	    // 可以有多个 subshader
	    [其他的 Subshader]
	
	    // 当所有 subshader 失败的时候, 使用 Fallback 指定的 shader
	    [Fallback]
	
	    // 当有自定义 shader 的设置 UI 时候用
	    [CustomEditor]
}

Shader1.0 光照计算

顶点着色器 -光栅化 -片段着色器 -- alpha 测试 -模板测试
----深度测试 — Blend - Gbuffer -- frontBuffer - frame buffer -显示器

Shader 1.0 :

顶点着色器:
1, 计算顶点的颜色。
2, 顶点变换。
3, 灯光的作用。

片段着色器:

三大测试:
在这里插入图片描述

调节顶点的颜色:

_TestColor (“TestColor”, Color) = (1,0,0,1)

	   Color (0,1,0,1)

	   Color[_TestColor]

Shader 1.0 灯光计算公式:

Ambient * (Lighting Window’s Ambient Intensity setting )

  • (Light Color * Diffuse + Light Color * Specular)
  • Emission

光的分类;
Ambient : 环境光
Diffuse : 漫反射
Specular : 镜面反射
Emission:自发光
Lighting On : 灯光的总开关。
SeparateSpecular On : 高光开关。

Shader "Custom/Shader1.0"
{
    Properties
    {
        _Color ("Color", Color) = (1,1,1,1)
        //_MainTex ("Albedo (RGB)", 2D) = "white" {}
        //_Glossiness ("Smoothness", Range(0,1)) = 0.5
        //_Metallic ("Metallic", Range(0,1)) = 0.0
    }
    SubShader
    {
         Pass
        {
                  //Color 的两种使用方法
                  //Color(0,1,0,1)
                  //Color[_Color]
                Material
                {
                      // Diffuse 的两种方式
                      // Diffuse(0,1,0,1)
                       //Diffuse[_Color]

                        //shader 1.0 灯光计算公式
                        /*  Ambient* (Lighting Window’s Ambient Intensity setting)
		                + (Light Color * Diffuse + Light Color * Specular)
		                + Emission*/

                          Ambient[_Color]       //环境光
                          Specular[_Color]       //高光
                          // Emission[_Color]       //自发光
                }

                Lighting On  
                SeparateSpecular  On   //高光开关
        }
    }
}

Shader1.0 纹理寻址

Shader1.0 顶点着色器 --光栅化 ----片段着色器
顶点着色器 :
1,计算顶点的颜色
2,计算灯光设置

片段着色器
1,纹理采样。

顶点着色器 4: 片段着色器100*100:

贴纹理:

Q:大小跟我这个显示区域不匹配怎么办?

1,纹理跟显示区域相等。
显示区域100100纹理大小: 100100

2,纹理大于显示区域:
显示区域 100100 纹理大小: 1024512
在这里插入图片描述

1, 采用等比例映射。
在这里插入图片描述
UV: 笛卡尔坐标系 寻址方式

2, Point : 就近采样。
Bilinear : 就近周围四个像素的平均:
(1,1,1,1)
(上+ 中 +下+左+右)/5
Trilinear : 就近周围 8个像素的平均。

3, 纹理像素小于显示区域:
显示区域 100100 纹理大小:5050
在这里插入图片描述
锯齿:马赛克 模糊 (使用Bilinear、Trilinear)

Shader1.0 纹理寻址设置

格式:
SetTexture [TextureName] {Texture Block}
TextureName:表示纹理变量。
Previous : 表示前面一个SetTexture出来以后的像素。
Primary : 表示顶点计算出来的颜色。
Texture : 等于SetTexture当前的纹理变量
Constant :表示一个固定的颜色。(1,1,1,1)

combine Texture
combine Previous * Texture 越乘 越暗
表示 两个 像素的 乘法: (1,0,0,1) ( 0.5,0,0,1)
combine Previous + Texture 越加 越亮

Lerp公式:
让 src1 和 src3 进行混合 .
混合的方式取决于src2的 alpha 值:
(1-t)A + tB --差值公式

combine src1 lerp (src2) src3:

设置constantColor 两种方式:
1,constantColor(0,1,0,1)
SetTexture[_MainTex]
{
// constantColor(0,1,0,1)
combine Texture *Constant
}

2, Property 设置:
_ConsColor(“Color”,Color)=(1,0,0,1)
SetTexture[_MainTex]
{
constantColor[_ConsColor]
combine Texture *Constant
}

Shader 1.0  适应所有的显卡。
Shader "Custom/Shader1.0-SetTrexture"
{
    Properties
    {
        _Color ("Color", Color) = (1,1,1,1)
        _MainTex ("Albedo (RGB)", 2D) = "white" {}
        _Main2Tex("Albedo2 (RGB)", 2D) = "white" {}
        _ConsColor("Color",Color) = (1,0,0,1)
    }

        //**格式:**
        //    SetTexture[TextureName]{ Texture Block }
        //    TextureName:表示纹理变量。
        //    Previous : 表示前面一个SetTexture出来以后的像素。
        //    Primary : 表示顶点计算出来的颜色。
        //    Texture : 等于SetTexture当前的纹理变量
        //    Constant : 表示一个固定的颜色。(1,1,1,1)

    SubShader
    {
        Pass
        {
                //Color[_Color]
                SetTexture[_MainTex]
                {
                    combine     Texture
                    //combine   Primary* Texture
                    //combine   Primary+Texture
                }

               SetTexture[_Main2Tex]
               {
                    //Previous
                    //combine  Texture
                    //combine   Primary* Texture
                     //combine      Primary + Texture
                      //combine   Previous+Texture
                     //combine  Texture  lerp(Texture) Previous
                     //combine  Previous  lerp(Texture) Texture
                     
                     //  constantColor(0,1,0,1) 
                    constantColor[_ConsColor]
                    combine    Texture* Constant
                }
        }
    }
    //FallBack "Diffuse"
}

Shader 2.0

Shader 1.0 和 2.0区别:
代码路径: X:\xxx\Unity\Editor\Data\CGIncludes\UnityCG.cginc
不同点: 2.0 可以实现编程。
相同点: 渲染管线一样。

#pragma vertex vert           定义一个顶点着色器的 入口函数 。
#pragma fragment frag      定义一个片段着色器的 入口函数

Appdata从 meshrender 里面来的。
v2f vert (appdata v)
v2f:顶点着色器的输出值/片段着色器的输入值。

语义 :
POSITION: 获取模型顶点的信息。
NORMAL : 获取法线信息。
TEXCOORD (n): 高精度的 从顶点传递信息 到 片段着色器
float2, float3 or float4.
COLOR : 表示低精度从顶点传递信息 到 片段着色器
float4
TANGENT : 获取切线信息。
SV_POSITION: 表示经过 mvp矩阵 已经转化到 屏幕坐标的位置。
SV_Target: 输出到哪个 render target .

//顶点着色器从fbx 获取信息:
struct appdata_base {
	float4 vertex : POSITION;
	float3 normal : NORMAL;
	float4 texcoord : TEXCOORD0;
	UNITY_VERTEX_INPUT_INSTANCE_ID
};

struct appdata_tan {
	float4 vertex : POSITION;
	float4 tangent : TANGENT;
	float3 normal : NORMAL;
	float4 texcoord : TEXCOORD0;
	UNITY_VERTEX_INPUT_INSTANCE_ID
};

struct appdata_full {
	float4 vertex : POSITION;
	float4 tangent : TANGENT;
	float3 normal : NORMAL;
	float4 texcoord : TEXCOORD0;
	float4 texcoord1 : TEXCOORD1;
	float4 texcoord2 : TEXCOORD2;
	float4 texcoord3 : TEXCOORD3;
	fixed4 color : COLOR;
	UNITY_VERTEX_INPUT_INSTANCE_ID
};

Shader 2.0 顶点着色器:
1, 计算顶点的位置变换。
2,计算顶点的颜色。

Unity3d 里面矩阵是左乘:
1, 将物体坐标系变换到世界坐标系
P(世界) = M(物体到世界的)*P(物体)
规律: 3D 变换首先将物体坐标系变换到世界。

2, 将世界坐标变换到相机坐标系
P(相机)= M(世界到相机) *p(世界)
M : 物体坐标系变换到世界坐标系
V :世界坐标变换到相机坐标系
P: 将 3D 坐标系转换成2维屏幕坐标系。

    Vector3 Pos = transform.parent.localToWorldMatrix.MultiplyPoint(transform.localPosition);
    //左乘矩阵,设置物体坐标
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
第1章绪论 1.1计算机图形及其相关概念 1.2计算机图形的发展 1.2.1计算机图形科的发展 1.2.2图形硬件设备的发展 1.2.3图形软件的发展 1.3计算机图形的应用 1.3.1计算机辅助设计与制造 1.3.2计算机辅助绘图 1.3.3计算机辅助教 1.3.4办公自动化和电子出版技术 1.3.5计算机艺术 1.3.6在工业控制及交通方面的应用 1.3.7在医疗卫生方面的应用 1.3.8图形用户界面 1.4计算机图形研究动态 1.4.1计算机动画 1.4.2地理信息系统 1.4.3人机交互 1.4.4真实感图形显示 1.4.5虚拟现实 1.4.6科计算可视化 1.4.7并行图形处理 第2章计算机图形系统及图形硬件 2.1计算机图形系统概述 2.1.1计算机图形系统的功能 2.1.2计算机图形系统的结构 2.2图形输入设备 2.2.1键盘 2.2.2鼠标器 2.2.3光笔 2.2.4触摸屏 2.2.5操纵杆 2.2.6跟踪球和空间球 2.2.7数据手套 2.2.8数字化仪 2.2.9图像扫描仪 2.2.10声频输入系统 2.2.11视频输入系统 2.3图形显示设备 2.3.1阴极射线管 2.3.2CRT图形显示器 2.3.3平板显示器 2.3.4三维观察设备 2.4图形显示子系统 2.4.1光栅扫描图形显示子系统的结构 2.4.2绘制流水线 2.4.3相关概念 2.5图形硬拷贝设备 2.5.1打印机 2.5.2绘图仪 2.6OpenGL图形软件包 2.6.1OpenGL的主要功能 2.6.2OpenGL的绘制流程 2.6.3OpenGL的基本语法 2.6.4一个完整的OpenGL程序 第3章用户接口与交互式技术 3.1用户接口设计 3.1.1用户模型 3.1.2显示屏幕的有效利用 3.1.3反馈 3.1.4一致性原则 3.1.5减少记忆量 3.1.6回退和出错处理 3.1.7联机帮助 3.1.8视觉效果设计 3.1.9适应不同的用户 3.2逻辑输入设备与输入处理 3.2.1逻辑输入设备 3.2.2输入模式 3.3交互式绘图技术 3.3.1基本交互式绘图技术 3.3.2三维交互技术 3.4OpenGL中橡皮筋技术的实现 3.4.1基于鼠标的实现 3.4.2基于键盘的实现 3.5OpenGL中拾取操作的实现 3.6OpenGL的菜单功能 第4章图形的表示与数据结构 4.1基本概念 4.1.1基本图形元素 4.1.2几何信息与拓扑信息 4.1.3坐标系 4.1.4实体的定义 4.1.5正则集合运算 4.1.6平面多面体与欧拉公式 4.2三维形体的表示 4.2.1多边形表面模型 4.2.2扫描表示 4.2.3构造实体几何法 4.2.4空间位置枚举表示 4.2.5八叉树 4.2.6BSP树 4.2.7OpenGL中的实体模型函数 4.3非规则对象的表示 4.3.1分形几何 4.3.2形状语法 4.3.3粒子系统 4.3.4基于物理的建模 4.3.5数据场的可视化 4.4层次建模 4.4.1段与层次建模 4.4.2层次模型的实现 4.4.3OpenGL中层次模型的实现 第5章基本图形生成算法 5.1直线的扫描转换 5.1.1数值微分法 5.1.2中点Bresenham算法 5.1.3Bresenham算法 5.2圆的扫描转换 5.2.1八分法画圆 5.2.2中点Bresenham画圆算法 5.3椭圆的扫描转换 5.3.1椭圆的特征 5.3.2椭圆的中点Bresenham算法 5.4多边形的扫描转换与区域填充 5.4.1多边形的扫描转换 5.4.2边缘填充算法 5.4.3区域填充 5.4.4其他相关概念 5.5字符处理 5.5.1点阵字符 5.5.2矢量字符 5.6属性处理 5.6.1线型和线宽 5.6.2字符的属性 5.6.3区域填充的属性 5.7反走样 5.7.1过取样 5.7.2简单的区域取样 5.7.3加权区域取样 5.8在OpenGL中绘制图形 5.8.1点的绘制 5.8.2直线的绘制 5.8.3多边形面的绘制 5.8.4OpenGL中的字符函数 5.8.5OpenGL中的反走样 第6章二维变换及二维观察 6.1基本概念 6.2基本几何变换 6.2.1平移变换 6.2.2比例变换 6.2.3旋转变换 6.2.4对称变换 6.2.5错切变换 6.2.6二维图形几何变换的计算 6.3复合变换 6.3.1二维复合平移变换和比例变换 6.3.2二维复合旋转变换 6.3.4其他二维复合变换 6.3.5相对任一参考点的二维几何变换 6.3.6相对于任意方向的二维几何变换 6.3.7坐标系之间的变换 6.3.8光栅变换 6.3.9变换的性质 6.4二维观察 6.4.1基本概念 6.4.2?用户坐标系到观察坐标系的变换 6.4.3?窗口到视区的变换 6.5?裁剪 6.5.1?点的裁剪 6.5.2直线段的裁剪 6.5.3多边形的裁剪 6.5.4其他裁剪 6.6OpenGL中的二维观察变换 第7章三维变换及三维观察 7.1三维变换的基本概念 7.1.1几何变换 7.1.2三维齐次坐标变换矩阵 7.1.3平面几何投影 7.2三维几何变换 7.2.1三维基本几何变换 7.2.2三维复合变换 7.3三维投影变换 7.3.1正投影 7.3.2斜投影 7.4透视投影 7.4.1一点透视 7.4.2二点透视 7.4.3三点透视 7.5观察坐标系及观察空间 7.5.1观察坐标系 7.5.2观察空间 7.6三维观察流程 7.6.1用户坐标系到观察坐标系的变换 7.6.2平行投影的规范化投影变换 7.6.3透视投影的规范化投影变换 7.7三维裁剪 7.7.1关于规范化观察空间的裁剪 7.7.2齐次坐标空间的裁剪 7.8OpenGL中的变换 7.8.1矩阵堆栈 7.8.2模型视图变换 7.8.3投影变换 7.8.4实例 第8章曲线与曲面 8.1基本概念 8.1.1曲线/曲面数描述的发展 8.1.2曲线/曲面的表示要求 8.1.3曲线/曲面的表示 8.1.4插值与逼近 8.1.5连续性条件 8.1.6样条描述 8.2三次样条 8.2.1自然三次样条 8.2.2Hermite插值样条 8.3Bezier曲线/曲面 8.3.1Bezier曲线的定义 8.3.2Bezier曲线的性质 8.3.3Bezier曲线的生成 8.3.4Bezier曲面 8.4B样条曲线/曲面 8.4.1B样条曲线 8.4.2B样条曲线的性质 8.4.3B样条曲面 8.5有理样条曲线/曲面 8.5.1NURBS曲线/曲面的定义 8.5.2有理基函数的性质 8.5.3NURBS曲线/曲面的特点 8.6曲线/曲面的转换和计算 8.6.1样条曲线/曲面的转换 8.6.2样条曲线/曲面的离散生成 8.7OpenGL生成曲线/曲面 8.7.1Bezier曲线/曲面函数 8.7.2GLU中的B样条曲线/曲面函数 第9章消隐 9.1深度缓存器算法 9.2区间扫描线算法 9.3深度排序算法 9.4区域细分算法 9.5光线投射算法 9.6BSP树 9.7多边形区域排序算法 9.8OpenGL中的消隐处理 第10章真实感图形绘制 10.1简单光照模型 10.1.1环境光 10.1.2漫反射光 10.1.3镜面反射光 10.1.4光强衰减 10.1.5颜色 10.2基于简单光照模型的多边形绘制 10.2.1恒定光强的多边形绘制 10.2.2Gouraud明暗处理 10.2.3Phong明暗处理 10.3透明处理 10.4产生阴影 10.5模拟景物表面细节 10.5.1用多边形模拟表面细节 10.5.2纹理的定义和映射 10.5.3凹凸映射 10.6整体光照模型与光线追踪 10.6.1整体光照模型 10.6.2Whitted光照模型 10.6.3光线跟踪算法 10.6.4光线跟踪反走样 10.7 OpenGL中的光照与表面绘制函数 10.7.1 OpenGL点光源 10.7.2 OpenGL全局光照 10.7.3 OpenGL表面材质 10.7.4 OpenGL透明处理 10.7.5 OpenGL表面绘制 10.7.6 实例 10.8 OpenGL中的纹理映射

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值