OpenGLES2.0 Shader及着色器语言CG HLSL GLSL,3D模型文件(.obj .frag .vert .mtl等)(2)

20 篇文章 1 订阅

-- openGL固定流水线(在OpenGLES 2.0之前),2.0之后的使用自定义着色器渲染。

-- 着色器流程:

https://img-blog.csdn.net/20181015185241675?watermark/2/text/aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L1NoYXJlVXM=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70

-- OpenGL 1.0的渲染管线主要包括:
 1.准备顶点数据(通过VBO、VAO和Vertex attribute来传递数据给OpenGL)
 2.顶点处理(这里主要由Vertex Shader来完成,从上图中可以看出,它还包括可选的Tessellation和Geometry shader阶段)
 3.顶点后处理(主要包括Clipping,顶点坐标归一化和viewport变换)
 4.Primitive组装(比如3点组装成一个3角形)
 5.光栅化成一个个像素
 6.使用Fragment shader来处理这些像素
 7.采样处理(主要包括Scissor Test, Depth Test, Blending, Stencil Test等) 

-- OpenGL中有两种shader:

vertex shader(顶点着色器):
  vertex shader在每个顶点上都执行执行一次,通过不同世界的坐标系转化定位顶点的最终位置。它可以数据给fragment shader,如纹理坐标、顶点坐标,变换矩阵等。
  
fragment shader(片段着色器):fragment shader在每个像素上都会执行一次,通过插值确定像素的最终显示颜色。

-- Unity3D,Shader

 Unity3D中编写的Shader是通过.shader文件来进行实现的,它使用ShaderLab语言,极其类似Cg/HLSL。ShaderLab语言很类似于C语言,如果你有不错的C/C++编程功底的话,学习ShaderLab将会很容易。
 Shader分为三种类型:         
 1、Fixed Function Shader( 固定渲染管线着色器)                                
 2、Surface Shader(表面着色器)         
 3、Vertex Shader&Fragment Shader (顶点着色器&片段着色器) 
Unity为我们提供了四种预定义的渲染队列,当然,我们也可以自行添加自定义的渲染方式。官方提供的预定义渲染队列如下:

BackGroud:背景渲染队列,它优先于其他队列,主要用于渲染天空盒等背景元素; 
Geometry(default):这是默认渲染队列,一般来说,场景中的大部分不透明物体都用此方式进行渲染。 
AlphaTest:Alpha渲染通道,它是一种比较特殊的队列,用于渲染Alpha-tested的对象。
Transparent:透明物体渲染队列(Alpha值小于100),适合用于玻璃、粒子效果等。
Overlay:这个队列用来处理覆盖效果,一般来说最后呈现的渲染特效都在这里进行处理。

-- OpenGL ES 2.0渲染过程为: 读取顶点数据——执行顶点着色器——组装图元——光栅化图元——执行片元着色器——写入帧缓冲区——显示到屏幕上。  顶点着色程序从GPU前端模块(寄存器)中提取图元信息(顶点位置、法向量、纹理坐标等),并完成顶点坐标空间转换、法向量空间转换、光照计算等操作,最后将计算好的数据传送到指定寄存器中;然后片断着色程序从中获取需要的数据,通常为“纹理坐标、光照信息等”,并根据这些信息以及从应用程序传递的纹理信息(如果有的话)进行每个片断的颜色计算,最后将处理后的数据送光栅操作模块。 如果图形硬件比较先进,默认的处理算法较好(快速phong明暗处理),则效果也会较好;如果图形硬件使用Gourand明暗处理算法,则会出现马赫带效应(条带化)。
  1.OpenGL作为本地库直接运行在硬件上,没有虚拟机,也没有垃圾回收或者内存压缩。在Java层定义图像的数据需要能被OpenGL存取,因此,需要把内存从Java堆复制到本地堆。
  2.顶点着色器是针对每个顶点都会执行的程序,是确定每个顶点的位置。同理,片元着色器是针对每个片元都会执行的程序,确定每个片元的颜色。
  3.着色器需要进行编译,然后链接到OpenGL程序中。一个OpenGL的程序就是把一个顶点着色器和一个片段着色器链接在一起变成单个对象。
 -- 数学知识,物理知识及算法等。数学矩阵在openGL中应用,在图形学中应用,openGL中的矩阵变换?三角形是图形处理器中都支持的基本图元。

