unigine ObjectDynamic ffp 对比 及shader使用

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();
}

unigine ObjectDynamic ffp 对比 及shader使用

unigine ObjectDynamic ffp 对比 及shader使用

unigine ObjectDynamic ffp 对比 及shader使用

相关文章: