unigine texture texturerender shader

unigine texture  有一个很好用的地方,如果外部没有什么地方依赖texture的width、height、format,则可以通过load和setimage方式直接替换texture中的贴图。

texture实际渲染过程中是通过调用 texture.bind(int) 来将texture 绑定到shader中对应的纹理中的。
(渲染的结果可以通过TextureRender.bindColorTexture()等函数获取到渲染结果)。

texture 设置之后,会将texture内部的一个结构体放入到对应材质的对应指针下。而不是 texture 对象

如下代码测试可知,

但是tt和texture的__vfptr 是一致的,如果与其他的node类来对比,texture无release 和grab操作,在pointer中还封装了个内部的texture类。对于存储的管理, 由material默认创建的texture在外面代码中内存是无法显示删除的,只有外面代码显示创建的textureptr才能自己删除,估计是有封装起来的texture的标志类来控制, 这个应该是为了防止ptr 类对texture进行直接删除操作。

直接替换delete texture,容易导致材质渲染crash ,除非能确切知道哪些材质使用了该texture,然后将所有依赖该纹理的材质全部都做一个替换, 否则不要删除texture对象。(要修改里面的图片或size或format直接拿这个对象在主线程中做create 或load 等操作)(重复两遍)
 

Unigine shader 语言叫uusl,实际是通过宏将hlsl和glsl进行一次包装。最终都是直接根据选择的渲染方案变成hlsl或glsl。

一次简单自定义的的渲染大概可以是这样的,理解这个可以通过对比简单的d3d纹理渲染demo或者opengl纹理渲染demo案例:

unigine渲染的空间坐标位置与纹理关系:

如上所示,空间坐标为范围为([-1,1],[-1,1][0,1]),纹理坐标范围为([0,1],[0,1])
如果渲染unigine中的模型,可以不通过ffp,直接通过调用object类中的render函数来实现。

2.7.3.1 unigine 渲染不支持多线程,texture,render,texturerender,renderstate,material等,不能在子线程中创建和使用,否则可能会导致crash或无效。但是image 是线程安全的。

猜你喜欢

转载自blog.csdn.net/qiushangren/article/details/88952503