HLSL 研究学习之六章三节

本文介绍了一种在Direct3D中实现3D三角形纹理与色彩混合的方法,通过使用HLSL(High-Level Shader Language)及.fx文件,演示如何在不使用像素着色器的情况下完成纹理与单一颜色的混合。

 (6_3)3D三角形纹理与色彩混合(fx中单一色,不用PS)

 

 

hlsl.fx:

// -------------------------------------------------------------
//hlsl.fx:(6_3)3D三角形纹理与色彩混合(fx中单一色,不用PS)
// -------------------------------------------------------------
// 全局变量
// -------------------------------------------------------------
float4x4 matWorldViewProj;
texture g_Texture; 
string  g_TexFile="banana.bmp";
// -------------------------------------------------------------
// 输出顶点信息结构
// -------------------------------------------------------------
struct VS_OUTPUT
{
    float4 Pos  :       POSITION;
    float4 Diffuse    : COLOR0;
    float2 TexUV :      TEXCOORD0;
};


// -------------------------------------------------------------
// 顶点渲染指令段
// -------------------------------------------------------------
VS_OUTPUT VS(float4 Pos : POSITION,float2 TexUV: TEXCOORD0)
{
    VS_OUTPUT Out;     
    Out.Pos = mul(Pos, matWorldViewProj); // transform Position
    Out.TexUV=TexUV;
    float4 diffuse = { 1.0f, 0.0f, 1.0f, 1.0f};
    Out.Diffuse.rgb = diffuse;
    Out.Diffuse.a = 1.0f;
    return Out;
}

// -------------------------------------------------------------
// 管道效果指令段
// -------------------------------------------------------------
technique TShader
{
    pass P0
    {
       Texture[0] = <g_Texture>;   //指定第一层纹理
       ColorOp[0] = Modulate;    //指定第一层色彩的操作方式
       ColorArg1[0] = Texture;   //指定第一层色彩操作方式的第一方为纹理
       ColorArg2[0] = Diffuse;   //指定第一层色彩操作方式的第二方为顶点色彩
       AlphaOp[0] = Modulate;    //指定第一层Alpha操作方式
       AlphaArg1[0] = Texture;   //指定第一层Alpha操作方式的第一方为从纹理中取得
       AlphaArg2[0] = Diffuse;   //指定第一层Alpha操作方式的第二方为从顶点色彩中取得
       MinFilter[0] = Linear;    //设置第一层纹理纹理过滤方式
       MagFilter[0] = Linear;    //设置第一层纹理纹理过滤方式
       MipFilter[0] = Linear;    //设置第一层纹理纹理过滤方式
       ColorOp[1] = Disable;     //关闭第二层纹理
       AlphaOp[1] = Disable;     //关闭第二层Alpha
        // 编译相应的指令段
        VertexShader = compile vs_1_1 VS();
    }
}


C++代码:

 

//-----------------------------------------------------------------------------
//HLSL学习:(6_3)3D三角形纹理与色彩混合(fx中单一色,不用PS)
//-----------------------------------------------------------------------------
#include <Windows.h>
#include <mmsystem.h>
#include <d3dx9.h>
#include <strsafe.h>


//-----------------------------------------------------------------------------
// Global variables
//-----------------------------------------------------------------------------
LPDIRECT3D9             g_pD3D       = NULL; // Used to create the D3DDevice
LPDIRECT3DDEVICE9       g_pd3dDevice = NULL; // Our rendering device
LPDIRECT3DVERTEXBUFFER9 g_pVB        = NULL; // Buffer to hold vertices
LPD3DXEFFECT            g_pEffect    = NULL;
LPDIRECT3DTEXTURE9      g_pTexture   = NULL; // Our texture
D3DXVECTOR4             g_LightDir= D3DXVECTOR4( 0.0f, 0.0f, 1.0f, 1.0f );
// A structure for our custom vertex type
struct CUSTOMVERTEX
{
    FLOAT x, y, z;      // The untransformed, 3D position for the vertex
    DWORD color;        // The vertex color
 FLOAT tu, tv;
};

