- 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-e03cc46cb475master
parent
919c037d05
commit
27bdfd5beb
|
@ -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);
|
||||
}
|
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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)
|
||||
{
|
||||
|
|
|
@ -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);
|
||||
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -37,7 +37,7 @@ public:
|
|||
virtual bool OnRender(IMaterialRendererServices* service, E_VERTEX_TYPE vtxtype);
|
||||
|
||||
protected:
|
||||
|
||||
int yy;
|
||||
COGLES2MaterialRenderer* SharedRenderer;
|
||||
};
|
||||
|
||||
|
|
|
@ -106,6 +106,10 @@ COGLES2MaterialRenderer::~COGLES2MaterialRenderer()
|
|||
UniformInfo.clear();
|
||||
}
|
||||
|
||||
GLuint COGLES2MaterialRenderer::getProgram() const
|
||||
{
|
||||
return Program;
|
||||
}
|
||||
|
||||
void COGLES2MaterialRenderer::init(s32& outMaterialTypeNr,
|
||||
const c8* vertexShaderProgram,
|
||||
|
|
|
@ -55,6 +55,8 @@ public:
|
|||
//! Destructor
|
||||
virtual ~COGLES2MaterialRenderer();
|
||||
|
||||
GLuint getProgram() const;
|
||||
|
||||
virtual void OnSetMaterial(const SMaterial& material, const SMaterial& lastMaterial,
|
||||
bool resetAllRenderstates, IMaterialRendererServices* services);
|
||||
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
||||
|
||||
|
|
Loading…
Reference in New Issue