-- glsl是为了实现着色器而实现的。EGL搭建opengl开发环境,或opengl+glsurfaceview搭建开发环境? surface是一个FrameBuffer?

OpenGL ES _ 着色器_程序- https://www.jianshu.com/p/ed0c617bcd67
着色器- https://learnopengl-cn.github.io/01%20Getting%20started/05%20Shaders/
 1.顶点着色器的主要功能是:
顶点法线变换及单位化;纹理坐标变换;光照参数生成;
 2.片元着色器的主要功能:
在差值得到的值上进行操作;访问纹理;应用纹理;雾化;颜色融合;

- 整个着色器的使用流程如下:
1,创建着色器对象
2,把源码关联到每个着色器对象
3,编译着色器
4,创建程序
5,关联着色器到程序对象
6,链接程序
7,激活和关闭着色器程序
8,删除着色器和程序

> 着色器Shader,顶点处理器和片断处理器等
  着色器语言(GLSL)主要包括两部分:Vertex shader(定点着色器,负责定点位置与坐标变换,即决定显示哪个部分,以何种位置/姿态显示),Fragment shader(片元着色器,负责纹理的填充与转换,即决定显示成什么样子) .
  GLSL语言实现的两类着色器:顶点处理器(Vertex Processor)和片断处理器(Fragment Processor),有时还会有Geometry Shader(几何着色器)等。顶点着色程序主要进行几何方面的运算,而片段着色程序主要针对最终的颜色值进行计算。片段着色程序还有一个突出的特点是:拥有检索纹理的能力。对于GPU而言,纹理等价于数组,这意味着,如果要做通用计算,例如数组排序、字符串检索等,就必须使用到片段着色程序。让顶点着色器也拥有检索纹理的能力,是目前的一个研究方向。

 1. Vertex Shader(顶点着色器)主要是传入相应的Attribute变量、Uniforms变量、采样器以及临时变量,最后生成Varying变量,以及gl_Posizion等变量。    
 2. Fragment Shade(片元着色器)可以执行纹理的访问、颜色的汇总、雾化等操作,最后生成gl_FragColor变量。有高手总结如下:“vsh负责搞定像素位置,填写  gl_Posizion;fsh负责搞定像素外观,填写 gl_FragColor。

OpenGL ES 2.0中的“顶点着色器”取代了OpenGL ES 1.x中的“变换和光照阶段”,“片元着色器”取代了“纹理颜色和环境求和”、“雾”、“Alpha测试”等阶段。使得原来又OpenGL ES 1.x固定的阶段需要用户自己开发着色器处理。
  着色器(Shader)是在GPU上运行的小程序。顶点着色器可通过处理它们来处理顶点。
  片元着色器计算每个像素的颜色和其它属性。它通过应用光照值、凹凸贴图,阴影,镜面高光,半透明等处理来计算像素的颜色并输出。它也可改变像素的深度(z-buffering)或在多个渲染目标被激活的状态下输出多种颜色。一个片元着色器不能产生复杂的效果,因为它只在一个像素上进行操作,而不知道场景的几何形状。 
  着色器语言(Shading Language)是一种高级的图形编程语言,仅适合于GPU编程,GLSL源自应用广泛的C语言。对于顶点着色器和片元着色器的开发都需要用到着色器语言进行开发。它是面向过程的而非面向对象。 

-- 3种常用Shader语言:(CG,HLSL,GLSL)
  1.CG(Nvida公司开发的c for graphics计算机图形编程C语言超集):CG程序可以根据运行时的需要或者事先编译成GPU汇编代码;
  2.HLSL(基于DirectX的High Level Shading Language):只能供微软的Direct3D以及XNA使用,移植性差;
  3.GLSL(基于OpenGL的OpenGL Shading Language):供OpenGL使用,具有良好的跨平台和移植特性。

  CG是一个可以被OpenGL和Direct3D广泛支持的图形处理器编程语言。CG语言和OpenGL、DirectX并不是同一层次的语言,而是OpenGL和DirectX的上层,即CG程序是运行在OpenGL和 DirectX标准顶点和像素着色的基础上的。

-- 着色器语言
低级:LLSL AGAL;
高级:Cg HLSL GLSL;

-- 【Unity3D】ShaderLab,unity 用CG 来写的
Shader分为顶点着色器和片段着色器(DirectX中又叫做像素着色器),分别对应于GPU中的两个可编程处理器。
  - Unity3D的Shader分为三类:
1.固定功能着色器:Fixed Function Shader
2.表面着色器:Surface Shader(Unity3D特有的,会被展开为vs和ps)
3.顶点/片段(像素)着色器:Vertex/Fragment(Pixel) Shader;顶点着色器返回一个顶点信息;片段(像素)着色器返回一个像素信息。

-- OpenGL的着色器是新一代显卡提供给开发者一个小程序,为的是让开发者对光照、坐标转换以及像素进行一些个性化的处理。OpenGL的着色器有一种专门的语言:GLSL,现在的GLSL应该全面转向Shader Model5。
  OpenGL的顶点着色器取代了固定渲染管线的转换、光照、纹理坐标生成和转换;片断着色器取代了纹理、颜色求和和雾的操作。在OpenGL3.2版本中加入了几何着色器(GeometryShader)这个概念,在OpenGL4.0中又添加了分格化控制(Tessellation Control)和分格化评估(Tessellation Evaluation)着色器,最新的OpenGL版本4.3则添加了计算着色器(Compute Shader)。

> 着色器语言GLSL,着色器程序 ,顶点处理器和片断处理器等
  GLSL编写Shader,GLSL+OpenGL实现最基本的Binn-phong+lamber光照的的程序。

CSharpGL(30)用条件渲染(Conditional Rendering)来提升OpenGL的渲染效率- https://github.com/bitzhuwei/CSharpGL
OpenGL GLSL 语言 添加注释- https://blog.csdn.net/jeffasd/article/details/52139262
OpenGL ES2 学习教程4 Shader语言- https://segmentfault.com/a/1190000004410579
GLSL语法知识汇总- https://blog.csdn.net/blues1021/article/details/54866403
如何使用OpenGL接口创建着色器程序- https://github.com/twinklingstar20/twinklingstar_cn_demo_basic_shader/
Android OpenGL ES 开发(八): OpenGL ES 着色器语言GLSL- https://www.cnblogs.com/renhui/p/8126121.html
OpenGLES Android篇零基础系列(五):GLSL着色器语言- https://blog.csdn.net/u011153817/article/details/53815649
Android OpenGLES2.0(七)——着色器语言GLSL- http://blog.csdn.net/junzia/article/details/52830604
可以实时预览shader的编译结果- http://haxiomic.github.io/webgl-workshop/editor//index.html

-- 自定义openGL的Shader
 所谓Shader,就是控制GPU的一堆指令集,程序员写出shader,输入到GPU中,GPU执行。GLSL类似于C风格。pipeline 来源于福特汽车生产车间的流水线作业,在OpenGL ES 渲染过程中也是一样,一个操作接着一个操作进行,就如流水线作业一样,这样的实现极大地提供了渲染的效率。

-- OpenGL ES 2.0渲染流程如下:顶点数据(Vertices) > 顶点着色器(Vertex Shader) > 图元装配(Assembly) > 几何着色器(Geometry Shader)> 光栅化(Rasterization) > 片元着色器(Fragment Shader) > 逐片元处理(Per-Fragment Operations) > 帧缓冲(FrameBuffer)。

 // 顶点着色器,vetext_sharder.glsl
attribute vec4 vPosition;
attribute vec4 vTexCoordinate;
uniform mat4 textureTransform;
varying vec2 v_TexCoordinate;
void main () {
    v_TexCoordinate = (textureTransform * vTexCoordinate).xy;
    gl_Position = vPosition;
}  
  顶点着色器(vetex shader),生产每个顶点的最终位置,针对每个顶点都会执行一次,一旦最终位置确定了,OpenGL就会把这些可见的顶点组装成点,直线,三角形。 
  顶点着色器是一个可编程的处理单元,执行顶点变换、纹理坐标变换、光照、材质等顶点的相关操作,每顶点执行一次。替代了传统渲染管线中顶点变换、光照以及纹理坐标的处理,开发人员可以根据自己的需求自行开发,大大增加了程序的灵活性。  
  顶点着色器主要是传入相应的Attribute变量、Uniforms变量、采样器以及临时变量,经过顶点着色器后生成Varying变量。

 // 片元着色器程序,fragment_sharder.glsl 