// Our custom FVF, which describes our custom vertex structure
#define D3DFVF_CUSTOMVERTEX (D3DFVF_XYZ|D3DFVF_DIFFUSE|D3DFVF_TEX1)

 


//-----------------------------------------------------------------------------
// Name: InitD3D()
// Desc: Initializes Direct3D
//-----------------------------------------------------------------------------
HRESULT InitD3D( HWND hWnd )
{
    // Create the D3D object.
    if( NULL == ( g_pD3D = Direct3DCreate9( D3D_SDK_VERSION ) ) )
        return E_FAIL;

    // Set up the structure used to create the D3DDevice
    D3DPRESENT_PARAMETERS d3dpp;
    ZeroMemory( &d3dpp, sizeof(d3dpp) );
    d3dpp.Windowed = TRUE;
    d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD;
    d3dpp.BackBufferFormat = D3DFMT_UNKNOWN;

    // Create the D3DDevice
    if( FAILED( g_pD3D->CreateDevice( D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, hWnd,
                                      D3DCREATE_SOFTWARE_VERTEXPROCESSING,
                                      &d3dpp, &g_pd3dDevice ) ) )
    {
        return E_FAIL;
    }

    // Turn off culling, so we see the front and back of the triangle
    g_pd3dDevice->SetRenderState( D3DRS_CULLMODE, D3DCULL_NONE );

    // Turn off D3D lighting, since we are providing our own vertex colors
    g_pd3dDevice->SetRenderState( D3DRS_LIGHTING, FALSE );

 //创建HLSH
 if( FAILED(D3DXCreateEffectFromFile( g_pd3dDevice, "hlsl.fx", NULL, NULL,
  D3DXSHADER_DEBUG, NULL, &g_pEffect, NULL ) ) )
 {
        return E_FAIL;
 }
 if( g_pEffect != NULL ) g_pEffect->OnResetDevice();
  
 //设定效果:因为只有一个,所以初始时就设了~
 D3DXHANDLE hTechnique = g_pEffect->GetTechniqueByName( "TShader" );
 g_pEffect->SetTechnique( hTechnique );

 
    return S_OK;
}

 


//-----------------------------------------------------------------------------
// Name: InitGeometry()
// Desc: Creates the scene geometry
//-----------------------------------------------------------------------------
HRESULT InitGeometry()
{
    // Initialize three vertices for rendering a triangle
    CUSTOMVERTEX g_Vertices[] =
    {
        { -1.0f,-1.0f, 0.0f, 0xffff0000,0.0f,1.0f},
        {  1.0f,-1.0f, 0.0f, 0xff0000ff,1.0f,1.0f},
        {  0.0f, 1.0f, 0.0f, 0xffffffff,0.5f,0.0f},
    };

    // Create the vertex buffer.
    if( FAILED( g_pd3dDevice->CreateVertexBuffer( 3*sizeof(CUSTOMVERTEX),
                                                  0, D3DFVF_CUSTOMVERTEX,
                                                  D3DPOOL_DEFAULT, &g_pVB, NULL ) ) )
    {
        return E_FAIL;
    }

    // Fill the vertex buffer.
    VOID* pVertices;
    if( FAILED( g_pVB->Lock( 0, sizeof(g_Vertices), (void**)&pVertices, 0 ) ) )
        return E_FAIL;
    memcpy( pVertices, g_Vertices, sizeof(g_Vertices) );
    g_pVB->Unlock();

 const char* t_FileName;
 g_pEffect->GetString("g_TexFile",&t_FileName);

 if( FAILED( D3DXCreateTextureFromFile( g_pd3dDevice, t_FileName, &g_pTexture ) ) )
    {
  MessageBox(NULL, "Could not find banana.bmp", "Textures.exe", MB_OK);
  return E_FAIL;
    }

 g_pEffect->SetTexture( "g_Texture", g_pTexture );
    return S_OK;
}

 


