似乎NVIDIA的显卡驱动就有这个选项。不知道怎么做的。今天试了试自己写的代码。看上去的效果还凑合,就是需要比较长的时间适应。
最近没时间,有时间写个详细的原理吧。
简单说的就是。用两个Camera,两个Camera平行或者看着同一个点。分别渲染到两个RenderTarget里。
然后把两个RT贴到显示器上。
左眼的摄像机干掉gb通道,右眼的干掉r通道。
混合的Shader看上去是这样的:
SamplerState DefaultSampler : register(s0);
Texture2D DiffuseTexture : register(t0);
Texture2D RightEyeTexture : register(t1);
struct PS_INPUT
{
float4 Pos : SV_POSITION;
float4 Tex : TEXCOORD0;
float4 Tex1 : TEXCOORD1;
float4 Color : COLOR;
};
float4 COMMON_Texture(float4 _Color , float2 texCoord , SamplerState _sampler , Texture2D _texture )
{
return _texture.Sample(_sampler, texCoord.xy) * _Color ;
}
float4 CM_SteroLeft(float4 vDiffuse )
{
return float4(vDiffuse.x , 0 , 0 , vDiffuse.w);
}
float4 CM_SteroRight(float4 vDiffuse )
{
return float4(0 , vDiffuse.y , vDiffuse.z , vDiffuse.w);
}
float4 main( PS_INPUT input) : SV_Target
{
float4 vDiffuse = input.Color ;
float4 lColor = DiffuseTexture.Sample(DefaultSampler, input.Tex.xy);
lColor = CM_SteroLeft(lColor);
float4 rColor = RightEyeTexture.Sample(DefaultSampler, input.Tex.xy);
rColor = CM_SteroRight(rColor);
vDiffuse = lColor ;
vDiffuse.x += rColor.x;
vDiffuse.y += rColor.y;
vDiffuse.z += rColor.z;
return vDiffuse;
}
渲染的代码看上去是这样的。
void CEvolEnviroment::updateFrame(long passedTime)
{
m_pRenderApi->pushRenderView(m_LVBackBuffer);
updateFrame(passedTime , m_renderVisitor , m_pCamera );
m_pRenderApi->popRenderView();
m_pRenderApi->pushRenderView(m_RVBackBuffer);
updateFrame(passedTime , m_renderVisitor , m_pRightCamera );
m_pRenderApi->popRenderView();
//===================
m_pRenderApi->applyCamera(m_p2DCamera);
m_pRenderApi->identityMatrix(MATRIXMODE_World);
m_pRenderApi->setDepthStencilState(m_pStencilState);
int w = 0; int h = 0;
m_pRenderApi->getRenderViewSize(w , h );
xvec4 destRect(0,0,w,h);
xvec4 srcRect(0,0,256,256);
xColor_4f cl(1.0f,1.0f,1.0f,1.0f);
IRenderTarget* pRTLeft = dynamic_cast<IRenderTarget*>(m_LVBackBuffer->renderTarget(0));
IRenderTarget* pRTRight = dynamic_cast<IRenderTarget*>(m_RVBackBuffer->renderTarget(0));
IGpuProgram* pGpuProgram = m_hSteroProgram.getResource();
m_pRenderApi->setBlendState( m_pRenderApi->createBlendState(L"AlphaBlend") );
m_pRenderApi->setGpuProgram( pGpuProgram );
m_pRenderApi->setTexture(Texture_Diffuse , pRTLeft->toTexture() );
m_pRenderApi->setTexture(L"RightEyeTexture" , pRTRight->toTexture() );
m_pRenderApi->drawRectf( pRTLeft->toTexture() , &destRect.x, cl);
m_pRenderApi->swapBuffer();
}