#extension GL_OES_EGL_image_external : require
precision mediump float;
uniform samplerExternalOES texture;
varying vec2 v_TexCoordinate;
void main () {
    vec4 color = texture2D(texture, v_TexCoordinate);
    gl_FragColor = color;

}
  片段着色器(fragment shader),为组成点,直线,三角形的每个片段生成最终的颜色,针对每个片段他都会执行一次.一个片段是一个小的,颜色单一的长方形区域,类似于计算器屏幕上的一个像素。一旦最后一块颜色生成,opengl会把他们写到一块称为帧缓冲区(frame buffer)的内存,然后Android会把这块帧缓冲器显示在屏幕上。
  此片元着色器的主要功能为根据接收的记录片元纹理坐标的易变变量中的纹理坐标,调用texture2D内建函数从采样器中进行纹理采样,得到此片元的颜色值。最后,将采样到的颜色值传给gl_FragColor内建变量,完成片元的着色。      
  片元着色器是一个处理片元值及其相关联数据的可编程单元,片元着色器可执行纹理的访问、颜色的汇总、雾化等操作,每片元执行一次。片元着色器替代了纹理、颜色求和、雾以及Alpha测试,这一部分是需要开发者自己开发的。 片段着色器中将YUV数据转换为RGB数据并显示.

-- OpenGL Shader Language,简称GLSL。它是一种类似于C语言的专门为GPU设计的语言,它可以放在GPU里面被并行运行。
 OpenGL的着色器有.fsh和.vsh两个文件。这两个文件在被编译和链接后就可以产生可执行程序与GPU交互。
  .vsh 是Vertex Shader(顶点着色器),用于顶点计算,可以理解控制顶点的位置,在这个文件中我们通常会传入当前顶点的位置,和纹理的坐标。
  .fsh 是Fragment Shader(片元着色器),在这里面我可以对于每一个像素点进行重新计算。

 attribute:外部传入vsh文件的变量,每一个顶点都会有这两个属性。变化率高,用于定义每个点。
 varying:用于 vsh和fsh之间相互传递的参数。
 uniform:外部传入vsh文件的变量。变化率较低,对于可能在整个渲染过程没有改变,只是个常量。

-- GLSL中的数据类型主要分为标量、向量、矩阵、采样器、结构体、数组、空类型七种类型:
 基本数据类型:int, float, double, uint, bool ;
 1.标量:标量表示的是只有大小没有方向的量,在GLSL中标量只有bool、int和float三种。对于int,和C一样,可以写为十进制(16)、八进制(020)或者十六进制(0x10)。关于进制不了解的,得自己补补,这是编程基础。对于标量的运算,我们最需要注意的是精度,防止溢出问题。
 2.向量:向量我们可以看做是数组,在GLSL通常用于储存颜色、坐标等数据,针对维数,可分为二维、三维和四位向量。针对存储的标量类型,可以分为bool、int和float。共有vec2、vec3、vec4,ivec2、ivec3、ivec4、bvec2、bvec3和bvec4九种类型,数组代表维数、i表示int类型、b表示bool类型。需要注意的是,GLSL中的向量表示竖向量,所以与矩阵相乘进行变换时,矩阵在前,向量在后(与DirectX正好相反)。向量在GPU中由硬件支持运算,比CPU快的多。
  作为颜色向量时,用rgba表示分量,就如同取数组的中具体数据的索引值。三维颜色向量就用rgb表示分量。比如对于颜色向量vec4 color,color[0]和color.r都表示color向量的第一个值,也就是红色的分量。其他相同。
  作为位置向量时,用xyzw表示分量,xyz分别表示xyz坐标,w表示向量的模。三维坐标向量为xyz表示分量,二维向量为xy表示分量。
  作为纹理向量时,用stpq表示分量,三维用stp表示分量,二维用st表示分量。
 3.矩阵:在GLSL中矩阵拥有2*2、3*3、4*4三种类型的矩阵,分别用mat2、mat3、mat4表示。我们可以把矩阵看做是一个二维数组,也可以用二维数组下表的方式取里面具体位置的值。
 4.采样器:采样器是专门用来对纹理进行采样工作的,在GLSL中一般来说,一个采样器变量表示一副或者一套纹理贴图。所谓的纹理贴图可以理解为我们看到的物体上的皮肤。
 5.结构体:和C语言中的结构体相同,用struct来定义结构体,关于结构体参考C语言中的结构体。
 6.数组:数组知识也和C中相同,不同的是数组声明时可以不指定大小,但是建议在不必要的情况下,还是指定大小的好。
 7.空类型:空类型用void表示,仅用来声明不返回任何值得函数。

  像attribute、uniform、varying const都是在OpenGL的着色器语言中表示限定符,attribute一般用于每个顶点都各不相同的量。uniform一般用于对同一组顶点组成的3D物体中各个顶点都相同的量。varying一般用于从顶点着色器传入到片元着色器的量。还有个const表示常量。

