所以我有一個相當簡單的實時2D遊戲,我試圖添加一些不錯的光芒。將其簡化成最基本的形式,就是在黑色表面上繪製圓圈和謊言。如果您從hsv色彩空間角度考慮場景,所有顏色(黑色除外)的「v」值均爲100%。實時發光着色器混淆
目前我有一種「積累」緩衝區,其中當前幀與前一幀連接。它通過使用兩個離屏緩衝區和一個黑色紋理來工作。
- 緩衝區一個激活-------------
- 線和點繪製
- 緩衝區一個停用
- 緩衝兩個活化--------- ----
- 緩衝區繪製成FUL屏四兩個內容
- 黑色質地有輕微的透明度繪製在全屏
- 緩衝區一個內容繪製
- 兩臺帶緩衝區停用
- 屏幕緩衝激活-------
- 緩衝二的吸引到屏幕
現在所有的「滯後」迄今爲止來自延遲對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);
}
也是這是一個可行的事情做實時?
編輯:我可能想要做一個5像素或更低模糊