Try to do Z textures better. Z texturing does not work if early z or no z update. Corrected the Z texture bias used on 8 and 16 bit textures.
git-svn-id: https://dolphin-emu.googlecode.com/svn/trunk@4596 8ced0084-cf51-0410-be5f-012b33b47a6e
This commit is contained in:
parent
c9f5521d26
commit
6e7395cef1
|
@ -58,8 +58,11 @@ void GetPixelShaderId(PIXELSHADERUID &uid, u32 texturemask, u32 dstAlphaEnable)
|
||||||
|
|
||||||
uid.values[2] = texturemask;
|
uid.values[2] = texturemask;
|
||||||
|
|
||||||
|
u32 enableZTexture = (!bpmem.zcontrol.zcomploc && bpmem.zmode.testenable && bpmem.zmode.updateenable)?1:0;
|
||||||
|
|
||||||
uid.values[3] = (u32)bpmem.fog.c_proj_fsel.fsel |
|
uid.values[3] = (u32)bpmem.fog.c_proj_fsel.fsel |
|
||||||
((u32)bpmem.fog.c_proj_fsel.proj << 3);
|
((u32)bpmem.fog.c_proj_fsel.proj << 3) |
|
||||||
|
((u32)enableZTexture << 4);
|
||||||
|
|
||||||
int hdr = 4;
|
int hdr = 4;
|
||||||
u32* pcurvalue = &uid.values[hdr];
|
u32* pcurvalue = &uid.values[hdr];
|
||||||
|
@ -522,11 +525,19 @@ const char *GeneratePixelShader(u32 texture_mask, bool dstAlphaEnable, u32 HLSL)
|
||||||
// the screen space depth value = far z + (clip z / clip w) * z range
|
// the screen space depth value = far z + (clip z / clip w) * z range
|
||||||
WRITE(p, "float zCoord = "I_ZBIAS"[1].x + (clipPos.z / clipPos.w) * "I_ZBIAS"[1].y;\n");
|
WRITE(p, "float zCoord = "I_ZBIAS"[1].x + (clipPos.z / clipPos.w) * "I_ZBIAS"[1].y;\n");
|
||||||
|
|
||||||
// use the texture input of the last texture stage (textemp), hopefully this has been read and is in correct format...
|
if (bpmem.ztex2.op != ZTEXTURE_DISABLE && !bpmem.zcontrol.zcomploc && bpmem.zmode.testenable && bpmem.zmode.updateenable)
|
||||||
if (bpmem.ztex2.op == ZTEXTURE_ADD)
|
{
|
||||||
WRITE(p, "zCoord = frac(dot("I_ZBIAS"[0].xyzw, textemp.xyzw) + "I_ZBIAS"[1].w + zCoord);\n");
|
// use the texture input of the last texture stage (textemp), hopefully this has been read and is in correct format...
|
||||||
else if (bpmem.ztex2.op == ZTEXTURE_REPLACE)
|
if (bpmem.ztex2.op == ZTEXTURE_ADD)
|
||||||
WRITE(p, "zCoord = frac(dot("I_ZBIAS"[0].xyzw, textemp.xyzw) + "I_ZBIAS"[1].w);\n");
|
WRITE(p, "zCoord = dot("I_ZBIAS"[0].xyzw, textemp.xyzw) + "I_ZBIAS"[1].w + zCoord;\n");
|
||||||
|
else
|
||||||
|
WRITE(p, "zCoord = dot("I_ZBIAS"[0].xyzw, textemp.xyzw) + "I_ZBIAS"[1].w;\n");
|
||||||
|
|
||||||
|
// scale to make result from frac correct
|
||||||
|
WRITE(p, "zCoord = zCoord * (16777215.0f/16777216.0f);\n");
|
||||||
|
WRITE(p, "zCoord = frac(zCoord);\n");
|
||||||
|
WRITE(p, "zCoord = zCoord * (16777216.0f/16777215.0f);\n");
|
||||||
|
}
|
||||||
|
|
||||||
WRITE(p, "depth = zCoord;\n");
|
WRITE(p, "depth = zCoord;\n");
|
||||||
|
|
||||||
|
|
|
@ -106,22 +106,20 @@ void PixelShaderManager::SetConstants()
|
||||||
|
|
||||||
if (s_bZTextureTypeChanged)
|
if (s_bZTextureTypeChanged)
|
||||||
{
|
{
|
||||||
static float ffrac = 255.0f/256.0f;
|
|
||||||
float ftemp[4];
|
float ftemp[4];
|
||||||
switch (bpmem.ztex2.type)
|
switch (bpmem.ztex2.type)
|
||||||
{
|
{
|
||||||
case 0:
|
case 0:
|
||||||
// 8 bits
|
// 8 bits
|
||||||
ftemp[0] = ffrac; ftemp[1] = 0; ftemp[2] = 0; ftemp[3] = 0;
|
ftemp[0] = 0; ftemp[1] = 0; ftemp[2] = 0; ftemp[3] = 255.0f/16777215.0f;
|
||||||
break;
|
break;
|
||||||
case 1:
|
case 1:
|
||||||
// 16 bits
|
// 16 bits
|
||||||
ftemp[0] = ffrac/256.0f; ftemp[1] = 0; ftemp[2] = 0; ftemp[3] = ffrac;
|
ftemp[0] = 255.0f/16777215.0f; ftemp[1] = 0; ftemp[2] = 0; ftemp[3] = 65280.0f/16777215.0f;
|
||||||
break;
|
break;
|
||||||
case 2:
|
case 2:
|
||||||
// 24 bits
|
// 24 bits
|
||||||
//ftemp[0] = ffrac/65536.0f; ftemp[1] = ffrac/256.0f; ftemp[2] = ffrac; ftemp[3] = 0;
|
ftemp[0] = 16711680.0f/16777215.0f; ftemp[1] = 65280.0f/16777215.0f; ftemp[2] = 255.0f/16777215.0f; ftemp[3] = 0;
|
||||||
ftemp[0] = ffrac; ftemp[1] = ffrac/256.0f; ftemp[2] = ffrac/65536.0f; ftemp[3] = 0;
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
SetPSConstant4fv(C_ZBIAS, ftemp);
|
SetPSConstant4fv(C_ZBIAS, ftemp);
|
||||||
|
@ -131,7 +129,7 @@ void PixelShaderManager::SetConstants()
|
||||||
if (s_bZBiasChanged || s_bDepthRangeChanged)
|
if (s_bZBiasChanged || s_bDepthRangeChanged)
|
||||||
{
|
{
|
||||||
//ERROR_LOG("pixel=%x,%x, bias=%x\n", bpmem.zcontrol.pixel_format, bpmem.ztex2.type, lastZBias);
|
//ERROR_LOG("pixel=%x,%x, bias=%x\n", bpmem.zcontrol.pixel_format, bpmem.ztex2.type, lastZBias);
|
||||||
SetPSConstant4f(C_ZBIAS+1, lastDepthRange[0] / 16777216.0f, lastDepthRange[1] / 16777216.0f, 0, (float)( (((int)lastZBias<<8)>>8))/16777216.0f);
|
SetPSConstant4f(C_ZBIAS+1, lastDepthRange[0] / 16777216.0f, lastDepthRange[1] / 16777216.0f, 0, (float)(lastZBias)/16777215.0f);
|
||||||
s_bZBiasChanged = s_bDepthRangeChanged = false;
|
s_bZBiasChanged = s_bDepthRangeChanged = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -676,10 +676,10 @@ void Tev::Draw()
|
||||||
// z texture
|
// z texture
|
||||||
if (bpmem.ztex2.op)
|
if (bpmem.ztex2.op)
|
||||||
{
|
{
|
||||||
s32 ztex = bpmem.ztex1.bias;
|
u32 ztex = bpmem.ztex1.bias;
|
||||||
switch (bpmem.ztex2.type) {
|
switch (bpmem.ztex2.type) {
|
||||||
case 0: // 8 bit
|
case 0: // 8 bit
|
||||||
ztex += TexColor[RED_C];
|
ztex += TexColor[ALP_C];
|
||||||
break;
|
break;
|
||||||
case 1: // 16 bit
|
case 1: // 16 bit
|
||||||
ztex += TexColor[ALP_C] << 8 | TexColor[RED_C];
|
ztex += TexColor[ALP_C] << 8 | TexColor[RED_C];
|
||||||
|
@ -689,14 +689,10 @@ void Tev::Draw()
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
switch (bpmem.ztex2.op) {
|
if (bpmem.ztex2.op == ZTEXTURE_ADD)
|
||||||
case ZTEXTURE_ADD:
|
ztex += Position[2];
|
||||||
Position[2] += ztex;
|
|
||||||
break;
|
Position[2] = ztex & 0x00ffffff;
|
||||||
case ZTEXTURE_REPLACE:
|
|
||||||
Position[2] = ztex;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!bpmem.zcontrol.zcomploc && bpmem.zmode.testenable)
|
if (!bpmem.zcontrol.zcomploc && bpmem.zmode.testenable)
|
||||||
|
|
Loading…
Reference in New Issue