Split ogles2 shader for 2D rendering into a texture and non-texture variant.

That's otherwise hard to do from user-code because 2d rendering works a little different than 3d.
This way it renders faster and also won't cause any warnings in WebGL.


git-svn-id: svn://svn.code.sf.net/p/irrlicht/code/branches/ogl-es@5445 dfc29bdd-3216-0410-991c-e03cc46cb475
master
cutealien 2017-04-21 12:11:19 +00:00
parent 8be8f18f47
commit b8cf4ca4bf
6 changed files with 64 additions and 19 deletions

View File

@ -0,0 +1,9 @@
precision mediump float;
/* Varyings */
varying vec4 vVertexColor;
void main()
{
gl_FragColor = vVertexColor;
}

View File

@ -35,8 +35,10 @@ namespace video
{ {
COGLES2Driver::COGLES2Driver(const SIrrlichtCreationParameters& params, io::IFileSystem* io, IContextManager* contextManager) : COGLES2Driver::COGLES2Driver(const SIrrlichtCreationParameters& params, io::IFileSystem* io, IContextManager* contextManager) :
CNullDriver(io, params.WindowSize), COGLES2ExtensionHandler(), CacheHandler(0), MaterialRenderer2D(0), CurrentRenderMode(ERM_NONE), CNullDriver(io, params.WindowSize), COGLES2ExtensionHandler(), CacheHandler(0),
ResetRenderStates(true), LockRenderStateMode(false), Transformation3DChanged(true), AntiAlias(params.AntiAlias), OGLES2ShaderPath(params.OGLES2ShaderPath), MaterialRenderer2DActive(0), MaterialRenderer2DTexture(0), MaterialRenderer2DNoTexture(0),
CurrentRenderMode(ERM_NONE), ResetRenderStates(true), LockRenderStateMode(false), Transformation3DChanged(true), AntiAlias(params.AntiAlias),
OGLES2ShaderPath(params.OGLES2ShaderPath),
ColorFormat(ECF_R8G8B8), Params(params), ContextManager(contextManager) ColorFormat(ECF_R8G8B8), Params(params), ContextManager(contextManager)
{ {
#ifdef _DEBUG #ifdef _DEBUG
@ -88,6 +90,8 @@ COGLES2Driver::~COGLES2Driver()
removeAllOcclusionQueries(); removeAllOcclusionQueries();
removeAllHardwareBuffers(); removeAllHardwareBuffers();
delete MaterialRenderer2DTexture;
delete MaterialRenderer2DNoTexture;
delete CacheHandler; delete CacheHandler;
if (ContextManager) if (ContextManager)
@ -391,12 +395,19 @@ COGLES2Driver::~COGLES2Driver()
ParallaxMapVertexAlphaCB->drop(); ParallaxMapVertexAlphaCB->drop();
OneTextureBlendCB->drop(); OneTextureBlendCB->drop();
// Create 2D material renderer. // Create 2D material renderers
c8* vs2DData = 0; c8* vs2DData = 0;
c8* fs2DData = 0; c8* fs2DData = 0;
loadShaderData(io::path("COGLES2Renderer2D.vsh"), io::path("COGLES2Renderer2D.fsh"), &vs2DData, &fs2DData); loadShaderData(io::path("COGLES2Renderer2D.vsh"), io::path("COGLES2Renderer2D.fsh"), &vs2DData, &fs2DData);
MaterialRenderer2D = new COGLES2Renderer2D(vs2DData, fs2DData, this); MaterialRenderer2DTexture = new COGLES2Renderer2D(vs2DData, fs2DData, this, true);
delete[] vs2DData;
delete[] fs2DData;
vs2DData = 0;
fs2DData = 0;
loadShaderData(io::path("COGLES2Renderer2D.vsh"), io::path("COGLES2Renderer2D_noTex.fsh"), &vs2DData, &fs2DData);
MaterialRenderer2DNoTexture = new COGLES2Renderer2D(vs2DData, fs2DData, this, false);
delete[] vs2DData; delete[] vs2DData;
delete[] fs2DData; delete[] fs2DData;
} }
@ -1684,8 +1695,11 @@ COGLES2Driver::~COGLES2Driver()
// unset old material // unset old material
// unset last 3d material // unset last 3d material
if (CurrentRenderMode == ERM_2D) if (CurrentRenderMode == ERM_2D && MaterialRenderer2DActive)
MaterialRenderer2D->OnUnsetMaterial(); {
MaterialRenderer2DActive->OnUnsetMaterial();
MaterialRenderer2DActive = 0;
}
else if (LastMaterial.MaterialType != Material.MaterialType && else if (LastMaterial.MaterialType != Material.MaterialType &&
static_cast<u32>(LastMaterial.MaterialType) < MaterialRenderers.size()) static_cast<u32>(LastMaterial.MaterialType) < MaterialRenderers.size())
MaterialRenderers[LastMaterial.MaterialType].Renderer->OnUnsetMaterial(); MaterialRenderers[LastMaterial.MaterialType].Renderer->OnUnsetMaterial();
@ -1959,6 +1973,8 @@ COGLES2Driver::~COGLES2Driver()
if ( LockRenderStateMode ) if ( LockRenderStateMode )
return; return;
COGLES2Renderer2D* nextActiveRenderer = texture ? MaterialRenderer2DTexture : MaterialRenderer2DNoTexture;
if (CurrentRenderMode != ERM_2D) if (CurrentRenderMode != ERM_2D)
{ {
// unset last 3d material // unset last 3d material
@ -1970,8 +1986,14 @@ COGLES2Driver::~COGLES2Driver()
CurrentRenderMode = ERM_2D; CurrentRenderMode = ERM_2D;
} }
else if ( MaterialRenderer2DActive && MaterialRenderer2DActive != nextActiveRenderer)
{
MaterialRenderer2DActive->OnUnsetMaterial();
}
MaterialRenderer2D->OnSetMaterial(Material, LastMaterial, true, 0); MaterialRenderer2DActive = nextActiveRenderer;
MaterialRenderer2DActive->OnSetMaterial(Material, LastMaterial, true, 0);
LastMaterial = Material; LastMaterial = Material;
// no alphaChannel without texture // no alphaChannel without texture
@ -1996,7 +2018,7 @@ COGLES2Driver::~COGLES2Driver()
setTextureRenderStates(InitMaterial2D, false); setTextureRenderStates(InitMaterial2D, false);
} }
MaterialRenderer2D->OnRender(this, video::EVT_STANDARD); MaterialRenderer2DActive->OnRender(this, video::EVT_STANDARD);
} }

