bool fullPixelPositionRegister = false;
bool leadingVertexFirst = false; // Flat shading uses first vertex, else last
bool secondaryColor = false; // Specular lighting is applied after texturing
+ bool colorsDefaultToZero = false;
bool forceWindowed = false;
bool quadLayoutEnabled = false;
extern bool fullPixelPositionRegister;
extern bool leadingVertexFirst; // Flat shading uses first vertex, else last
extern bool secondaryColor; // Specular lighting is applied after texturing
+ extern bool colorsDefaultToZero;
extern bool forceWindowed;
extern bool complementaryDepthBuffer;
sw::fullPixelPositionRegister = conventions.fullPixelPositionRegister;
sw::leadingVertexFirst = conventions.leadingVertexFirst;
sw::secondaryColor = conventions.secondaryColor;
+ sw::colorsDefaultToZero = conventions.colorsDefaultToZero;
sw::exactColorRounding = exactColorRounding;
setRenderTarget(0, 0);
bool fullPixelPositionRegister;
bool leadingVertexFirst;
bool secondaryColor;
+ bool colorsDefaultToZero;
};
static const Conventions OpenGL =
true, // booleanFaceRegister
true, // fullPixelPositionRegister
false, // leadingVertexFirst
- false // secondaryColor
+ false, // secondaryColor
+ true, // colorsDefaultToZero
};
static const Conventions Direct3D =
false, // fullPixelPositionRegister
true, // leadingVertexFirst
true, // secondardyColor
+ false, // colorsDefaultToZero
};
struct Query
namespace sw
{
+ extern bool colorsDefaultToZero;
+
SamplerCore::SamplerCore(Pointer<Byte> &constants, const Sampler::State &state) : constants(constants), state(state)
{
}
if(fixed12 && state.textureFilter != FILTER_GATHER)
{
int componentCount = textureComponentCount();
+ short defaultColorValue = colorsDefaultToZero ? 0x0000 : 0x1000;
switch(state.textureFormat)
{
case FORMAT_YV12_BT601:
case FORMAT_YV12_BT709:
case FORMAT_YV12_JFIF:
- if(componentCount < 2) c.y = Short4(0x1000);
- if(componentCount < 3) c.z = Short4(0x1000);
+ if(componentCount < 2) c.y = Short4(defaultColorValue);
+ if(componentCount < 3) c.z = Short4(defaultColorValue);
if(componentCount < 4) c.w = Short4(0x1000);
break;
case FORMAT_A8:
c.z = c.x;
break;
case FORMAT_R32F:
- c.y = Short4(0x1000);
+ c.y = Short4(defaultColorValue);
case FORMAT_G32R32F:
- c.z = Short4(0x1000);
+ c.z = Short4(defaultColorValue);
case FORMAT_X32B32G32R32F:
c.w = Short4(0x1000);
case FORMAT_A32B32G32R32F:
}
int componentCount = textureComponentCount();
+ float defaultColorValue = colorsDefaultToZero ? 0.0f : 1.0f;
if(state.textureFilter != FILTER_GATHER)
{
case FORMAT_YV12_BT601:
case FORMAT_YV12_BT709:
case FORMAT_YV12_JFIF:
- if(componentCount < 2) c.y = Float4(1.0f);
- if(componentCount < 3) c.z = Float4(1.0f);
+ if(componentCount < 2) c.y = Float4(defaultColorValue);
+ if(componentCount < 3) c.z = Float4(defaultColorValue);
if(componentCount < 4) c.w = Float4(1.0f);
break;
case FORMAT_A8:
c.z = c.x;
break;
case FORMAT_R32F:
- c.y = Float4(1.0f);
+ c.y = Float4(defaultColorValue);
case FORMAT_G32R32F:
- c.z = Float4(1.0f);
+ c.z = Float4(defaultColorValue);
case FORMAT_X32B32G32R32F:
c.w = Float4(1.0f);
case FORMAT_A32B32G32R32F: