【发布时间】:2016-04-06 21:53:18
【问题描述】:
所以我有一个相当简单的实时 2d 游戏,我正在尝试添加一些漂亮的光晕。把它归结为最基本的形式,它只是画在黑色表面上的圆圈和谎言。如果从 hsv 颜色空间的角度考虑场景,所有颜色(黑色除外)的“v”值都是 100%。
目前我有一种“累积”缓冲区,当前帧与前一帧连接在一起。它通过使用两个屏幕外缓冲区和一个黑色纹理来工作。
- 缓冲区一已激活-------------
- 绘制的线和点
- 缓冲区一已停用
- 缓冲区二已激活-------------
- 缓冲两个绘制为全屏四边形的内容
- 全屏显示黑色纹理,略带透明度
- 绘制的缓冲区一内容
- 缓冲区二已停用
- 屏幕缓冲区已激活-------
- 缓冲二的内容绘制到屏幕
目前所有的“滞后”都来自 CPU 的延迟。 GPU 可以很好地处理所有这些。
所以我在想也许可以尝试通过为事物添加发光效果来增加趣味性。我可能在考虑第 10 步,而不是使用常规纹理着色器,我可以使用一个绘制纹理的着色器,除了发光!
不幸的是,我对如何做到这一点有点困惑。以下是一些原因
- 模糊的东西。大多数情况下,有些人声称可以实时完成高斯模糊,而另一些人则说您不应该这样做。人们还提到另一种类型的模糊,称为“焦点”模糊,我不知道它是什么。
- 我能找到的大多数示例都使用 XNA。我需要一个用类似于 OpenGL es 2.0 的着色器语言编写的。
- 有人称它为发光,也有人称它为绽放
- 不同的混合模式?可用于将光晕添加到原始纹理中。
- 如何结合垂直和水平模糊?也许在一次绘制调用中?
无论如何,据我所知,渲染发光的过程是这样的
- 从中删除暗数据
- 模糊光照数据(使用高斯?)
- 在原始数据上混合灯光数据(屏幕混合?)
到目前为止,我已经有了一个可以绘制纹理的着色器。我的下一步是什么?
//Vertex
percision highp float;
attrivute vec2 positionCoords;
attribute vec2 textureCoords;
uniform mat4 matrix;
uniform float alpha;
varying vec2 v_texcoord;
varying float o_alpha;
void main()
{
gl_Position = matrix * vec4(positionCoords, 0.0, 1.0);
v_texcoord = textureCoords.xy;
o_alpha = alpha;
}
//Fragment
varying vec2 v_texcoord;
uniform sampler2D s_texture;
varying float o_alpha;
void main()
{
vec4 color = texture2D(s_texture, v_texcoord);
gl_FragColor = vec4(color.r, color.g, color.b, color.a - o_alpha);
}
这也是实时做的可行的事情吗?
编辑:我可能想做一个 5px 或更少的模糊
【问题讨论】:
标签: swift graphics opengl-es glsles