GLSL基础概念和用法- https://blog.csdn.net/blues1021/article/details/53168185
OpenGL GLSL 语法和函数详解- https://blog.csdn.net/jeffasd/article/details/78209965
  GLSL,OpenGL着色语言(OpenGL Shading Language)是用来在OpenGL中着色编程的语言。
  GLSL容器类型:vector, matrix使用.操作符引用成员,如坐标(x, y, z, w),颜色(r, g, b, a),纹理坐标(s, t, p, q);
  Uniform是一种从CPU中的应用向GPU中的着色器发送数据的方式,但uniform和顶点属性有些不同。首先,uniform是全局的(Global)。可以通过glUniform4f函数设置uniform值。

-- 顶点着色器的变量
gl_Position:顶点着色器裁剪空间输出的位置向量;
gl_PointSize:用于基本图元GL_POINTS,设置点的大小,类型为float;使用前需开启;
gl_VertexID:整型变量,存储绘制的当前顶点的id。进行索引渲染是,它保存着当前绘制顶点的索引,其他时候保存的是从渲染开始起直到当前处理的这个顶点的编号。

-- 片段着色器的变量
gl_FragCoord:它的z元素和特定的片段的深度相等;x,y是当前片段的窗口坐标
gl_FrontFacing:bool型,若当前片段是正面的一部分值为true,反之为false。可以根据其值为内外赋予不同的纹理
gl_FragDepth:设置当前片段的深度值,若不设置值则采用gl_FragCoord.z的值。可以使用深度条件重新声明这个变量

const    ,一个编译时常量,或者说是一个队函数来说为只读的参数;
in    ,一个从以前的截断传递过来的变量;
in centroid,    一个从以前的截断传递过来的变量,使用质心插值;
out    ,传递到下一个处理阶段或者在一个函数中指定一个返回值;
out centroid,    传递到下一个处理阶段,使用质心插值;
inout    ,一个读/写变量,只能用于局部函数参数;
uniform    ,一个从客户端代码传递过来的变量,在顶点之间不做改变;

-- OpenGL专业术语:
 v 几何体顶点 (Geometric vertices);vt 贴图坐标点 (Texture vertices);vn 顶点法线 (Vertex normals);f 面 (Face);
 环境反射 Ka r g b;漫反射 Kd r g b ;
 镜反射 Ks r g b;反射指数 Ns exponent 指定材质的反射指数,定义了反射高光度;
 折射值 Ni ptical density 指定材质表面的光密度,即折射值;渐隐指数 d factor 参数factor表示物体融入背景的数量;
 Materials 材质;Diffuse 漫反射;Specular 镜面反射;
 Normal 法线;Texel 纹理;Position 位置;
 f 2/58/58 3/59/59 17/60/60,每一组都表示为顶点坐标索引/贴图坐标点索引/顶点法线索引,三个顶点组成一个三角形。

【Unity Shaders】初探Surface Shader背后的机制- http://blog.csdn.net/candycat1992/article/details/39994049
【Unity Shaders】Vertex & Fragment Shader入门- http://blog.csdn.net/candycat1992/article/details/40212735
  Surface Shader中实现描边效果的弊端,也就是只对表面平缓的模型有效。
  我们有一个更好的方法来实现描边效果,也就是通过两个pass进行渲染——首先渲染对象的背面,用黑色略微向外扩展一点,就是我们的描边效果;然后正常渲染正面即可。而我们应该知道,surface shader是不可以使用pass的。
  fragment shader,Vertex shader,简单的diffuse & diffuse bumped shader,Diffuse, Vertex Lit Fragment Shader