//-----------------------------------------------------------------------------
// Name: Cleanup()
// Desc: Releases all previously initialized objects
//-----------------------------------------------------------------------------
VOID Cleanup()
{
    if( g_pTexture != NULL )
        g_pTexture->Release();

    if( g_pEffect != NULL )       
        g_pEffect->Release();

    if( g_pVB != NULL )
        g_pVB->Release();

    if( g_pd3dDevice != NULL )
        g_pd3dDevice->Release();

    if( g_pD3D != NULL )
        g_pD3D->Release();
}

 

//-----------------------------------------------------------------------------
// Name: SetupMatrices()
// Desc: Sets up the world, view, and projection transform matrices.
//-----------------------------------------------------------------------------
VOID SetupMatrices()
{
    // For our world matrix, we will just rotate the object about the y-axis.
    D3DXMATRIXA16 matWorld;

    UINT  iTime  = timeGetTime() % 1000;
    FLOAT fAngle = iTime * (2.0f * D3DX_PI) / 1000.0f;
    D3DXMatrixRotationY( &matWorld, fAngle );

    D3DXVECTOR3 vEyePt( 0.0f, 3.0f,-5.0f );
    D3DXVECTOR3 vLookatPt( 0.0f, 0.0f, 0.0f );
    D3DXVECTOR3 vUpVec( 0.0f, 1.0f, 0.0f );
    D3DXMATRIXA16 matView;
    D3DXMatrixLookAtLH( &matView, &vEyePt, &vLookatPt, &vUpVec );

    D3DXMATRIXA16 matProj;
    D3DXMatrixPerspectiveFovLH( &matProj, D3DX_PI/4, 1.0f, 1.0f, 100.0f );

 //设定VS矩阵
 D3DXMATRIX mWorldViewProj = matWorld * matView * matProj;
 g_pEffect->SetMatrix( "matWorldViewProj", &mWorldViewProj );

}

 

//-----------------------------------------------------------------------------
// Name: Render()
// Desc: Draws the scene
//-----------------------------------------------------------------------------
VOID Render()
{
    // Clear the backbuffer to a black color
    g_pd3dDevice->Clear( 0, NULL, D3DCLEAR_TARGET, D3DCOLOR_XRGB(0,0,0), 1.0f, 0 );

    // Begin the scene
    if( SUCCEEDED( g_pd3dDevice->BeginScene() ) )
    {
        // Setup the world, view, and projection matrices
        SetupMatrices();

  //按VS,PS渲染
  if( g_pEffect != NULL )
  {
   UINT nPasses=0;
   UINT iPass=0;
   if(SUCCEEDED(g_pEffect->Begin( &nPasses, 0 )))
   {
    for(iPass = 0; iPass < nPasses; iPass ++ )
    {
     g_pEffect->BeginPass( iPass );
    }
    g_pd3dDevice->SetStreamSource( 0, g_pVB, 0, sizeof(CUSTOMVERTEX) );
    g_pd3dDevice->SetFVF( D3DFVF_CUSTOMVERTEX );
    g_pd3dDevice->DrawPrimitive( D3DPT_TRIANGLESTRIP, 0, 1 );
    g_pEffect->EndPass();
    g_pEffect->End();
   }
  }
        // End the scene
        g_pd3dDevice->EndScene();
    }

    // Present the backbuffer contents to the display
    g_pd3dDevice->Present( NULL, NULL, NULL, NULL );
}

 


//-----------------------------------------------------------------------------
// Name: MsgProc()
// Desc: The window's message handler
//-----------------------------------------------------------------------------
LRESULT WINAPI MsgProc( HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam )
{
    switch( msg )
    {
        case WM_DESTROY:
            Cleanup();
            PostQuitMessage( 0 );
            return 0;
    }

    return DefWindowProc( hWnd, msg, wParam, lParam );
}

 


