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

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

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值