DirectX 90 3D SetRenderState 设置渲染状态

改变D3D中的渲染状态


1、设置着色模式:

SetRenderState(D3DRS_SHADEMODE, D3DSHADE_FLAT); //设置平面着色模式
SetRenderState(D3DRS_SHADEMODE, D3DSHADE_GOURAUD); //设置格劳德着色模式


2、设置多边形填充模式:

SetRenderState(D3DRS_FILLMODE, D3DFILL_POINT); //点填充模式,D3D在多边形的每个顶点绘制一个像素
SetRenderState(D3DRS_FILLMODE, D3DFILL_WIREFRAME); //线填充模式,D3D在多边形的每个边绘制一条线
SetRenderState(D3DRS_FILLMODE, D3DFILL_SOLID);   //面模式,D3D默认模式,对多边形的面进行填充


3、设置全景图形抗锯齿:

SetRenderState(D3DRS_MUTISAMPLEANTIALIAS, TRUE)   //抗锯齿
SetRenderState(D3DRS_MUTISAMPLEANTIALIAS, FALSE)   //不抗锯齿


4、设置剔除模式:

SetRenderState(D3DRS_CULLMODE, D3DCULL_NONE) //不剔除任何面


5、设置光照模式:

SetRenderState(D3DRS_AMBIENT, D3DCOLOR ambientColor); //为整个场景设置环境光
SetRenderState(D3DRS_SPECULARENABLE, TRUE);   //激活镜面反射计算(D3D默认情况下关闭);


6、启动/关闭深度测试:

SetRenderState(D3DRS_ZENABLE, TRUE);    //启用深度测试


7、设置纹理过滤器


//线性纹理
SetSamplerState(0, D3DSAMP_MAGFILTER, D3DTEXF_LINEAR);
SetSamplerState(0, D3DSAMP_MINFILTER, D3DTEXF_LINEAR);

//最近点采样

SetSamplerState(0, D3DSAMP_MAGFILTER, D3DTEXF_ POINT);
SetSamplerState(0, D3DSAMP_MIPFILTER, D3DTEXF_POINT);

//各向异性纹理过滤
SetSamplerState(0, D3DSAMP_MINFILTER, D3DTEXF_ANISOTROPIC)
SetSamplerState(0, D3DSAMP_MIPFILTER, D3DTEXF_ ANISOTROPIC);


8、缩放功能


SetRenderState(D3DRS_POINTSCALEENABLE, TRUE);//打开


9、设置点缩放因子

SetRenderState(D3DRS_POINTSCALE_A, FtoDW(1.00f));
SetRenderState(D3DRS_POINTSCALE_B, FtoDW(1.00F));
SetRenderState(D3DRS_POINTSCALE_C, FtoDW(1.00f));


10、设置点大小上限

SetRenderState(D3DRS_POINTSIZE_MAX, FtoDW(5.00f));
SetRenderState(D3DRS_POINTSIZE_MAX, FtoDW(5.00f));

SetRenderState(D3DRS_POINTSPRITEENABLE, TRUE) ;  //打开点精灵效果

SetRenderState(D3DRS_AMBIENT, 0xffffffff);  //设置环境光颜色开启ALPHA混合效果


11、设置混合因子

SetRenderState(D3DRS_SRCBLEND, D3DBLEND_SRCALPHA);//源
SetRenderState(D3DRS_DESTBLEND, D3DBLEND_INVSRCALPHA);//目的

