wined3d: Fix WINED3DRS_DEPTHBIAS handling.
This commit is contained in:
parent
14da44aa36
commit
2c0edb94e3
@ -1666,19 +1666,33 @@ static void state_scissor(DWORD state, IWineD3DStateBlockImpl *stateblock, struc
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* The Direct3D depth bias is specified in normalized depth coordinates. In
|
||||||
|
* OpenGL the bias is specified in units of "the smallest value that is
|
||||||
|
* guaranteed to produce a resolvable offset for a given implementation". To
|
||||||
|
* convert from D3D to GL we need to divide the D3D depth bias by that value.
|
||||||
|
* There's no practical way to retrieve that value from a given GL
|
||||||
|
* implementation, but the D3D application has essentially the same problem,
|
||||||
|
* which makes a guess of 1e-6f seem reasonable here. Note that
|
||||||
|
* SLOPESCALEDEPTHBIAS is a scaling factor for the depth slope, and doesn't
|
||||||
|
* need to be scaled. */
|
||||||
static void state_depthbias(DWORD state, IWineD3DStateBlockImpl *stateblock, struct wined3d_context *context)
|
static void state_depthbias(DWORD state, IWineD3DStateBlockImpl *stateblock, struct wined3d_context *context)
|
||||||
{
|
{
|
||||||
union {
|
if (stateblock->renderState[WINED3DRS_SLOPESCALEDEPTHBIAS]
|
||||||
|
|| stateblock->renderState[WINED3DRS_DEPTHBIAS])
|
||||||
|
{
|
||||||
|
union
|
||||||
|
{
|
||||||
DWORD d;
|
DWORD d;
|
||||||
float f;
|
float f;
|
||||||
} tmpvalue;
|
} scale_bias, const_bias;
|
||||||
|
|
||||||
|
scale_bias.d = stateblock->renderState[WINED3DRS_SLOPESCALEDEPTHBIAS];
|
||||||
|
const_bias.d = stateblock->renderState[WINED3DRS_DEPTHBIAS];
|
||||||
|
|
||||||
if(stateblock->renderState[WINED3DRS_SLOPESCALEDEPTHBIAS] ||
|
|
||||||
stateblock->renderState[WINED3DRS_DEPTHBIAS]) {
|
|
||||||
tmpvalue.d = stateblock->renderState[WINED3DRS_SLOPESCALEDEPTHBIAS];
|
|
||||||
glEnable(GL_POLYGON_OFFSET_FILL);
|
glEnable(GL_POLYGON_OFFSET_FILL);
|
||||||
checkGLcall("glEnable(GL_POLYGON_OFFSET_FILL)");
|
checkGLcall("glEnable(GL_POLYGON_OFFSET_FILL)");
|
||||||
glPolygonOffset(tmpvalue.f, *((float*)&stateblock->renderState[WINED3DRS_DEPTHBIAS]));
|
|
||||||
|
glPolygonOffset(scale_bias.f, const_bias.f * 1e6f);
|
||||||
checkGLcall("glPolygonOffset(...)");
|
checkGLcall("glPolygonOffset(...)");
|
||||||
} else {
|
} else {
|
||||||
glDisable(GL_POLYGON_OFFSET_FILL);
|
glDisable(GL_POLYGON_OFFSET_FILL);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user