//-----------------------------------------------------------------------------
// Name: WinMain()
// Desc: The application's entry point
//-----------------------------------------------------------------------------
INT WINAPI WinMain( HINSTANCE hInst, HINSTANCE, LPSTR, INT )
{
    // Register the window class
    WNDCLASSEX wc = { sizeof(WNDCLASSEX), CS_CLASSDC, MsgProc, 0L, 0L,
                      GetModuleHandle(NULL), NULL, NULL, NULL, NULL,
                      "D3D Tutorial", NULL };
    RegisterClassEx( &wc );

    // Create the application's window
    HWND hWnd = CreateWindow( "D3D Tutorial", "HLSL学习6_3",
                              WS_OVERLAPPEDWINDOW, 100, 100, 256, 256,
                              GetDesktopWindow(), NULL, wc.hInstance, NULL );

    // Initialize Direct3D
    if( SUCCEEDED( InitD3D( hWnd ) ) )
    {
        // Create the scene geometry
        if( SUCCEEDED( InitGeometry() ) )
        {
            // Show the window
            ShowWindow( hWnd, SW_SHOWDEFAULT );
            UpdateWindow( hWnd );

            // Enter the message loop
            MSG msg;
            ZeroMemory( &msg, sizeof(msg) );
            while( msg.message!=WM_QUIT )
            {
                if( PeekMessage( &msg, NULL, 0U, 0U, PM_REMOVE ) )
                {
                    TranslateMessage( &msg );
                    DispatchMessage( &msg );
                }
                else
    {
     Render();
    }
            }
        }
    }

    UnregisterClass( "D3D Tutorial", wc.hInstance );
    return 0;
}

 

本文来自优快云博客,转载请标明出处:http://blog.youkuaiyun.com/honghaier/archive/2008/10/31/3196453.aspx