第二个参数是 D3DBLEND的枚举结构。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要实现将D3D渲染到透明窗口上并在窗口上设置QLabel,可以按照以下步骤进行: 1. 创建一个透明窗口A,并设置窗口的透明度为0。 2. 在窗口A上添加一个QLabel,并设置其大小和位置。 3. 创建一个D3D设备,并将其与窗口A关联。 4. 在D3D中创建一个纹理,并将其绑定到窗口A的背景表面上。 5. 在渲染过程中,将D3D渲染到背景表面上,并将其绘制到窗口A上。 下面是示例代码: ```cpp #include <QtWidgets/QMainWindow> #include <QLabel> #include <d3d9.h> class TransparentWindow : public QMainWindow { Q_OBJECT public: TransparentWindow(QWidget *parent = 0); ~TransparentWindow(); private: QLabel *m_pLabel; LPDIRECT3D9 m_pD3D; LPDIRECT3DDEVICE9 m_pDevice; LPDIRECT3DTEXTURE9 m_pTexture; D3DPRESENT_PARAMETERS m_d3dpp; HWND m_hWnd; void initD3D(HWND hWnd); void render(); }; TransparentWindow::TransparentWindow(QWidget *parent) : QMainWindow(parent) { setWindowFlags(Qt::FramelessWindowHint | Qt::WindowStaysOnTopHint | Qt::Tool); setAttribute(Qt::WA_TranslucentBackground); setAttribute(Qt::WA_NoSystemBackground, true); setAttribute(Qt::WA_PaintOnScreen, true); setAttribute(Qt::WA_NativeWindow, true); m_pLabel = new QLabel(this); m_pLabel->setGeometry(50, 50, 200, 200); m_pLabel->setText("Hello, world!"); m_hWnd = (HWND)winId(); initD3D(m_hWnd); } TransparentWindow::~TransparentWindow() { if (m_pD3D) m_pD3D->Release(); if (m_pDevice) m_pDevice->Release(); if (m_pTexture) m_pTexture->Release(); } void TransparentWindow::initD3D(HWND hWnd) { m_pD3D = Direct3DCreate9(D3D_SDK_VERSION); ZeroMemory(&m_d3dpp, sizeof(m_d3dpp)); m_d3dpp.Windowed = TRUE; m_d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD; m_d3dpp.BackBufferFormat = D3DFMT_UNKNOWN; m_d3dpp.EnableAutoDepthStencil = TRUE; m_d3dpp.AutoDepthStencilFormat = D3DFMT_D16; m_d3dpp.PresentationInterval = D3DPRESENT_INTERVAL_IMMEDIATE; m_pD3D->CreateDevice(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, hWnd, D3DCREATE_HARDWARE_VERTEXPROCESSING, &m_d3dpp, &m_pDevice); m_pDevice->SetRenderState(D3DRS_ALPHABLENDENABLE, TRUE); m_pDevice->SetRenderState(D3DRS_SRCBLEND, D3DBLEND_SRCALPHA); m_pDevice->SetRenderState(D3DRS_DESTBLEND, D3DBLEND_INVSRCALPHA); m_pDevice->CreateTexture(200, 200, 1, D3DUSAGE_RENDERTARGET, D3DFMT_A8R8G8B8, D3DPOOL_DEFAULT, &m_pTexture, NULL); LPDIRECT3DSURFACE9 pSurface; m_pTexture->GetSurfaceLevel(0, &pSurface); m_pDevice->SetRenderTarget(0, pSurface); pSurface->Release(); } void TransparentWindow::render() { m_pDevice->Clear(0, NULL, D3DCLEAR_TARGET | D3DCLEAR_ZBUFFER, D3DCOLOR_ARGB(0, 0, 0, 0), 1.0f, 0); m_pDevice->BeginScene(); // TODO: 在这里进行 D3D 渲染 m_pDevice->EndScene(); LPDIRECT3DSURFACE9 pSurface; m_pTexture->GetSurfaceLevel(0, &pSurface); m_pDevice->GetRenderTargetData(pSurface, pSurface); m_pDevice->SetRenderTarget(0, pSurface); pSurface->Release(); m_pDevice->StretchRect(pSurface, NULL, m_d3dpp.BackBuffer, NULL, D3DTEXF_NONE); m_pDevice->Present(NULL, NULL, m_hWnd, NULL); } int main(int argc, char *argv[]) { QApplication a(argc, argv); TransparentWindow w; w.show(); return a.exec(); } ``` 在这个示例中,我们使用了Qt的QMainWindow作为透明窗口,并在窗口上添加了一个QLabel。在initD3D函数中,我们创建了一个D3D设备,并将其与窗口A的背景表面关联起来。在render函数中,我们进行D3D渲染,并将渲染结果绘制到窗口A上。注意,在渲染完成后,我们需要将背景表面的内容拷贝到纹理中,并将纹理绘制到窗口上。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值