-- GLSL语法的基本类型
GLSL-OpenGL Shading Language(GLslang) ,OpenGL 着色语言规格定义了 22 个基本资料类型,有些用法与 C 相同,其它的是绘图处理器特有的:
GLSL基本类型只有int、float和bool;GLSL中的数据类型主要分为标量、向量、矩阵、采样器、结构体、数组、空类型七种类型。
 void – 用于没有返回值的函式;
 bool – 条件类型,其值可以是真或假;
 int – 带负号整数;
 float – 浮点数;
 vec2 – 2 个浮点数组成的向量;
 vec3 – 3 个浮点数组成的向量;
 vec4 – 4 个浮点数组成的向量;
 bvec2 – 2 个布林组成的向量;
 bvec3 – 3 个布林组成的向量;
 bvec4 – 4 个布林组成的向量;
 ivec2 – 2 个整数组成的向量;
 ivec3 – 3 个整数组成的向量;
 ivec4 – 4 个整数组成的向量;
 mat2 – 浮点数的 2X2 矩阵;
 mat3 – 浮点数的 3X3 矩阵;
 mat4 – 浮点数的 4X4 矩阵;
 sampler1D – 用来存取一维纹理的句柄(handle)(或:操作,作名词解。);
 sampler2D – 用来存取二维纹理的句柄;
 sampler3D – 用来存取三维纹理的句柄;
 samplerCube – 用来存取立方映射纹理的句柄;
 sampler1Dshadow – 用来存取一维深度纹理的句柄;
 sampler2Dshadow – 用来存取二维深度纹理的句柄;

mat2x3    三行两列;
mat2x4    四行两列;
mat3x2    两行三列;
mat3x4    四行三列;
mat4x2    两行四列;
mat4x3    三行四列;

 gl_Position:原始的顶点数据在Vertex Shader中经过平移、旋转、缩放等数学变换后,生成新的顶点位置(一个四维 (vec4) 变量,包含顶点的 x、y、z 和 w 值)。新的顶点位置通过在Vertex Shader中写入gl_Position传递到渲染管线的后继阶段继续处理。
 gl_FragColor:Fragment Shader的输出,它是一个四维变量(或称为 vec4)。gl_FragColor 表示在经过着色器代码处理后,正在呈现的像素的 R、G、B、A 值。
 Vertex Shader是作用于每一个顶点的,如果Vertex有三个点,那么Vertex Shader会被执行三次。Fragment Shader是作用于每个像素的,一个像素运行一次。从源代码中可以看出,像素的转换在Fragment Shader中完成。
 Vertex Shader(顶点着色器)主要是传入相应的Attribute变量、Uniforms变量、采样器以及临时变量,最后生成Varying变量,以及gl_Posizion等变量。  Fragment Shade(片元着色器)可以执行纹理的访问、颜色的汇总、雾化等操作,最后生成gl_FragColor变量。有高手总结如下:“vsh负责搞定像素位置,填写gl_Posizion;fsh负责搞定像素外观,填写 gl_FragColor。

> 3D模型文件(.obj .frag .vert .mtl等)
加载模型的Assimp加载库- http://assimp.sourceforge.net/lib_html/index.html

加载模型的obj模型加载的库- https://github.com/syoyo/tinyobjloader
Android OpenGL显示任意3D模型文件- https://www.jianshu.com/p/6492cc1d8c46
 1.以.obj .frag .vert .mtl结尾的文件 openGL;
 2.主流的渲染语言吧~比如CG、GLSL、HLSL等
 
  模型变换通过对模型执行平移(translation)、缩放(scale)、旋转(rotation)、镜像(reflection)、错切(shear)等操作,(即平移translation、缩放scale、旋转rotation矩阵)来调整模型的过程。通过模型变换,我们可以按照合理方式指定场景中物体的位置等信息。
  图形旋转比较简单,需要调用方法glRotatef(float angle,float x,float y,float z),angle是旋转角度,x,y,z是指的三轴。

