- Fixed some of fixed pipeline materials in OGL ES2 driver (many of examples works fine now).

git-svn-id: svn://svn.code.sf.net/p/irrlicht/code/branches/ogl-es@4482 dfc29bdd-3216-0410-991c-e03cc46cb475
master
nadro 2013-03-20 00:30:45 +00:00
parent 919c037d05
commit 27bdfd5beb
9 changed files with 250 additions and 29 deletions

View File

@ -1,23 +1,142 @@
precision mediump float;
varying vec2 varTexCoord0;
varying vec2 varTexCoord1;
varying vec4 varVertexColor;
varying float eyeDist;
/* Definitions */
#define Solid 0
#define Solid2Layer 1
#define LightMap 2
#define DetailMap 3
#define SphereMap 4
#define Reflection2Layer 5
#define TransparentAlphaChannel 6
#define TransparentAlphaChannelRef 7
#define TransparentVertexAlpha 8
#define TransparentReflection2Layer 9
/* Uniforms */
uniform int uMaterialType;
uniform bool uTextureUsage0;
uniform bool uTextureUsage1;
uniform sampler2D uTextureUnit0;
uniform sampler2D uTextureUnit1;
vec4 renderSolid(void)
{
vec4 color = vec4(1.0);//varVertexColor;
vec4 texel = texture2D(uTextureUnit0, varTexCoord0);
color *= texel;
/* Varyings */
return color;
varying vec2 varTexCoord0;
varying vec2 varTexCoord1;
varying vec4 varVertexColor;
varying float varEyeDist;
vec4 renderSolid()
{
vec4 Color = varVertexColor;
if(uTextureUsage0)
Color *= texture2D(uTextureUnit0, varTexCoord0);
//Color.a = 1.0;
return Color;
}
void main (void)
vec4 render2LayerSolid()
{
gl_FragColor = renderSolid();
float BlendFactor = varVertexColor.a;
vec4 Texel0 = texture2D(uTextureUnit0, varTexCoord0);
vec4 Texel1 = texture2D(uTextureUnit1, varTexCoord1);
vec4 Color = Texel0 * BlendFactor + Texel1 * (1.0 - BlendFactor);
return Color;
}
vec4 renderLightMap()
{
vec4 Texel0 = texture2D(uTextureUnit0, varTexCoord0);
vec4 Texel1 = texture2D(uTextureUnit1, varTexCoord1);
vec4 Color = Texel0 * Texel1 * 4.0;
Color.a = Texel0.a * Texel0.a;
return Color;
}
vec4 renderDetailMap()
{
vec4 Texel0 = texture2D(uTextureUnit0, varTexCoord0);
vec4 Texel1 = texture2D(uTextureUnit1, varTexCoord1);
vec4 Color = Texel0;
Color += Texel1 - 0.5;
return Color;
}
vec4 renderReflection2Layer()
{
vec4 Color = varVertexColor;
vec4 Texel0 = texture2D(uTextureUnit0, varTexCoord0);
vec4 Texel1 = texture2D(uTextureUnit1, varTexCoord1);
Color *= Texel0 * Texel1;
return Color;
}
vec4 renderTransparent()
{
vec4 Color = vec4(1.0, 1.0, 1.0, 1.0);
if(uTextureUsage0)
Color *= texture2D(uTextureUnit0, varTexCoord0);
return Color;
}
void main ()
{
if (uMaterialType == Solid)
gl_FragColor = renderSolid();
else if(uMaterialType == Solid2Layer)
gl_FragColor = render2LayerSolid();
else if(uMaterialType == LightMap)
gl_FragColor = renderLightMap();
else if(uMaterialType == DetailMap)
gl_FragColor = renderDetailMap();
else if(uMaterialType == SphereMap)
gl_FragColor = renderSolid();
else if(uMaterialType == Reflection2Layer)
gl_FragColor = renderReflection2Layer();
else if(uMaterialType == TransparentAlphaChannel)
gl_FragColor = renderTransparent();
else if(uMaterialType == TransparentAlphaChannelRef)
{
vec4 Color = renderTransparent();
if (Color.a < 0.5)
discard;
gl_FragColor = Color;
}
else if(uMaterialType == TransparentVertexAlpha)
{
vec4 Color = renderTransparent();
Color.a = varVertexColor.a;
gl_FragColor = Color;
}
else if(uMaterialType == TransparentReflection2Layer)
{
vec4 Color = renderReflection2Layer();
Color.a = varVertexColor.a;
gl_FragColor = Color;
}
else
gl_FragColor = vec4(1.0, 1.0, 1.0, 1.0);
}

View File

@ -1,21 +1,36 @@
/* Attributes */
attribute vec3 inVertexPosition;
attribute vec3 inVertexNormal;
attribute vec4 inVertexColor;
attribute vec2 inTexCoord0;
attribute vec2 inTexCoord1;
/* Uniforms */
uniform int uMaterialType;
uniform mat4 uMvpMatrix;
uniform mat4 uTextureMatrix0;
uniform mat4 uTextureMatrix1;
/* Varyings */
varying vec2 varTexCoord0;
varying vec2 varTexCoord1;
varying vec4 varVertexColor;
varying float eyeDist;
varying float varEyeDist;
void main(void)
{
gl_Position = uMvpMatrix * vec4(inVertexPosition,1.0);
varTexCoord0 = inTexCoord0;
varTexCoord1 = inTexCoord0;
vec4 TexCoord0 = vec4(inTexCoord0.x, inTexCoord0.y, 0.0, 0.0);
varTexCoord0 = vec4(uTextureMatrix0 * TexCoord0).xy;
vec4 TexCoord1 = vec4(inTexCoord1.x, inTexCoord1.y, 0.0, 0.0);
varTexCoord1 = vec4(uTextureMatrix1 * TexCoord1).xy;
varVertexColor = inVertexColor.zyxw;
}

View File

@ -539,13 +539,15 @@ namespace video
addAndDropMaterialRenderer(new COGLES2FixedPipelineRenderer(FPVSData, FPFSData, EMT_LIGHTMAP_LIGHTING, this));
addAndDropMaterialRenderer(new COGLES2FixedPipelineRenderer(FPVSData, FPFSData, EMT_LIGHTMAP_LIGHTING_M2, this));
addAndDropMaterialRenderer(new COGLES2FixedPipelineRenderer(FPVSData, FPFSData, EMT_LIGHTMAP_LIGHTING_M4, this));
addAndDropMaterialRenderer(new COGLES2FixedPipelineRenderer(FPVSData, FPFSData, EMT_DETAIL_MAP, this));
addAndDropMaterialRenderer(new COGLES2FixedPipelineRenderer(FPVSData, FPFSData, EMT_SPHERE_MAP, this));
addAndDropMaterialRenderer(new COGLES2FixedPipelineRenderer(FPVSData, FPFSData, EMT_REFLECTION_2_LAYER, this));
addAndDropMaterialRenderer(new COGLES2FixedPipelineRenderer(FPVSData, FPFSData, EMT_TRANSPARENT_ADD_COLOR, this));
addAndDropMaterialRenderer(new COGLES2FixedPipelineRenderer(FPVSData, FPFSData, EMT_TRANSPARENT_ALPHA_CHANNEL, this));
addAndDropMaterialRenderer(new COGLES2FixedPipelineRenderer(FPVSData, FPFSData, EMT_TRANSPARENT_ALPHA_CHANNEL_REF, this));
addAndDropMaterialRenderer(new COGLES2FixedPipelineRenderer(FPVSData, FPFSData, EMT_TRANSPARENT_VERTEX_ALPHA, this));
addAndDropMaterialRenderer(new COGLES2FixedPipelineRenderer(FPVSData, FPFSData, EMT_TRANSPARENT_REFLECTION_2_LAYER, this));
addAndDropMaterialRenderer(new COGLES2NormalMapRenderer(NMVSData, NMFSData, EMT_NORMAL_MAP_SOLID, this));
addAndDropMaterialRenderer(new COGLES2NormalMapRenderer(NMVSData, NMFSData, EMT_NORMAL_MAP_TRANSPARENT_ADD_COLOR, this));
addAndDropMaterialRenderer(new COGLES2NormalMapRenderer(NMVSData, NMFSData, EMT_NORMAL_MAP_TRANSPARENT_VERTEX_ALPHA, this));
@ -1698,6 +1700,12 @@ namespace video
}
bool COGLES2Driver::isActiveTexture(u32 stage)
{
return (CurrentTexture[stage]) ? true : false;
}
//! disables all textures beginning with the optional fromStage parameter.
bool COGLES2Driver::disableTextures(u32 fromStage)
{

View File

@ -271,6 +271,9 @@ namespace video
//! sets the current Texture
bool setActiveTexture(u32 stage, const video::ITexture* texture);
//! check if active texture is not equal null.
bool isActiveTexture(u32 stage);
//! disables all textures beginning with fromStage.
bool disableTextures(u32 fromStage = 0);

View File

@ -28,7 +28,7 @@ COGLES2FixedPipelineRenderer::COGLES2FixedPipelineRenderer(const c8* vertexShade
#ifdef _DEBUG
setDebugName("COGLES2FixedPipelineRenderer");
#endif
yy = (int)baseMaterial;
int Temp = 0;
SharedRenderer = reinterpret_cast<COGLES2MaterialRenderer*>(driver->getMaterialRenderer(EMT_SOLID));
@ -54,9 +54,29 @@ void COGLES2FixedPipelineRenderer::OnSetMaterial(const video::SMaterial& materia
video::IMaterialRendererServices* services)
{
if (SharedRenderer)
SharedRenderer->OnSetMaterial(material, lastMaterial, resetAllRenderstates, services);
Driver->getBridgeCalls()->setProgram(SharedRenderer->getProgram());
else
COGLES2MaterialRenderer::OnSetMaterial(material, lastMaterial, resetAllRenderstates, services);
Driver->getBridgeCalls()->setProgram(Program);
Driver->setBasicRenderStates(material, lastMaterial, resetAllRenderstates);
if (FixedBlending)
{
Driver->getBridgeCalls()->setBlendFunc(GL_ONE, GL_ONE_MINUS_SRC_COLOR);
Driver->getBridgeCalls()->setBlend(true);
}
else if (Blending)
{
E_BLEND_FACTOR srcFact,dstFact;
E_MODULATE_FUNC modulate;
u32 alphaSource;
unpack_textureBlendFunc(srcFact, dstFact, modulate, alphaSource, material.MaterialTypeParam);
Driver->getBridgeCalls()->setBlendFunc(Driver->getGLBlend(srcFact), Driver->getGLBlend(dstFact));
Driver->getBridgeCalls()->setBlend(true);
}
else
Driver->getBridgeCalls()->setBlend(false);
}
@ -68,9 +88,51 @@ bool COGLES2FixedPipelineRenderer::OnRender(IMaterialRendererServices* service,
{
Driver->setTextureRenderStates(Driver->getCurrentMaterial(), false);
/* Vertex Shader part */
s32 materialType = 0;
switch(Driver->getCurrentMaterial().MaterialType)
{
case EMT_SOLID_2_LAYER:
materialType = 1;
break;
case EMT_LIGHTMAP:
case EMT_LIGHTMAP_ADD:
case EMT_LIGHTMAP_M2:
case EMT_LIGHTMAP_M4:
case EMT_LIGHTMAP_LIGHTING:
case EMT_LIGHTMAP_LIGHTING_M2:
case EMT_LIGHTMAP_LIGHTING_M4:
materialType = 2;
break;
case EMT_DETAIL_MAP:
materialType = 3;
break;
case EMT_SPHERE_MAP:
materialType = 4;
break;
case EMT_REFLECTION_2_LAYER:
materialType = 5;
break;
case EMT_TRANSPARENT_ALPHA_CHANNEL:
materialType = 6;
break;
case EMT_TRANSPARENT_ALPHA_CHANNEL_REF:
materialType = 7;
break;
case EMT_TRANSPARENT_VERTEX_ALPHA:
materialType = 8;
break;
case EMT_TRANSPARENT_REFLECTION_2_LAYER:
materialType = 9;
break;
default:
break;
}
setPixelShaderConstant("uMaterialType", &materialType, 1);
/* Transform Matrices Upload */
/* Matrices Upload */
core::matrix4 world = Driver->getTransform(ETS_WORLD);
setPixelShaderConstant("uWorldMatrix", world.pointer(), 16);
@ -80,8 +142,21 @@ bool COGLES2FixedPipelineRenderer::OnRender(IMaterialRendererServices* service,
setPixelShaderConstant("uMvpMatrix", worldViewProj.pointer(), 16);
/* Textures Upload */
int TextureUnit0 = 0;
int TextureUnit1 = 1;
s32 TextureUsage0 = Driver->isActiveTexture(0);
s32 TextureUsage1 = Driver->isActiveTexture(1);
setPixelShaderConstant("uTextureUsage0", &TextureUsage0, 1);
setPixelShaderConstant("uTextureUsage1", &TextureUsage1, 1);
core::matrix4 textureMatrix0 = Driver->getTransform(video::ETS_TEXTURE_0);
core::matrix4 textureMatrix1 = Driver->getTransform(video::ETS_TEXTURE_0);
setPixelShaderConstant("uTextureMatrix0", textureMatrix0.pointer(), 16);
setPixelShaderConstant("uTextureMatrix1", textureMatrix1.pointer(), 16);
s32 TextureUnit0 = 0;
s32 TextureUnit1 = 1;
setPixelShaderConstant("uTextureUnit0", &TextureUnit0, 1);
setPixelShaderConstant("uTextureUnit1", &TextureUnit1, 1);

View File

@ -37,7 +37,7 @@ public:
virtual bool OnRender(IMaterialRendererServices* service, E_VERTEX_TYPE vtxtype);
protected:
int yy;
COGLES2MaterialRenderer* SharedRenderer;
};

View File

@ -106,6 +106,10 @@ COGLES2MaterialRenderer::~COGLES2MaterialRenderer()
UniformInfo.clear();
}
GLuint COGLES2MaterialRenderer::getProgram() const
{
return Program;
}
void COGLES2MaterialRenderer::init(s32& outMaterialTypeNr,
const c8* vertexShaderProgram,

View File

@ -55,6 +55,8 @@ public:
//! Destructor
virtual ~COGLES2MaterialRenderer();
GLuint getProgram() const;
virtual void OnSetMaterial(const SMaterial& material, const SMaterial& lastMaterial,
bool resetAllRenderstates, IMaterialRendererServices* services);

View File

@ -498,11 +498,6 @@ void COGLES2Texture::bindRTT()
//! Unbind Render Target Texture
void COGLES2Texture::unbindRTT()
{
Driver->setActiveTexture(0, this);
Driver->getBridgeCalls()->setTexture(0);
// Copy Our ViewPort To The Texture
glCopyTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, 0, 0, getSize().Width, getSize().Height);
}