关于GLSL在GLFW里的使用(windows平台,使用mingw),我们的目标是使用着色器:
// vertex void main() { gl_Position = gl_Vertex; } //fragment void main(void) { gl_FragColor = vec4(0.0, 0.0, 1.0, 1.0); }
来绘制一个蓝色的矩形。
由于sf里的GLEW编译好的版本是vc的,所以要用mingw自己再编译下。
然后我们的main.cpp
#include <GL/glew.h> #include <GL/glfw.h> #include <stdlib.h> #include <iostream> #include <fstream> unsigned int shader_id; unsigned int shader_vp; unsigned int shader_fp; char* textFileRead(const char *fileName) { char* text; if (fileName != NULL) { [...]
前些日子一直想给引擎实现骨骼动画支持,当时选择md5作为解析模型目标,然后找到不少资料加上gara的例子,很快有了进展。
但最后发现md5解析没问题,但是得到目标骨骼动画逻辑数据的部分,如果按md5的逻辑实现的话,会破坏已有的骨骼动画抽象部分,不利于骨骼动画部分通用。我们打算取消md5模型的解析计划,准备转向现在更“流行”的collada格式,看起来很不错,应用也比较广泛。不过在开始实现前,我打算将引擎mesh的geometry部分再重新修改下,取消之前的vertex,triangle类抽象,将其改为简单的数组来存储:triangleIndices,vertexPositions,vertexNormals,vertexTangents,vertexBinormals,uvs,uvIndices。可以提高数据向VertexBuffer3D/IndexBuffer3D上传时的cpu消耗,使引擎效率更高。
这样,下一版本也就是1.4.2的发布版,会是geometry修改的效率提高版。
而collada解析的支持会在1.4.2之后的发布版中实现。
关注nest3d的朋友,在这里向大家倒个歉 T.T 引擎的更新一直比较慢。并且由于时间原因而且一些技术我们也是现学现用,所以开发效率比较低,不过为了引擎更加完美,我认为这些等待都是值得的
good day
你好,我非常荣幸向大家介绍nest3d的最新版本.
在这个发行版里,我们引进一个新的非常灵活的 渲染流程 的设计。
process0 = new ContainerProcess(camera1, container0); process0.meshProcess = new BasicMeshProcess(camera1); process0.color = 0xff000000; process1 = new ContainerProcess(camera, container1); process1.meshProcess = new BasicMeshProcess(camera); process1.color = 0xffffffff; view.processes.push(process0, process1);
我们可以很容易实现RTT(Render To Texture)效果。
process0.renderTarget.texture = material.diffuse.texture;
也很容易添加后期处理效果。
process0 = new ContainerProcess(camera, container); process0.meshProcess = new BasicMeshProcess(camera); process0.color = 0xff000000; var effect:RadialBlur [...]
Hey all, i’m glad to announce the new release of nest3d.
You may want to check out some demos first And feel free to grab it’s source.
In this release, we introduced a new design of render pipeline which is flexible.
process0 = new ContainerProcess(camera1, container0); process0.meshProcess = new BasicMeshProcess(camera1); process0.color = 0xff000000; [...]
我们在设计Nest3D的渲染结构的时候,使用了比较轻巧灵活的结构,对于每个可以渲染的IMesh物体,都有data和material两个属性,其中data中存储着MeshData类型的模型顶点、uv、法线、三角形索引等信息,而material中则存储着贴图,光照等信息,你可以这样初始化一个红色的立方体:
var data:MeshData=PrimitiveFactory.createBox(100,100,100); var material:ColorMaterial=new ColorMaterial(0xff0000); material.update(); var cube:Mesh=new Mesh(data,material);
这样设计的一个好处就是,不同物体之间可以共享顶点信息或者材质信息,而Mesh只是引用这些数据,并将这些模型数据应用上自己的变换矩阵,因此,如果您需要创建1000个红色立方体,只需要这样:
var data:MeshData=PrimitiveFactory.createBox(100,100,100); var material:ColorMaterial=new ColorMaterial(0xff0000); material.update(); var cube:Mesh; for(var i:int=0;i<1000;i++){ cube=new Mesh(data,material); }
所有物体均引用同一组顶点数据和材质数据,因此每个物体的创建只需要很少的额外的内存占用。
那么如何通过程序创建一些基本物体呢?比如立方体,平面等等?很简单,我们提供了一个工厂类PrimitiveFactory,使用这个类可以创建各种您所需要的基本体,比如说立方体,平面和球。
除了一些最基本的物体外,PrimitiveFactory还提供了放样建模(Loft)和旋转建模(Revolution)的功能,使用过3D编辑软件的同学就应该知道这两个建模功能在制作模型时使用得何等便利。在这里,你可以通过提供一个3D物体的截面图使用旋转建模功能(createPrimitiveByRevolution)建立一个任意形状的3D物体,也可以提供一个3D物体的横断面,并提供扫略的路径,使用放样建模函数(createPrimitiveByLoft)通过程序动态建模:)
全透明贴图的处理
在3D场景中,经常会用到具有透明部分的物体以及具有半透明部分的物体,在这个部分,Nest3D也提供了方便的实现,如果您需要的是树叶这样的应用(贴图的一部分完全透明),那么不需要任何额外的操作,您即可得到正确的透明效果。
全透明排序如何工作?
透明排序的工作原理非常简单,并且易于控制,material.kill:Number这个属性即是用于正确的贴图处理,这里,我们使用alphaTest的方式通过AGAL代码提供像素级的精确全透明物体遮挡处理,kill属性介于0~1之间,表示一个阈值,当贴图某一部分的alpha值低于这个阈值时,它将被当做全透明像素而不会绘制,当kill为1时,任何alpha值小于1(非完全不透明物体)均会被当做完全透明的像素处理。
更进一步,半透明物体
有时候,您可能需要使用一个半透明的贴图,并且希望贴图能够与其他物体之间的混合达到较为完美的效果,这时候全透明像素的处理方式就不能够再使用了,相比一些其他引擎无法支持这样的应用场景,Nest3D同样提供了一个解决方案,首先,将需要做半透明处理的物体的kill参数设置为0(相当于关闭全透明处理),并将mesh:alphaTest属性设置为true(打开半透明测试),同时,使用AlphaManager作为场景渲染器替换BasicaManager:
EngineBase.manager = new AlphaManager(); mesh.alphaTest=true;
在这里,我们提供了高效的物体级alpha快速排序,从而基本解决了半透明效果的处理,但请注意,当两个半透明物体出现重叠相交情况的时候,半透明处理可能会导致错误的结果,如果有更好的处理方案,也欢迎大家留言告诉我们:)
Hi, i’d like to show you how to initialize the engine.
Make sure your version is 1.3,go and download it here。
And make sure your build target is greater than flash player 11.3
private var controller:CameraController;
CameraController is the bridge from user to the camera,he controls camera with mouse&keyboard events,his keyboard event stores data to [...]
本节,我向大家介绍Mesh的衣服,Material。
所有的材质集中在nest.view.materials.* 包下,包含:
ColorMateiral, TextureMaterial, EnvMapMaterial, SkyBoxMaterial, LightmapMaterial, MovieMaterial
public function ColorMaterial(color:uint = 0xffffff, alpha:Number = 1) {
你只要提供你需要的颜色和透明度即可
注意透明度要在场景里起作用,你得设置mesh的混合模式,并更换场景的Manager为AlphaManager进行透明排序,记得打开mesh.alphaTest参数,具体我会在以后的章节里提到。
一般材质都提供光照,你可以通过material.light进行设置
当你设置好你的材质后,需要调用material.update()函数来更新生成正确的供stage3d使用的资源。
public function TextureMaterial(diffuse:BitmapData, specular:BitmapData = null, glossiness:int = 10, normalmap:BitmapData = null) {
必须提供diffuse图像,然后specular和normalmap是可选项,glossiness是specular的参数。
还有material.kill:Number选项,使用agal代码kill进行像素剔除,而material.kill的值就是到时候像素的透明度分量要减去的值(当kill后的参数小于零,像素就被剔除)
public function EnvMapMaterial(cubicmap:Vector.<BitmapData>, reflectivity:Number, diffuse:BitmapData, specular:BitmapData = null, glossiness:int = 10, normalmap:BitmapData = null) {
必须提供cubicmap(就是环境的六个面),和diffuse贴图,继承于TextureMaterial,reflectivity控制环境图和diffuse图所占的比例,应在1-0之间。
public function SkyBoxMaterial(cubicmap:Vector.<BitmapData>) [...]
这一节,我为大家介绍对Mesh的控制。
Mesh继承于Object3D,实现了IMesh接口。
用户可以用它来显示物体,对物体进行控制。
基本控制:
mesh.position:Vector3D
mesh.rotation:Vector3D
mesh.scale:Vector3D
用这些进行基本移动旋转缩放,然后可以用 mesh.orientation 来设置旋转的存储方式。
包含 轴角,四元数,欧拉角三种方式。
我们还提供了nest.object.geom.Quaternion 静态类提供四元数的基本操作。
当你修改了上面信息后,你可以标记mesh.changed = true,让mesh在渲染的时候再把这些信息写到矩阵里,或者用mesh.recompose()来立即写入。
你也可以通过mesh.matrix:Matrix3D来控制Mesh的变换。
mesh.worldMatix, invertWorldMatrix, invertMatrix都是用来运算的,再每一帧都会更新。
Mesh还提供了translate()方法,让mesh按指定轴进行平移。
大家好,本节我将向大家介绍下引擎的初始化部分。
首先确认您的引擎版本是1.3,可以到这里下载。
然后确认您的开发环境是生成flash player11.3以上的设置。
private var controller:CameraController;
CameraController用来让我们和场景进行交互,通过键鼠事件,他的按键事件是使用Array存储的,并且是public的getter,所以您可以用它来监听您自己的按键事件。
public function HelloWorld() { stage.scaleMode = StageScaleMode.NO_SCALE; stage.align = StageAlign.TOP_LEFT; stage.frameRate = 60; EngineBase.stage = stage; EngineBase.stage3d = stage.stage3Ds[0]; EngineBase.camera = new Camera3D(); EngineBase.root = new Container3D(); EngineBase.manager = new BasicManager(); EngineBase.view = new ViewPort(800, 600); EngineBase.view.culling = new BasicCulling(); addChild(EngineBase.view.diagram); controller = new CameraController(); controller.mouseEnabled [...]
