Ffp 是用于独立的渲染的,能结合shader textureRender render renderstate等灵活的将画面渲染出来。使用可以比较灵活。
但是ffp有顶点限制,并且效率也是比较低的,需要每帧从cpu传送顶点去进行绘制,最关键是能传入的顶点的index是unsigned short类型的,数量有限。适用于顶点数小,并且每帧顶点都变化的对象渲染。
ObjectDynamic 就也是一个比较灵活的工具类。用于渲染自定义的node,需要设置material。适用于unigine原生的objectmesh无法满足时自定义去实现的一个工具类。可以自定义顶点类型,没有顶点数限制。
shader的创建,unigine支持shader从文件创建和从内存创建。hlsl常量设置可以通过shader对象也可以通过material对象进行设置。
创建时给shader设置宏(宏实际上是在shader编译的时候通过参数传递给shader编译器的):
m_shader = Shader::create(m_vertexShaderText, m_fragmentShaderText, "HHHHH,FFFFF");//NULL
//简单的dynamicobject使用,以及自定义材质的和shader的编辑
void init(){
int width = 128;
int height = 128;
m_texture_render = TextureRender::create();
m_texture_render->create2D(width, height);
m_texture = Texture::create();
m_texture->create2D(width, height, Texture::FORMAT_RGBA8, Texture::USAGE_READWRITE | Texture::USAGE_RENDER);
MaterialPtr mat = Materials::get()->loadMaterial("MaterialTemp/material/test.basemat");
if (!mat.get())
{
Log::fatal("can't find materail\n");
return;
}
m_dynamic = ObjectDynamic::create(ObjectDynamic::DYNAMIC_VERTEX | ObjectDynamic::DYNAMIC_INDICES);
int ret = m_dynamic->setMaterial("test", "*");
m_dynamic->setSurfaceProperty("surface_base", "*");
m_dynamic->setSurfaceMode(ObjectDynamic::MODE_TRIANGLES, 0);
//m_dynamic->setInstancing(0);
m_dynamic->setEnabled(0);
const ObjectDynamic::Attribute attributes[] = {
{ 0, ObjectDynamic::TYPE_FLOAT, 4 },
{ 16, ObjectDynamic::TYPE_FLOAT, 2 }
};
m_dynamic->setVertexFormat(attributes, 2);
struct Vertex {
float position[4];
float texcoord[2];
}vert;
vert.position[0] = -1, vert.position[1] = 1, vert.position[2] = 1;
vert.texcoord[0] = 0, vert.texcoord[1] = 0;
Vector<Vertex> vecs;
Vector<int> indices;
vecs.append(vert);
vert.position[0] = 1, vert.position[1] = 1, vert.position[2] = 1;
vert.texcoord[0] = 1, vert.texcoord[1] = 0;
vecs.append(vert);
vert.position[0] = 1, vert.position[1] = -1, vert.position[2] = 1;
vert.texcoord[0] = 1, vert.texcoord[1] = 1;
vecs.append(vert);
vert.position[0] = -1, vert.position[1] = -1, vert.position[2] = 1;
vert.texcoord[0] = 0, vert.texcoord[1] = 1;
vecs.append(vert);
indices.append(0);
indices.append(2);
indices.append(1);
indices.append(0);
indices.append(3);
indices.append(2);
m_dynamic->setVertexArray(vecs.get(), vecs.size());
m_dynamic->setIndicesArray(indices.get(), indices.size());
m_dynamic->flushIndices();
m_dynamic->flushVertex();
m_sp = WidgetSprite::create(Gui::get());
int x = Game::get()->getRandomInt(0, App::get()->getWidth());
int y = Game::get()->getRandomInt(0, App::get()->getHeight());
Gui::get()->addChild(m_sp->getWidget(),Gui::ALIGN_OVERLAP);
m_sp->setWidth(200);
m_sp->setHeight(200);
m_sp->setPosition(x, y);
m_sp->setRender(m_texture);
}
void render()
{
m_texture_render->setColorTexture(0, m_texture);
m_texture_render->enable();
RenderState::get()->clearBuffer(RenderState::BUFFER_COLOR, vec4::ZERO);
float t = Game::get()->getRandomFloat(0.0f, 1.0f);
MaterialPtr mat = m_dynamic->getMaterial(0);
if (mat.get()) {
int nu = mat->findParameter("ifps");
if (nu >= 0) {
mat->setParameterSlider("ifps", t);
}
}
m_dynamic->render(Render::PASS_AMBIENT, 0); //render post ,will not show in main camera; ambient will show in main camera
m_texture_render->disable();
m_texture_render->unbindColorTexture();
}