传送带损坏与对象检测数据集 一、基础信息 • 数据集名称:传送带损坏与对象检测数据集 • 图片数量: 训练集:645张图片 验证集:185张图片 测试集:92张图片 总计:922张工业监控图片 • 训练集:645张图片 • 验证集:185张图片 • 测试集:92张图片 • 总计:922张工业监控图片 • 分类类别: Hole(孔洞):传送带表面的孔洞损坏。 Human(人类):工作区域中的人类,用于安全监控。 Other Objects(其他对象):非预期对象,可能引起故障。 Puncture(刺穿):传送带被刺穿的损坏。 Roller(滚筒):传送带滚筒部件。 Tear(撕裂):传送带撕裂损坏。 impact damage(冲击损坏):由于冲击导致的损坏。 patch work(修补工作):已修补的区域。 • Hole(孔洞):传送带表面的孔洞损坏。 • Human(人类):工作区域中的人类,用于安全监控。 • Other Objects(其他对象):非预期对象,可能引起故障。 • Puncture(刺穿):传送带被刺穿的损坏。 • Roller(滚筒):传送带滚筒部件。 • Tear(撕裂):传送带撕裂损坏。 • impact damage(冲击损坏):由于冲击导致的损坏。 • patch work(修补工作):已修补的区域。 • 标注格式:YOLO格式,包含边界框和类别标签,适用于目标检测任务。 • 数据格式:图像数据来源于工业监控系统,适用于计算机视觉分析。 二、适用场景 • 工业自动化检测系统开发:用于构建自动检测传送带损坏和异物的AI模型,实现实时监控和预防性维护,减少停机时间。 • 安全监控应用:识别人类和其他对象,提升工业环境的安全性,避免事故和人员伤害。 • 学术研究与创新:支持计算机视觉在制造业、物流和自动化领域的应用研究,促进AI技术与工业实践的融合。 • 教育与培训:可用于培训AI模型或作为工业工程和自动化教育的案例数据,帮助学习者理解实际应用场景。 三、数据集优势 • 多样化的类别覆盖:包含8个关键类别,涵盖多种损坏类型和对象,确保模型能够处理各种实际工业场景,提升泛化能力。 • 精准的标注质量:采用YOLO格式,边界框标注准确,由专业标注人员完成,保证数据可靠性和模型训练效果。 • 强大的任务适配性:兼容主流深度学习框架(如YOLO、TensorFlow、PyTorch),可直接用于目标检测任务,并支持扩展至其他视觉任务需求。 • 突出的工业价值:专注于工业传送带系统的实际需求,帮助提升生产效率、降低维护成本,并增强工作场所安全,具有较高的实际应用价值。
一、基础信息 • 数据集名称:垃圾废弃物目标检测数据集 • 图片数量: 训练集:1124张图片 验证集:375张图片 总计:1499张图片 • 训练集:1124张图片 • 验证集:375张图片 • 总计:1499张图片 • 分类类别:包含60多个垃圾和废弃物类别,如气溶胶、铝泡罩包装、电池、破碎玻璃、卡片泡罩包装、香烟、透明塑料瓶、瓦楞纸箱、薯片袋、一次性食品容器、一次性塑料杯、饮料罐、饮料纸盒、鸡蛋盒、泡沫杯、泡沫食品容器、食品罐、食物垃圾、垃圾袋、玻璃瓶、玻璃杯、玻璃罐、杂志纸、餐盒、金属瓶盖、金属盖、普通纸、其他纸箱、其他塑料、其他塑料瓶、其他塑料容器、其他塑料杯、其他塑料包装、纸袋、纸杯、纸吸管、披萨盒、塑料瓶盖、塑料薄膜、塑料手套、塑料盖、塑料吸管、塑料餐具、聚丙烯袋、拉环、绳子、废金属、鞋子、一次性购物袋、六罐环、涂抹管、可挤压管、泡沫塑料片、纸巾、厕纸管、特百惠、未标记垃圾、包装纸等。 • 标注格式:YOLO格式,包含边界框和类别标签,适用于目标检测任务。 • 数据格式:图片来源于实际场景,细节清晰。 二、适用场景 • 垃圾自动分类系统开发:数据集支持目标检测任务,帮助构建能够自动识别和分类垃圾物品的AI模型,用于智能垃圾桶或回收系统,提升废弃物管理效率。 • 环保应用研发:集成至环保和废弃物管理应用,提供实时垃圾识别功能,促进回收和环境保护,支持可持续发展倡议。 • 学术研究与创新:支持计算机视觉与环保领域的交叉研究,助力发表垃圾识别和AI技术相关学术论文,推动技术创新。 • 教育与培训:可用于学校或培训机构,作为垃圾分类和AI目标检测教学的重要资源,培养环保意识和技术能力。 三、数据集优势 • 精准标注与多样性:每张图片经过准确标注,确保边界框定位精确;包含多种垃圾类别,覆盖常见废弃物,提升模型的泛化能力和鲁棒性。 • 任务适配性强:标注兼容主流深度学习框架(如YOLO等),可直接用于目标检测任务,并支持扩展到其他视觉任务,如分类或分割。 • 实际应用价值:专注于垃圾识别,为环保、废弃物管理和回收提供重要数据支撑,有助于减少污染和促进循环经济。
水下垃圾实例分割数据集 一、基础信息 • 数据集名称:水下垃圾实例分割数据集 • 图片数量: 训练集:1049张图片 验证集:300张图片 测试集:150张图片 总计:1499张图片 • 训练集:1049张图片 • 验证集:300张图片 • 测试集:150张图片 • 总计:1499张图片 • 分类类别: Aerosol(气溶胶罐) Aluminium blister pack(铝泡罩包装) Aluminium foil(铝箔) Battery(电池) Broken glass(碎玻璃) Carded blister pack(卡式泡罩包装) Cigarette(香烟) Clear plastic bottle(透明塑料瓶) Corrugated carton(瓦楞纸箱) Crisp packet(薯片袋) Disposable food container(一次性食品容器) Disposable plastic cup(一次性塑料杯) Drink can(饮料罐) Drink carton(饮料纸盒) Egg carton(鸡蛋盒) Foam cup(泡沫杯) Foam food container(泡沫食品容器) Food Can(食品罐) Food waste(食物垃圾) Garbage bag(垃圾袋) Glass bottle(玻璃瓶) Glass cup(玻璃杯) Glass jar(玻璃罐) Magazine paper(杂志纸) Meal carton(餐盒) Metal bottle cap(金属瓶盖) Metal lid(金属盖子) Normal paper(普通纸) Other carton(其他纸盒) Other plastic(其他塑料) Other plastic bottle(其他塑料瓶) Other plastic container(其他塑料容器) Other plastic cup(其他塑料杯) Other plastic wrapper(其他塑料包装) Paper bag(纸袋) Paper cup(纸杯) Paper straw(纸吸管) Pizza box(披萨盒) Plastic bottle cap(塑料瓶盖) Plastic film(塑料薄膜) Plastic gloves(塑料手套) Plastic lid(塑料盖子) Plastic straw(塑料吸管) Plastic utensils(塑料餐具) Polypropylene bag(聚丙烯袋) Pop tab(易拉罐拉环) Rope - strings(绳子-字符串) Scrap metal(废金属) Shoe(鞋子) Single-use carrier bag(一次性购物袋) Six pack rings(六罐环) Spread tub(涂抹桶) Squeezable tube(可挤压管) Styrofoam piece(泡沫塑料片) Tissues(纸巾) Toilet tube(卫生纸卷) Tupperware(特百惠) Unlabeled litter(未标记垃圾) Wrapping paper(包装纸) • Aerosol(气溶胶罐) • Aluminium blister pack(铝泡罩包装) • Aluminium foil(铝箔) • Battery(电池) • Broken glass(碎玻璃) • Carded blister pack(卡式泡罩包装) • Cigarette(香烟) • Clear plastic bottle(透明塑料瓶) • Corrugated carton(瓦楞纸箱) • Crisp packet(薯片袋) • Disposable food container(一次性食品容器) • Disposable plastic cup(一次性塑料杯) • Drink can(饮料罐) • Drink carton(饮料纸盒) • Egg carton(鸡蛋盒) • Foam cup(泡沫杯) • Foam food container(泡沫食品容器) • Food Can(食品罐) • Food waste(食物垃圾) • Garbage bag(垃圾袋) • Glass bottle(玻璃瓶) • Glass cup(玻璃杯) • Glass jar(玻璃罐) • Magazine paper(杂志纸) • Meal carton(餐盒) • Metal bottle cap(金属瓶盖) • Metal lid(金属盖子) • Normal paper(普通纸) • Other carton(其他纸盒) • Other plastic(其他塑料) • Other pl
内容概要:本文介绍了在MATLAB平台上实现的基于CNN-SVM融合模型的多特征分类预测项目,通过结合卷积神经网络(CNN)强大的自动特征提取能力与支持向量机(SVM)优异的分类泛化性能,构建了一种高精度、强鲁棒性的混合分类框架。项目详细阐述了模型的整体架构,包括数据预处理、CNN特征提取、全连接层输出、特征降维与标准化、SVM分类决策等模块,并针对多源高维特征融合、小样本不平衡、特征空间不匹配、模型效率与可解释性等实际挑战提出相应解决方案。文中还提供了部分代码示例和性能评估方法,展示了该模型在图像、医疗、金融等多领域的应用潜力。; 适合人群:具备一定机器学习和MATLAB编程基础,从事数据分析、智能系统开发或相关研究工作的高校师生、科研人员及工程技术人员;适合有一定深度学习背景、希望探索模型融合技术的中级开发者。; 使用场景及目标:①应用于多特征、小样本、类别不平衡的复杂分类任务,如医学图像识别、金融欺诈检测、工业故障诊断等;②提升分类准确率与模型泛化能力,同时增强决策可解释性;③为实际业务场景提供可复用、可扩展的智能分类解决方案。; 阅读建议:建议结合MATLAB深度学习工具箱动手实践,重点关注CNN特征提取与SVM分类的衔接流程,理解特征降维与标准化的关键作用,并通过调整网络结构、核函数参数等进行模型优化实验,深入掌握融合模型的设计思想与调参技巧。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值