Post-processing in Ogre

什么是 Post-processing

首先看一下一个典型的Rendering Pipeline。

Post-processing所处理的对象的是Colored Fragments,其实就是图像处理,但是这里的图像是由三维世界栅格化之后得到的图像。

Ogre中有一个Post-processing的例子,里面实现了很多Post-processing的效果。

Compositor框架

合成器架构是OGRE API的一部分,它允许你轻松定义全屏的后加工处理效果。合成器脚本给你提供了在脚本里定义合成器效果的能力,并且它们可以重复使用而且容易更改,而不必使用API去定义它们。虽然你仍然要使用代码实例化一个针对可视视口的合成器,但是比起实际上定义合成器本身这已经是相当简单的过程了。

进行后处理效果通常包括最开始的用纹理渲染场景,其中有些是添加到主窗口的有些是替代主窗口的。一旦场景中有了纹理,你就可以将场景图像送入一个片断程序,并在片断程序中通过全屏范围渲染它。这一后处理渲染的目标可以是主结果,又或者是另一种渲染纹理,以至于在画面上形成多级回旋。你甚至可以在两个渲染纹理之间反复进行渲染,以达到需要多次循环的回旋效果,而不是每层使用一个单独的纹理。最终,你将得到一个全屏窗口的最终渲染输出结果。这将代替整个窗口(因此,主窗口不必渲染场景本身),或者是一个联合效果。

创建一个简单的黑白效果Compositor

自带的demo里面已经有很多现成的Compositor,参考一下写一个简单的。

在X/Ogre/Samples/Media/materials/scripts 下载创建三个文件 —— BlackWhite.compositor   BlackWhite.material  BlackWhite.cg

BlackWhite.compositor

compositor BlackWhite
{
	technique
	{
		texture scene target_width target_height PF_R8G8B8
		target scene
		{
			input previous
		}
		target_output
		{
			input none
			pass render_quad
			{
				material BlackWhiteMaterial
				input 0 scene
			}
		}
	}
}

BlackWhite.material

fragment_program BlackWhiteShader cg
{
	source BlackWhite.cg
	entry_point PixelShader
	profiles ps_1_1 arbfp1
}

material BlackWhiteMaterial
{
	technique
	{
		pass
		{
			depth_check off
            polygon_mode_overrideable false

			fragment_program_ref BlackWhiteShader
			{
			}

			texture_unit
			{
			    // texture will get added at runtime
                		tex_coord_set 0
				tex_address_mode clamp
				filtering linear linear linear
			}

		}
	}
}

BlackWhite.cg

void PixelShader(float2 uv:TEXCOORD0, out float4 color:COLOR, uniform sampler2D texture)
{
	float4 temp_color = tex2D(texture, uv);
	float greyvalue = temp_color.r * 0.3 + temp_color.g * 0.59 + temp_color.b * 0.11;
	color = float4(greyvalue, greyvalue, greyvalue, 0);
}

这里用的cg语言写的,感觉和GLSL差不多,第3,4行是将RGB色转换成灰度。

加载到场景中,添加下面的代码到createScene()中

	Ogre::CompositorManager::getSingleton().addCompositor(mCamera->getViewport(), "BlackWhiteCompositor");
	Ogre::CompositorManager::getSingleton().setCompositorEnabled(mCamera->getViewport(), "BlackWhiteCompositor", true);

效果如下

3D转像素风格2D

效果是这样

只需要修改cg部分的代码就可以了

	//Pixel effect
	float num = 50;
	float stepsize = 1.0/num;
	float2 fragment = float2(stepsize * floor(uv.x * num), stepsize * floor(uv.y * num));
	color = tex2D(texture, fragment);

首先定义num为横向和纵向有多少个像素,接着定义stepsize为步长,fragment等于是一个新的uv坐标,用到floor函数,就是向下取整。 最后用tex2D索引颜色。

将num换成80看看

参考

Ogre Beginner‘s Guide

时间: 2024-10-11 06:30:27

Post-processing in Ogre的相关文章

转:Ogre TerrainGroup地形赏析