View File

@ -363,7 +363,9 @@ namespace video
void loadShaderData(const io::path& vertexShaderName, const io::path& fragmentShaderName, c8** vertexShaderData, c8** fragmentShaderData); void loadShaderData(const io::path& vertexShaderName, const io::path& fragmentShaderName, c8** vertexShaderData, c8** fragmentShaderData);
COGLES2CacheHandler* CacheHandler; COGLES2CacheHandler* CacheHandler;
COGLES2Renderer2D* MaterialRenderer2D; COGLES2Renderer2D* MaterialRenderer2DActive;
COGLES2Renderer2D* MaterialRenderer2DTexture;
COGLES2Renderer2D* MaterialRenderer2DNoTexture;
core::stringw Name; core::stringw Name;
core::matrix4 Matrices[ETS_COUNT]; core::matrix4 Matrices[ETS_COUNT];

View File

@ -20,8 +20,9 @@ namespace irr
namespace video namespace video
{ {
COGLES2Renderer2D::COGLES2Renderer2D(const c8* vertexShaderProgram, const c8* pixelShaderProgram, COGLES2Driver* driver) : COGLES2Renderer2D::COGLES2Renderer2D(const c8* vertexShaderProgram, const c8* pixelShaderProgram, COGLES2Driver* driver, bool withTexture) :
COGLES2MaterialRenderer(driver, 0, EMT_SOLID) COGLES2MaterialRenderer(driver, 0, EMT_SOLID),
WithTexture(withTexture)
{ {
#ifdef _DEBUG #ifdef _DEBUG
setDebugName("COGLES2Renderer2D"); setDebugName("COGLES2Renderer2D");
@ -38,11 +39,17 @@ COGLES2Renderer2D::COGLES2Renderer2D(const c8* vertexShaderProgram, const c8* pi
// These states don't change later. // These states don't change later.
ThicknessID = getPixelShaderConstantID("uThickness"); ThicknessID = getPixelShaderConstantID("uThickness");
TextureUsageID = getPixelShaderConstantID("uTextureUsage"); if ( WithTexture )
s32 TextureUnitID = getPixelShaderConstantID("uTextureUnit"); {
TextureUsageID = getPixelShaderConstantID("uTextureUsage");
s32 TextureUnitID = getPixelShaderConstantID("uTextureUnit");
s32 TextureUnit = 0; s32 TextureUnit = 0;
setPixelShaderConstant(TextureUnitID, &TextureUnit, 1); setPixelShaderConstant(TextureUnitID, &TextureUnit, 1);
s32 TextureUsage = 0;
setPixelShaderConstant(TextureUsageID, &TextureUsage, 1);
}
cacheHandler->setProgram(0); cacheHandler->setProgram(0);
} }
@ -62,8 +69,11 @@ void COGLES2Renderer2D::OnSetMaterial(const video::SMaterial& material,
f32 Thickness = (material.Thickness > 0.f) ? material.Thickness : 1.f; f32 Thickness = (material.Thickness > 0.f) ? material.Thickness : 1.f;
setPixelShaderConstant(ThicknessID, &Thickness, 1); setPixelShaderConstant(ThicknessID, &Thickness, 1);
s32 TextureUsage = material.TextureLayer[0].Texture ? 1 : 0; if ( WithTexture )
setPixelShaderConstant(TextureUsageID, &TextureUsage, 1); {
s32 TextureUsage = material.TextureLayer[0].Texture ? 1 : 0;
setPixelShaderConstant(TextureUsageID, &TextureUsage, 1);
}
} }
bool COGLES2Renderer2D::OnRender(IMaterialRendererServices* service, E_VERTEX_TYPE vtxtype) bool COGLES2Renderer2D::OnRender(IMaterialRendererServices* service, E_VERTEX_TYPE vtxtype)
@ -75,4 +85,3 @@ bool COGLES2Renderer2D::OnRender(IMaterialRendererServices* service, E_VERTEX_TY
} }
#endif #endif

View File

@ -19,7 +19,7 @@ namespace video
class COGLES2Renderer2D : public COGLES2MaterialRenderer class COGLES2Renderer2D : public COGLES2MaterialRenderer
{ {
public: public:
COGLES2Renderer2D(const c8* vertexShaderProgram, const c8* pixelShaderProgram, COGLES2Driver* driver); COGLES2Renderer2D(const c8* vertexShaderProgram, const c8* pixelShaderProgram, COGLES2Driver* driver, bool withTexture);
~COGLES2Renderer2D(); ~COGLES2Renderer2D();
virtual void OnSetMaterial(const SMaterial& material, const SMaterial& lastMaterial, virtual void OnSetMaterial(const SMaterial& material, const SMaterial& lastMaterial,
@ -28,6 +28,7 @@ public:
virtual bool OnRender(IMaterialRendererServices* service, E_VERTEX_TYPE vtxtype); virtual bool OnRender(IMaterialRendererServices* service, E_VERTEX_TYPE vtxtype);
protected: protected:
bool WithTexture;
s32 ThicknessID; s32 ThicknessID;
s32 TextureUsageID; s32 TextureUsageID;
}; };

View File

@ -824,6 +824,7 @@
<Unit filename="COBJMeshWriter.h" /> <Unit filename="COBJMeshWriter.h" />
<Unit filename="COCTLoader.cpp" /> <Unit filename="COCTLoader.cpp" />
<Unit filename="COCTLoader.h" /> <Unit filename="COCTLoader.h" />
<Unit filename="COGLES2Common.h" />
<Unit filename="COGLES2Driver.cpp" /> <Unit filename="COGLES2Driver.cpp" />
<Unit filename="COGLES2Driver.h" /> <Unit filename="COGLES2Driver.h" />
<Unit filename="COGLES2ExtensionHandler.cpp" /> <Unit filename="COGLES2ExtensionHandler.cpp" />
@ -838,6 +839,7 @@
<Unit filename="COGLES2ParallaxMapRenderer.h" /> <Unit filename="COGLES2ParallaxMapRenderer.h" />
<Unit filename="COGLES2Renderer2D.cpp" /> <Unit filename="COGLES2Renderer2D.cpp" />
<Unit filename="COGLES2Renderer2D.h" /> <Unit filename="COGLES2Renderer2D.h" />
<Unit filename="COGLESCommon.h" />
<Unit filename="COGLESDriver.cpp" /> <Unit filename="COGLESDriver.cpp" />
<Unit filename="COGLESDriver.h" /> <Unit filename="COGLESDriver.h" />
<Unit filename="COGLESExtensionHandler.cpp" /> <Unit filename="COGLESExtensionHandler.cpp" />