创建vert和frag函数- http://blog.csdn.net/z270901903/article/details/53886713
文件格式.obj与.mtl文件格式- http://blog.csdn.net/u013467442/article/details/46792495
OpenGL学习脚印:模型加载初步-加载obj模型(load obj model)- http://blog.csdn.net/wangdingqiaoit/article/details/51879737
  常见到的*.obj文件有两种:第一种是基于COFF(Common Object File Format)格式的OBJ文件(也称目标文件),这种格式用于编译应用程序;第二种是Alias|Wavefront公司推出的OBJ模型文件。

 OBJ文件是一种标准的3D模型文件格式,很适合用于3D软件模型之间的互导。比如在3dsMax或LightWave中建了一个模型,想把它调到Maya里面渲染或动画,导出OBJ文件就是一种很好的选择。目前几乎所有知名的3D软件都支持OBJ文件的读写,不过很多软件需要通过插件才能做到这一点。
 obj文件是一种3D模型文件。3D文件格式,常见的有几种 "*.3ds","*.max","*.lw","*.mb","*.dxf","*.obj"。很多游戏引擎也都支持OBJ文件的读取。

-- OBJ文件特点 :
 1. OBJ是一种3D模型文件,因此不包含动画、材质特性、贴图路径、动力学、粒子等信息。 
 2. OBJ文件主要支持多边形(Polygons)模型。 
虽然OBJ文件也支持曲线(Curves)、表面(Surfaces)、点组材质(Point Group Materials),但Maya导出的OBJ文件并不包括这些信息。 
 3. OBJ文件支持三个点以上的面,这一点很有用。 
很多其它的模型文件格式只支持三个点的面,所以我们导入Maya的模型经常被三角化了,这对于我们对模型的再加工甚为不利。  
 4. OBJ文件支持法线和贴图坐标。 

 - 下列关键字可以在OBJ文件使用【关键字根据数据类型排列,每个关键字有一段简短描述】 
顶点数据(Vertex data): 
  v  几何体顶点 (Geometric vertices) 
  vt 贴图坐标点 (Texture vertices) 
  vn 顶点法线 (Vertex normals) 
  vp 参数空格顶点 (Parameter space vertices) 

自由形态曲线(Free-form curve)/表面属性(surface attributes): 
  deg 度 (Degree) 
  bmat 基础矩阵 (Basis matrix) 
  step 步尺寸 (Step size) 
  cstype 曲线或表面类型 (Curve or surface type) 

元素(Elements): 
  p 点 (Point) 
  l 线 (Line) 
  f 面 (Face) 
  curv 曲线 (Curve) 
  curv2 2D曲线 (2D curve) 
  surf 表面 (Surface) 

自由形态曲线(Free-form curve)/表面主体陈述(surface body statements): 
  parm 参数值 (Parameter values ) 
  trim 外部修剪循环 (Outer trimming loop) 
  hole 内部整修循环 (Inner trimming loop) 
  scrv 特殊曲线 (Special curve) 
  sp 特殊的点 (Special point) 
  end 结束陈述 (End statement) 

自由形态表面之间的连接(Connectivity between free-form surfaces): 
  con 连接 (Connect) 

成组(Grouping): 
  g 组名称 (Group name) 
  s 光滑组 (Smoothing group) 
  mg 合并组 (Merging group) 
  o 对象名称 (Object name) 

显示(Display)/渲染属性(render attributes): 
  bevel 导角插值 (Bevel interpolation) 
  c_interp 颜色插值 (Color interpolation) 
  d_interp 溶解插值 (Dissolve interpolation) 
  lod 细节层次 (Level of detail) 
  usemtl 材质名称 (Material name) 
  mtllib 材质库 (Material library) 
  shadow_obj 投射阴影 (Shadow casting) 
  trace_obj 光线跟踪 (Ray tracing) 
  ctech 曲线近似技术 (Curve approximation technique) 
  stech 表面近似技术 (Surface approximation technique) 

-- .mtl文件(Material Library File)是材质库文件,描述的是物体的材质信息,ASCII存储,任何文本编辑器可以将其打开和编辑。一个.mtl文件可以包含一个或多个材质定义,对于每个材质都有其颜色,纹理和反射贴图的描述,应用于物体的表面和顶点。
  一个材质库文件的基本结构:
newmtl mymtl_1
   材质颜色光照定义
   纹理贴图定义
   反射贴图定义
newmtl mymtl_2
   材质颜色光照定义
   纹理贴图定义
   反射贴图定义
newmtl mymtl_3
   材质颜色光照定义
   纹理贴图定义
   反射贴图定义

  • 1
    点赞
  • 0
    评论
  • 2
    收藏
  • 一键三连
    一键三连
  • 扫一扫,分享海报

©️2021 CSDN 皮肤主题: 编程工作室 设计师:CSDN官方博客 返回首页
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值