HLSL中的多纹理输入和输出
来源:互联网 发布:初级程序员考试时间 编辑:程序博客网 时间:2024/06/07 23:56
1:分配内存,创建纹理,并和表面挂接
LPDIRECT3DTEXTURE9 inputTexturePtr(void) {return _inp_tex;}
LPDIRECT3DTEXTURE9 _out_tex;
LPDIRECT3DSURFACE9 _surface_out;
LPDIRECT3DSURFACE9 _oldRenderTarget;
_data = new T[_num_channels * _width * _height];
if(FAILED( D3DXCreateTexture(
xDevice, // Device
_width, // width
_height, // height
1, // mip levels
D3DUSAGE_RENDERTARGET, // usage
format, // format
D3DPOOL_DEFAULT, // memory pool
&_out_tex)))
{
std::cout << "**ERROR: unable to create output stream texture!/n";
}
_out_tex->GetSurfaceLevel(0, &_surface_out);
2:将kernel用到的输入和输出纹理放于对应数组中
_inputNames.push_back(newname);
_inputArrays.push_back(array);
_outputArrays.push_back(array);
3:运行是
(1):传入需要的参数
(2):将输入的纹理传入
for (i=0;i<_inputArrays.size();i++)
{
_shader->sendTexture(_inputNames[i], _inputArrays[i]->texturePtr());
}
(3):将所有的输出作为渲染目标(按顺序自动计入shader的,COLOR0-N)
for (unsigned long i=0;i<_outputArrays.size();i++)
{
_outputArrays[i]->setRenderTarget(i);
}
void setRenderTarget(int MRT) // Stream als Rendertarget festlegen
{
//--------------------------------------------------------------------------
// Alter Viewport / altes Rendertarget speicher
_oldRenderTarget=NULL;
if (MRT==0) xDevice->GetViewport(&_viewportStored);
xDevice->GetRenderTarget(MRT,&_oldRenderTarget); // altes Render Target speichern
//--------------------------------------------------------------------------
xDevice->SetRenderTarget(MRT,_surface_out); // neues Render Target festlegen
xDevice->SetViewport(&_viewportTexture);
}
(4):执行
xDevice->BeginScene();
unsigned int numpasses;
numpasses = _shader->start();
// Alle P鋝se rendern
for (unsigned int pass=0;pass<numpasses;pass++)
{
_shader->beginPass(pass);
xDevice->SetRenderState( D3DRS_CULLMODE, D3DCULL_NONE );
xDevice->SetStreamSource( 0, _pVertexBuffer, 0, sizeof(mVertex) );
xDevice->SetFVF( D3DFVF_MVERTEX );
xDevice->DrawPrimitive( D3DPT_TRIANGLESTRIP, 0, 2 );
_shader->endPass();
}
_shader->stop();
xDevice->EndScene();
(5):恢复渲染目标
for (unsigned long i=0;i<_outputArrays.size();i++)
{
_outputArrays[i]->restoreRenderTarget(i);
}
void restoreRenderTarget(int MRT) // altes Rendertarget wiederherstellen (inkl. Viewport)
{
xDevice->SetRenderTarget(MRT,_oldRenderTarget);
if (MRT==0) xDevice->SetViewport(&_viewportStored);
SAFE_RELEASE(_oldRenderTarget);
}
LPDIRECT3DTEXTURE9 inputTexturePtr(void) {return _inp_tex;}
LPDIRECT3DTEXTURE9 _out_tex;
LPDIRECT3DSURFACE9 _surface_out;
LPDIRECT3DSURFACE9 _oldRenderTarget;
_data = new T[_num_channels * _width * _height];
if(FAILED( D3DXCreateTexture(
xDevice, // Device
_width, // width
_height, // height
1, // mip levels
D3DUSAGE_RENDERTARGET, // usage
format, // format
D3DPOOL_DEFAULT, // memory pool
&_out_tex)))
{
std::cout << "**ERROR: unable to create output stream texture!/n";
}
_out_tex->GetSurfaceLevel(0, &_surface_out);
2:将kernel用到的输入和输出纹理放于对应数组中
_inputNames.push_back(newname);
_inputArrays.push_back(array);
_outputArrays.push_back(array);
3:运行是
(1):传入需要的参数
(2):将输入的纹理传入
for (i=0;i<_inputArrays.size();i++)
{
_shader->sendTexture(_inputNames[i], _inputArrays[i]->texturePtr());
}
(3):将所有的输出作为渲染目标(按顺序自动计入shader的,COLOR0-N)
for (unsigned long i=0;i<_outputArrays.size();i++)
{
_outputArrays[i]->setRenderTarget(i);
}
void setRenderTarget(int MRT) // Stream als Rendertarget festlegen
{
//--------------------------------------------------------------------------
// Alter Viewport / altes Rendertarget speicher
_oldRenderTarget=NULL;
if (MRT==0) xDevice->GetViewport(&_viewportStored);
xDevice->GetRenderTarget(MRT,&_oldRenderTarget); // altes Render Target speichern
//--------------------------------------------------------------------------
xDevice->SetRenderTarget(MRT,_surface_out); // neues Render Target festlegen
xDevice->SetViewport(&_viewportTexture);
}
(4):执行
xDevice->BeginScene();
unsigned int numpasses;
numpasses = _shader->start();
// Alle P鋝se rendern
for (unsigned int pass=0;pass<numpasses;pass++)
{
_shader->beginPass(pass);
xDevice->SetRenderState( D3DRS_CULLMODE, D3DCULL_NONE );
xDevice->SetStreamSource( 0, _pVertexBuffer, 0, sizeof(mVertex) );
xDevice->SetFVF( D3DFVF_MVERTEX );
xDevice->DrawPrimitive( D3DPT_TRIANGLESTRIP, 0, 2 );
_shader->endPass();
}
_shader->stop();
xDevice->EndScene();
(5):恢复渲染目标
for (unsigned long i=0;i<_outputArrays.size();i++)
{
_outputArrays[i]->restoreRenderTarget(i);
}
void restoreRenderTarget(int MRT) // altes Rendertarget wiederherstellen (inkl. Viewport)
{
xDevice->SetRenderTarget(MRT,_oldRenderTarget);
if (MRT==0) xDevice->SetViewport(&_viewportStored);
SAFE_RELEASE(_oldRenderTarget);
}
- HLSL中的多纹理输入和输出
- GLSL的多纹理输入和输出
- DirectX 3D_基础之像素着色器 多重纹理 像素着色器的输入和输出 HLSL采样器对象
- GLSL的多纹理输入和输出【转】
- overlay中的输入和输出
- overlay中的输入和输出
- Shell中的输入和输出
- HLSL中如何把输入映射到输出像素
- CG-多纹理输入
- C#中的控制台输入和输出
- 输入和输出--javase中的路径
- (三)C++中的输入和输出
- C++中的标准输入和输出
- Java中的输入和输出重定向
- Unity3D中的深度纹理和法线纹理
- CG-多纹理输入【转】
- MRT(多纹理输出OPENEXR)
- DirectX 3D_基础之效果框架 手法和路径 HLSL的内置对象(纹理对象 采样器对象与采样器状态 顶点着色器对象和像素着色器对象)效果文件中的设备状态
- 考研题目 第六章 树
- LCD1602 C语言驱动程序
- Silverlight 2.0 的新特性
- 构件稳定的运行程序。
- red hat 9.0 下摄像头驱动的安装
- HLSL中的多纹理输入和输出
- 用mp3隐藏文件
- 考研题目 第三章 栈和队列 答案
- VC 初学者的自白
- 并发与并行
- CG 程序的创建
- 考研题目 第五章 数组和广义表答案
- 考研题目 第四章 串 答案
- GLSL 的创建