红蓝眼镜支持的stero渲染(立体眼镜)

来源:互联网 发布:棋牌 数据库 编辑:程序博客网 时间:2024/04/30 08:24

似乎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();