1.1  参考 http://www.ogre3d.org/tikiwiki/tiki-index.php?page=Ogre+Terrain+System http://www.ogre3d.org/tikiwiki/tiki-index.php?page=Ogre+Terrain+Component+FAQ New Terrain Early Shots http://www.ogre3d.org/forums/viewtopic.php?f=11&t=50674 http://tulric

Spring Cloud ZooKeeper集成Feign的坑2,服务调用了一次后第二次调用就变成了500,错误:Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed; nested exception is com.n

错误如下: 2017-09-19 15:05:24.659 INFO 9986 --- [ main] s.c.a.AnnotationConfigApplicationContext : Refreshing org.spring[email protected]56528192: startup date [Tue Sep 19 15:05:24 CST 2017]; root of context hierarchy 2017-09-19 15:05:24.858 INFO 9986 --

Multithreading Batch Processing Framework

1 #!/usr/bin/env python 2 # -*- coding: utf-8 -*- 3 # Author: f0rsaken 4 5 import argparse 6 import importlib 7 import sys 8 import threadpool 9 import time 10 11 def main(): 12 parser = argparse.ArgumentParser(description="Multithreading Batch Proce

SNC processing failed_SAProuter_证书重新生成

文章为原创,转载请联系我,欢迎交流[email protected] 参照note 1178684 - No service connection: "SNC processing failed" 确认证书所在位置 Execute the following commands on your SAProuter machine: sapgenpse seclogin -l sapgenpse get_my_name -n validity 在cmd直接运行报错 利用everything

VS2008下QT整合OGRE

环境配置如下:VS2008 QT版本:4.8.1 OGRE版本: 1.7.4 请先配置好QT  for vs2008  : 下载QT VS2008的包,然后下个QT VS的插件 版本必须是VS2008或VS2010 不能是精简版 新建一个QT Application 新建环境变量:$(OGRE)指向你的OGRE目录, 选择:工具-选项-项目和解决方案-VC++目录 -选择包含文件下拉选项 增加 $(OGRE)\boost_1_48\boost 和 $(OGRE)\include\OGRE 选择库

【转载】OGRE 内存管理

原文:OGRE 内存管理 Ogre引擎中与内存管理相关的文件大致有以下几个(只列出头文件) OgreAlignedAllocator.h OgreMemoryAllocatedObject.h OgreMemoryAllocatorConfig.h OgreMemoryNedAlloc.h OgreMemoryNedPooling.h OgreMemoryStdAlloc.h OgreMemorySTLAllocator.h OgreMemoryTracker.h Ogre引擎的内存分配方式主要

DirectX Video Processing AppWizard--CDxVideoGraphBase

http://www.ifp.illinois.edu/~chenyq/research/Utils/DxVideoAppWiz/DxVideoAppWiz.html 一个非常棒的DirectX Video Processing AppWizard,备忘.

转: rdlc报表An error occurred during local report processing错误

在开发环境的电脑上可生成报表,但是一到客户端就提示An error occurred during local report processing错误. 猜想是缺dll,补充上 Microsoft.ReportViewer.Common.dll Microsoft.ReportViewer.WinForms.dll 结果问题依旧,难道还缺? google后得知还缺一个 Microsoft.ReportViewer.ProcessingObjectModel.dll 这个可不好找,在C:\Wind

Ogre 监听类与渲染流程

Ogre中有许多监听类,我们可以简单理解成C#中的事件,这些类作用都不小,说大点可能改变流程,说小点修改参数等,下面列举一些常用的监听类. FrameListener:由Ogre中的Root负责维护,主要针对所有RenderTarget监听 frameStarted:在一桢开始的时候,所有RenderTarget更新之前. frameRenderingQueued:所有RenderTarget更新之后,但是还没交换缓冲区.(意思屏幕上显示没变) frameEnded:所有RenderTarget

Ogre 渲染目标解析与多文本合并渲染

实现目标 因为需求,想找一个在Ogre中好用的文本显示,经过查找和一些比对.有三种方案 一利用Overlay的2D显示来达到效果. http://www.ogre3d.org/tikiwiki/tiki-index.php?page=MovableTextOverlay 二重写Renderable与MovableObject,利用对应字体查找到每个字符元素纹理坐标. http://www.ogre3d.org/tikiwiki/tiki-index.php?page=MovableText 三利