GPU编程入门(四)

下面给出一个完整的使用vs 和ps的例子,例子没做什么,只是让大家知道一个shader和direcetx是怎么结合起来的,看例子: 

 

vertex shader: // first_vs.txt


matrix WVPMatrix;
vector color;

struct  VS_INPUT
{
vector position : POSITION;
}
;

struct  VS_OUTPUT
{
vector position : POSITION;
vector color : COLOR;
}
;

VS_OUTPUT main(VS_INPUT input)
{
VS_OUTPUT output 
= (VS_OUTPUT)0;

output.position 
= mul(input.position, WVPMatrix); 
output.color 
= color;

return output;
}


// 顶点程序没做什么,只是设置了顶点的位置坐标,然后输出一个color到片段程序

pixel shader
// first_ps.txt

struct  Output  {
   vector color : COLOR;
}
;

Output ps_main(vector color : COLOR)
{
   Output OUT;
float4 _color
={1,0,0,1};
   OUT.color 
= _color;
   
return OUT;
}


// 简单的输出黄色

下面是一个directx程序,创建一个三角形,然后用上面的两个程序渲染~~看代码

 

#include  " d3dUtility.h "
#define  ReleaseCOM(x) {if(x!=NULL) x->Release(); x=NULL;}
//
//  Globals
//

IDirect3DDevice9
*  Device  =   0

const   int  Width    =   640 ;
const   int  Height  =   480 ;

IDirect3DVertexBuffer9
*  Triangle  =   0 //  vertex buffer to store
                                       
//  our triangle data.

// pointer about the shader
IDirect3DVertexShader9 *  BasicShader  =   0 ; // vs pointer
IDirect3DPixelShader9 *    PixelShader  =   0 ; // ps pointer
ID3DXConstantTable *  BasicConstTable  =   0 ; // vs constant table pointer
ID3DXConstantTable *  PixelConstTable  =   0 ; // ps constant table pointer
D3DXHANDLE WVPMatrixHandle            =   0 ; // matrix handle
D3DXHANDLE ColorHandle                =   0 ; // color handle

//
//  Classes and Structures
//
struct  Vertex
{
Vertex()
{}

Vertex(
float x, float y, float z)
{
   _x 
= x;   _y = y;   _z = z;
}


float _x, _y, _z;
DWORD _color;
static const DWORD FVF;
}
;
const  DWORD Vertex::FVF  =  D3DFVF_XYZ | D3DFVF_DIFFUSE;

