1
0
forked from 0ad/0ad

Fix particle to correctly display in the FOW, and to adapt slightly to sunColor settings (both on ARB and GLSL).

This was SVN commit r13287.
This commit is contained in:
wraitii 2013-03-15 10:22:24 +00:00
parent 26cc813cf5
commit d40a66f310
6 changed files with 49 additions and 8 deletions

View File

@ -1,7 +1,23 @@
!!ARBfp1.0
TEMP tex;
ATTRIB v_los = fragment.texcoord[1];
PARAM sunColor = program.local[0];
TEMP tex, losTex, color;
TEX tex, fragment.texcoord[0], texture[0], 2D;
MUL result.color, tex, fragment.color;
TEMP temp;
MOV temp, 0.5;
ADD color.rgb, fragment.color, sunColor;
MUL color.rgb, color, temp;
MUL color.rgb, color, tex;
// Multiply everything by the LOS texture
TEX losTex, v_los, texture[1], 2D;
MUL result.color.rgb, color, losTex.a;
MUL result.color.a, tex, fragment.color;
END

View File

@ -3,6 +3,8 @@ ATTRIB uv = vertex.texcoord[0];
ATTRIB offset = vertex.texcoord[1];
PARAM axis1 = state.matrix.modelview.row[0];
PARAM axis2 = state.matrix.modelview.row[1];
PARAM losTransform = program.local[0];
TEMP position;
MAD position.xyz, axis1, offset.x, vertex.position;
@ -16,8 +18,8 @@ DP4 result.position.y, state.matrix.mvp.row[1], position;
DP4 result.position.z, state.matrix.mvp.row[2], position;
DP4 result.position.w, state.matrix.mvp.row[3], position;
MOV result.texcoord, uv;
MOV result.texcoord[0], uv;
MOV result.color, vertex.color;
MAD result.texcoord[1], vertex.position.xzzz, losTransform.x, losTransform.y;
END

View File

@ -6,10 +6,13 @@
<stream name="color"/>
<stream name="uv0"/>
<stream name="uv1"/>
<uniform name="losTransform" loc="0" type="vec2"/>
</vertex>
<fragment file="arb/particle.fp">
<uniform name="baseTex" loc="0" type="sampler2D"/>
<uniform name="losTex" loc="1" type="sampler2D"/>
<uniform name="sunColor" loc="0" type="vec3"/>
</fragment>
</program>

View File

@ -1,10 +1,13 @@
#version 110
uniform sampler2D baseTex;
uniform sampler2D losTex;
varying vec2 v_tex;
varying vec2 v_los;
varying vec4 v_color;
uniform vec3 sunColor;
uniform vec3 fogColor;
uniform vec2 fogParams;
@ -26,5 +29,11 @@ vec4 get_fog(vec4 color)
void main()
{
gl_FragColor = get_fog(texture2D(baseTex, v_tex) * v_color);
vec4 color = texture2D(baseTex, v_tex) * vec4((v_color.rgb + sunColor)/2.0,v_color.a);
float los = texture2D(losTex, v_los).a;
los = los < 0.03 ? 0.0 : los;
color.rgb *= los;
gl_FragColor = get_fog(color);
}

View File

@ -1,8 +1,10 @@
#version 110
uniform mat4 transform;
uniform vec2 losTransform;
varying vec2 v_tex;
varying vec2 v_los;
varying vec4 v_color;
attribute vec3 a_vertex;
@ -19,7 +21,8 @@ void main()
vec3 position = axis1*offset.x + axis1*offset.y + axis2*offset.x + axis2*-offset.y + a_vertex;
gl_Position = transform * vec4(position, 1.0);
v_los = position.xz * losTransform.x + losTransform.y;
v_tex = a_uv0;
v_color = a_color;
}

View File

@ -20,6 +20,7 @@
#include "ParticleEmitter.h"
#include "graphics/LightEnv.h"
#include "graphics/LOSTexture.h"
#include "graphics/ParticleEmitterType.h"
#include "graphics/ParticleManager.h"
#include "graphics/TextureManager.h"
@ -165,9 +166,16 @@ void CParticleEmitter::UpdateArrayData()
void CParticleEmitter::Bind(const CShaderProgramPtr& shader)
{
CLOSTexture& los = g_Renderer.GetScene().GetLOSTexture();
shader->BindTexture("losTex", los.GetTextureSmooth());
shader->Uniform("losTransform", los.GetTextureMatrix()[0], los.GetTextureMatrix()[12], 0.f, 0.f);
const CLightEnv& lightEnv = g_Renderer.GetLightEnv();
shader->Uniform("sunColor", lightEnv.m_SunColor);
shader->Uniform("fogColor", lightEnv.m_FogColor);
shader->Uniform("fogParams", lightEnv.m_FogFactor, lightEnv.m_FogMax, 0.f, 0.f);
shader->BindTexture("baseTex", m_Type->m_Texture);
shader->Uniform("fogColor", g_Renderer.GetLightEnv().m_FogColor);
shader->Uniform("fogParams", g_Renderer.GetLightEnv().m_FogFactor, g_Renderer.GetLightEnv().m_FogMax, 0.f, 0.f);
pglBlendEquationEXT(m_Type->m_BlendEquation);
glBlendFunc(m_Type->m_BlendFuncSrc, m_Type->m_BlendFuncDst);
}