http://bugs.winehq.org/show_bug.cgi?id=28078
--- Comment #16 from Stefan Dösinger stefandoesinger@gmx.at 2011-08-18 12:55:59 CDT --- I think I see the problem. The app is using D3DTOP_SELECTARG1 as color and alpha op, and D3DTA_SPECULAR as color and alpha arg 1. This means it is feeding the specular alpha directly as input into the alpha blending operation.
The problem is that there is no such thing as specular alpha, at least not in opengl. D3D usually puts manual fog coordinates there, but the fragment processing can read the values there as well. So what the app does is murky, but legal.
GL_EXT_secondary_color explicitly doesn't provide a glSecondaryColor4 function to provide the secondary color in immediate mode. It also disallows secondary color pointers with 4 components when using vertex arrays, but most GL implementations accept them, and actually do what we want with them. So when a vertex buffer is used this game works by luck.
So it's a different issue than I originally thought, but the prescription is the same: With a vertex pipeline replacement shader we could use numbered attributes to pass the specular color and make this behavior work reliably.