//
//  Framework Functions
//
bool  Setup()
{
//
// Create the vertex buffer.
//
ID3DXBuffer* shaderBuffer       = 0;
ID3DXBuffer
* errorBuffer        = 0;
Device
->CreateVertexBuffer(
   
3 * sizeof(Vertex), // size in bytes
   D3DUSAGE_WRITEONLY, // flags
   Vertex::FVF,         // vertex format
   D3DPOOL_MANAGED,     // managed memory pool
   &Triangle,           // return create vertex buffer
   0);                  // not used - set to 0

//
// Fill the buffers with the triangle data.
//

Vertex
* vertices;
Triangle
->Lock(00, (void**)&vertices, 0);

vertices[
0= Vertex(-1.0f0.0f2.0f);
vertices[
1= Vertex( 0.0f1.0f2.0f);
vertices[
2= Vertex( 1.0f0.0f2.0f);

     vertices[
0]._color=D3DCOLOR_XRGB(250,0,0);
Triangle
->Unlock();

//
// Set the projection matrix.
//

D3DXMATRIX proj;
D3DXMatrixPerspectiveFovLH(
    
&proj,                         // result
    D3DX_PI * 0.5f,                // 90 - degrees
    (float)Width / (float)Height, // aspect ratio
    1.0f,                          // near plane
    1000.0f);                      // far plane
Device->SetTransform(D3DTS_PROJECTION, &proj);

//创建vertex shader
HRESULT hr = D3DXCompileShaderFromFile("first_vs.txt",
              
0,
              
0,
              
"main"// entry point function name
              "vs_1_1",
              D3DXSHADER_DEBUG,
              
&shaderBuffer,
              
&errorBuffer,
              
&BasicConstTable);

// output any error messages
if(errorBuffer)
{
   MessageBox(
0, (char*)errorBuffer->GetBufferPointer(), 00);
   ReleaseCOM(errorBuffer);
   exit(
0);
}


if(FAILED(hr))
{
   MessageBox(
0"D3DXCompileShaderFromFile() - FAILED"00);
   
return false;
}


hr 
= Device->CreateVertexShader((DWORD*)shaderBuffer->GetBufferPointer(), &BasicShader);

if(FAILED(hr))
{
   MessageBox(
0"CreateVertexShader - FAILED"00);
   
return false;
}



ReleaseCOM(shaderBuffer);

//创建pixel shader

HRESULT hr2 
= D3DXCompileShaderFromFile("first_ps.txt",
              
0,
              
0,
              
"ps_main"// entry point function name
              "ps_1_1",
              D3DXSHADER_DEBUG,
              
&shaderBuffer,
              
&errorBuffer,
              
&PixelConstTable);

// output any error messages
if(errorBuffer)
{
   MessageBox(
0, (char*)errorBuffer->GetBufferPointer(), 00);
   ReleaseCOM(errorBuffer);
   exit(
0);
}


if(FAILED(hr2))
{
   MessageBox(
0"D3DXCompileShaderFromFile() - FAILED"00);
   
return false;
}


hr2 
= Device->CreatePixelShader((DWORD*)shaderBuffer->GetBufferPointer(), &PixelShader);

if(FAILED(hr2))
{
   MessageBox(
0"CreateVertexShader - FAILED"00);
   
return false;
}

ReleaseCOM(shaderBuffer);

WVPMatrixHandle 
= BasicConstTable->GetConstantByName(0"WVPMatrix");ColorHandle = BasicConstTable->GetConstantByName(0"color");
BasicConstTable
->SetDefaults(Device);

//set light false so we can see the triangle's color
Device->SetRenderState(D3DRS_LIGHTING, false);

return true;
}

void  Cleanup()
{
d3d::Release
<IDirect3DVertexBuffer9*>(Triangle);
      ReleaseCOM(BasicShader);
     ReleaseCOM(BasicConstTable);

      ReleaseCOM(PixelShader);
     ReleaseCOM(PixelConstTable);
}


bool  Display( float  timeDelta)
{
if( Device )
{
   Device
->Clear(00, D3DCLEAR_TARGET | D3DCLEAR_ZBUFFER,D3DCOLOR_XRGB(153,153,153), 1.0f0);
   Device
->BeginScene();
         Device
->SetStreamSource(0, Triangle, 0sizeof(Vertex));
   Device
->SetFVF(Vertex::FVF);
  
   D3DXMATRIX matWorld, matView, matProj;
      Device
->GetTransform(D3DTS_WORLD, &matWorld);
      Device
->GetTransform(D3DTS_VIEW, &matView);
      Device
->GetTransform(D3DTS_PROJECTION, &matProj);

      D3DXMATRIX matWVP 
= matWorld * matView * matProj;
     
     
//set the globals 设置shader程序的全局变量,这里为了显示有和没有pixel shader的区别,先设置了一个颜色,然后用ps修改
      BasicConstTable->SetMatrix(Device, WVPMatrixHandle, &matWVP);
      D3DXVECTOR4 color(
1.0f1.0f0.0f1.0f);
      BasicConstTable
->SetVector(Device, ColorHandle, &color);
  
   
//use the shader 使用shader
   Device->SetVertexShader(BasicShader);
   Device
->SetPixelShader(PixelShader);
   
// Draw one triangle.
   Device->DrawPrimitive(D3DPT_TRIANGLELIST, 01);

   Device
->EndScene();
   Device
->Present(0000);
}

return true;
}



//
//  WndProc
//
LRESULT CALLBACK d3d::WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
switch( msg )
{
case WM_DESTROY:
   ::PostQuitMessage(
0);
   
break;
  
case WM_KEYDOWN:
   
if( wParam == VK_ESCAPE )
    ::DestroyWindow(hwnd);
   
break;
}

return ::DefWindowProc(hwnd, msg, wParam, lParam);
}


//
//  WinMain
//
int  WINAPI WinMain(HINSTANCE hinstance,
        HINSTANCE prevInstance, 
        PSTR cmdLine,
        
int  showCmd)
{
if(!d3d::InitD3D(hinstance,
   Width, Height, 
true, D3DDEVTYPE_HAL, &Device))
{
   ::MessageBox(
0"InitD3D() - FAILED"00);
   
return 0;
}

  
if(!Setup())
{
   ::MessageBox(
0"Setup() - FAILED"00);
   
return 0;
}


d3d::EnterMsgLoop( Display );

Cleanup();

Device
->Release();

return 0;
}

运行程序,毫无新意,就是一个黄色的三角形

大部分都是有注释的,能看懂的吧,很早写的程序了,肯定很乱的,凑合吧

这里为了显示有没有ps的区别,先是用vs把三角形的颜色设成绿色,然后用ps改成黄色(吃饱撑的,哈哈)你可是注释掉关于ps的那部分代码,一样能工作的 去掉vs 同样能的,哈哈

前面说了,这个程序只是向你展示怎么用,怎么结合,下节就不会给出directx程序了,只给出shader,自己运行吧 出错就是你进步的开始

下次贴个纹理混合吧~~

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值