《随心记六》SFML中的 “ Rendering Special Effects with Shaders ”

目录

Preface

sf::RenderTarget and sf::RenderWindow

Rendering directly to a texture

Shader programming

What is a shader?

Loading shaders

AssetManager 4.0

Using shaders

Setting shader uniforms

sf::Shader and OpenGL

Combining it all together

Setting up RenderTexture

Summary


Preface


●   欢迎阅读本书的高级部分。最后两章介绍了shaders and networking 等概念,这些概念对于没有经验的开发人员来说很难理解,甚至可能会让有经验的开发人员出错。我们将解释它们是什么以及如何在SFML中表示它们,但我们不会详细介绍它们。它们本身就是很大的主题,有许多书籍和教程都涉及这个主题。

 

本章的重点是Shaders。着色器通常是我们用来创建有趣的图形效果、do anti-aliasing,ptimize the graphics pipeline,等等的工具。它们本质上是运行在GPU上并处理vertex and fragment (pixel) data 的程序。我们还将讨论直接渲染到texture 上,并使用该texture 在屏幕上生成最终图像。

 

在这一章中,我们将讨论以下内容:

 

  • sf::RenderTarget and sf::RenderWindow
  • Rendering directly to a texture
  • Shader programming
  •  Combining everything

 


sf::RenderTarget and sf::RenderWindow


●  我们已经熟悉RenderWindow类,但是我们没有详细介绍它。原因之一是,除了RenderWindow:Drag()方法之外,我们不需要了解太多,就可以在早期阶段使用它。然而,现在我们将讨论如何在不同的targets 上进行渲染(在这个例子中是texture),理解RenderWindow是什么很重要。

 

我们将首先介绍 render target 的概念。 render target 是我们可以使用graphics mode 进行绘制的对象。 为了将类被认为是 render target ,它必须从sf :: RenderTarget继承。该类提供子类中所需的接口,用于使用view(or cameras), shaders, 等绘制Drawable对象。 RenderWindow类是其中一个子类。

 

RenderWindow类的继承结构如下所示:

 

由此,我们可以了解类所代表的内容 ——  一种在窗口中绘制Drawable对象的方法。如果我们查看基类 Window 类,会发现其中没有draw功能,只有与窗口相关的属性,如 handling events,  changing size,  title,  position,  and so on.  为了在基类 Window 类中 draw 一些东西,我们必须使用OpenGL。然而,实现RenderTarget方法的每个类都可以作为graphic mode 的所有feature (最重要的是Drawable对象)的画布。 这就是为什么renderTarget在没有类提供的功能的情况下如此重要的原因,我们不能使用mode的大部分features。

我们之前讨论过的大多数renderWindow方法实际上是在renderTarget-draw()、setView()、clear()、mapPixelToCords()等中声明的。其中一些方法根据RenderTarget的不同而实现不同,但大多数方法的工作方式是相同的。在我们继续之前,有一个重要的注意事项,我们必须提到RenderTarget::draw()方法。

 

在前面的章节中,我们已经讨论过RenderTarget::draw()方法,但是我们还没有提到第二个(可选参数)——sf::RenderStates的实例。类holds 四个值,可以为每个draw调用定义这些值—sf::BlendMode, sf::Transform, Texture*, and Shader*.   我们可以在将渲染状态传递给renderTarget::draw()方法之前设置这些状态,但某些可绘制对象会自动设置这些状态(for example, the Sprite class combines
its transform with the one given and sets its own texture).   该类还为每个fields提供了隐式构造函数,因此只需传递其中一种类型即可工作,而无需显式创建RenderState对象。例如,下面的代码工作正常:

window.draw (sprite, sf::BlendMode:: BlendAdd);

了解RenderTarget类的基础知识允许我们开始讨论它的另一种实现,以sf::RenderTexture的形式。

 


Rendering directly to a texture


●  我们以前讨论过texture。我们甚至创建了一个loads and stores textures 的AssetManager。然而,到目前为止我们对它们所做的唯一 一件事就是将它们放在sprite or a shape .  同样有用的是,texture 也可以在图形编程中以不同的方式使用。这通常是在shader中完成的,在着色器中,我们可以根据需要自由使用每个texel (texture的像素)。我们将在本章后面讨论在shader中使用texture.    我们现在讨论一种不同的创建 texture 的方法 —— 通过直接在texture上render Drawable 对象来创建texture。 在本例中,RenderTexture提供了我们需要的功能。使用这种技术,SFML能够实现无缝的行为,因此我们实际上是直接渲染到纹理。

 

RenderTexture类继承自RenderTarget,并使用framebuffer对象实现其所有draw功能(如果可用,则使用另一种方法)。framebuffer对象是OpenGL对象,它允许render到 off-screen buffer.   SFML is able to achieve seamless behavior,   因此我们实际上是直接render texture.  texture 对象本身作为一个field 保存在RenderTexture类中,我们可以通过调用RenderTexture::getTexture()来获取它。

 

在许多情况下,在texture上 render然后对其进行处理是有用的. 例如ÿ

  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值