青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

天行健 君子當自強而不息

效果框架(4)

由于著色器通常是效果文件中的一個關鍵部分,所以我們在該例程的效果文件中使用了著色器。

/*****************************************************************************************
  Cartoon shader in an effect file.
 ****************************************************************************************
*/

matrix  g_world_view;
matrix  g_world_view_proj;

vector  g_color;
vector  g_dir_to_light;
texture g_shader_texture;

struct sVertexInput
{
    vector position : POSITION;
    vector normal    : NORMAL;
};

struct sVertexOutput
{
    vector position : POSITION;
    float2 uv        : TEXCOORD;
    vector diffuse  : COLOR;
};

////////////////////////////////////////////////////////////////////////////////////////////////

sVertexOutput main(sVertexInput input)
{
    sVertexOutput output 
= (sVertexOutput) 0;

    
// transforma vertex position to homogenous clip space
    output.position = mul(input.position, g_world_view_proj);

    
// Transform lights and normals to view space, set w components to zero since we're transforming vectors.
    
// Assume there are no scalings in the world matrix as well.

    g_dir_to_light.w 
= 0.0f;
    input.normal.w   
= 0.0f;

    g_dir_to_light 
= mul(g_dir_to_light, g_world_view);
    input.normal   
= mul(input.normal,   g_world_view);

    
// compute the 1D texture coordinate for catoon rendering

    
float u = dot(g_dir_to_light, input.normal);

    
// Clamp to zero if u is negative because u negative implies the angle between the light and normal 
    
// is greater than 90 degrees.  And if that is true then the surface receives no light.
    if(u < 0.0f)
        u 
= 0.0f;

    
float v = 0.5f;    // set other texture coordinate to middle

    output.uv.x 
= u;
    output.uv.y 
= v;

    output.diffuse 
= g_color;    // save color
    
    
return output;
}

sampler ShaderSampler 
= sampler_state
{
    Texture   
= (g_shader_texture);
    MinFilter 
= POINT;
    MagFilter 
= POINT;
    MipFilter 
= NONE;    // no filtering for cartoon shading
};

technique CartoonTech
{
    pass pass0
    {
        vertexshader 
= compile vs_1_1 main();

        Sampler[
0= (ShaderSampler);
    }
}

 我們注意到卡通著色器函數被定義在效果文件中,并且我們指定著色器使用一個特定的通道,在通道部分使用語法:vertexshader = compile vs_1_1 main();。在效果文件中的設備狀態象通常一樣設置。


執行程序:

/**************************************************************************************************
  Demonstrates cartoon rendering using a vertex shader in an effect file.  You will have to switch to 
  the REF device to run this sample if your hardware does not support shaders.  
  Or you can use software vertex processing: D3DCREATE_SOFTWARE_VERTEXPROCESSING. 
 *************************************************************************************************
*/

#include 
"d3dUtility.h"

#pragma warning(disable : 
4100)

#define MESH_TEAPOT        0
#define MESH_SPHERE        1
#define MESH_TORUS        2
#define MESH_CYLINDER    3
#define NUM_MESH        4

const int WIDTH  = 640;
const int HEIGHT = 480;

IDirect3DDevice9
*        g_device;
ID3DXEffect
*            g_cartoon_effect;
IDirect3DTexture9
*        g_shader_texture;
ID3DXMesh
*                g_meshes[NUM_MESH];
D3DXMATRIX                g_world_matrices[NUM_MESH];
D3DXVECTOR4                g_mesh_colors[NUM_MESH];
D3DXMATRIX                g_proj_matrix;

D3DXHANDLE                g_world_view_handle;
D3DXHANDLE                g_world_view_proj_handle;
D3DXHANDLE                g_color_handle;
D3DXHANDLE                g_dir_to_light_handle;
D3DXHANDLE                g_shader_texture_handle;
D3DXHANDLE                g_cartoon_tech_handle;

////////////////////////////////////////////////////////////////////////////////////////////////////

bool setup()
{    
    D3DXCreateTeapot(g_device, 
&g_meshes[MESH_TEAPOT], NULL);
    D3DXCreateSphere(g_device, 
1.0f2020&g_meshes[MESH_SPHERE], NULL);
    D3DXCreateTorus(g_device, 
0.5f1.0f2020&g_meshes[MESH_TORUS], NULL);
    D3DXCreateCylinder(g_device, 
0.5f0.5f2.0f2020&g_meshes[MESH_CYLINDER], NULL);

    D3DXMatrixTranslation(
&g_world_matrices[MESH_TEAPOT],    0.0f,   2.0f0.0f);
    D3DXMatrixTranslation(
&g_world_matrices[MESH_SPHERE],    0.0f,  -2.0f0.0f);
    D3DXMatrixTranslation(
&g_world_matrices[MESH_TORUS],    -3.0f,   0.0f0.0f);
    D3DXMatrixTranslation(
&g_world_matrices[MESH_CYLINDER],  3.0f,   0.0f0.0f);

    g_mesh_colors[MESH_TEAPOT]   
= D3DXVECTOR4(1.0f0.0f0.0f1.0f);
    g_mesh_colors[MESH_SPHERE]   
= D3DXVECTOR4(0.0f1.0f0.0f1.0f);
    g_mesh_colors[MESH_TORUS]    
= D3DXVECTOR4(0.0f0.0f1.0f1.0f);
    g_mesh_colors[MESH_CYLINDER] 
= D3DXVECTOR4(1.0f1.0f0.0f1.0f);

    
// create effects
    
    ID3DXBuffer
*    error_buffer;

    HRESULT hr 
= D3DXCreateEffectFromFile(g_device, "CartoonShader.cxx", NULL, NULL,        
                    D3DXSHADER_ENABLE_BACKWARDS_COMPATIBILITY, NULL, 
&g_cartoon_effect, &error_buffer);

    
// output any error messages
    if(error_buffer)
    {
        MessageBox(NULL, (
char*)error_buffer->GetBufferPointer(), "ERROR", MB_OK);
        safe_release
<ID3DXBuffer*>(error_buffer);
    }

    
if(FAILED(hr))
    {
        MessageBox(NULL, 
"D3DXCreateEffectFromFile() - FAILED""ERROR", MB_OK);
        
return false;
    }

    
// save frequently accessed parameter handles
    g_cartoon_tech_handle     = g_cartoon_effect->GetTechniqueByName("CartoonTech");
    g_shader_texture_handle  
= g_cartoon_effect->GetParameterByName(NULL, "g_shader_texture");
    g_world_view_handle         
= g_cartoon_effect->GetParameterByName(NULL, "g_world_view");
    g_world_view_proj_handle 
= g_cartoon_effect->GetParameterByName(NULL, "g_world_view_proj");
    g_color_handle             
= g_cartoon_effect->GetParameterByName(NULL, "g_color");
    g_dir_to_light_handle     
= g_cartoon_effect->GetParameterByName(NULL, "g_dir_to_light");

    
// projection
    D3DXMatrixPerspectiveFovLH(&g_proj_matrix, D3DX_PI/4.0f, (float)WIDTH/HEIGHT, 1.0f1000.0f);

    
//
    
// set effect paramters
    
//

    
// light direction
    D3DXVECTOR4 dir_to_light(-0.57f0.57f-0.57f0.0f);
    g_cartoon_effect
->SetVector(g_dir_to_light_handle, &dir_to_light);

    
// set texture
    IDirect3DTexture9* texture;
    D3DXCreateTextureFromFile(g_device, 
"toonshade.bmp"&texture);
    g_cartoon_effect
->SetTexture(g_shader_texture_handle, texture);
    safe_release
<IDirect3DTexture9*>(texture);
    
    
//g_device->SetRenderState(D3DRS_FILLMODE, D3DFILL_WIREFRAME);
    
    
return true;
}

///////////////////////////////////////////////////////////////////////////////////////////////////////

void cleanup()
{    
    
for(int i = 0; i < NUM_MESH; i++)
        safe_release
<ID3DXMesh*>(g_meshes[i]);

    safe_release
<IDirect3DTexture9*>(g_shader_texture);    
    safe_release
<ID3DXEffect*>(g_cartoon_effect);    
}

///////////////////////////////////////////////////////////////////////////////////////////////////////

bool display(float time_delta)
{    
    
static float angle  = (3.0f * D3DX_PI) / 2.0f;
    
static float height = 5.0f;

    
if(GetAsyncKeyState(VK_LEFT) & 0x8000f)
        angle 
-= 0.5f * time_delta;

    
if(GetAsyncKeyState(VK_RIGHT) & 0x8000f)
        angle 
+= 0.5f * time_delta;

    
if(GetAsyncKeyState(VK_UP) & 0x8000f)
        height 
+= 5.0f * time_delta;

    
if(GetAsyncKeyState(VK_DOWN) & 0x8000f)
        height 
-= 5.0f * time_delta;

    D3DXVECTOR3 position(cosf(angle) 
* 7.0f, height, sinf(angle) * 7.0f);
    D3DXVECTOR3 target(
0.0f0.0f0.0f);
    D3DXVECTOR3 up(
0.0f1.0f0.0f);

    D3DXMATRIX view_matrix;
    D3DXMatrixLookAtLH(
&view_matrix, &position, &target, &up);    
    
    
// activate the technique and render

    g_device
->Clear(0, NULL, D3DCLEAR_TARGET | D3DCLEAR_ZBUFFER, 0xFF3333331.0f0);

    g_device
->BeginScene();

    g_cartoon_effect
->SetTechnique(g_cartoon_tech_handle);

    UINT num_passes;
    g_cartoon_effect
->Begin(&num_passes, 0);

    D3DXMATRIX world_view, world_view_proj;

    
for(UINT i = 0; i < num_passes; i++)
    {
        g_cartoon_effect
->BeginPass(i);

        
for(int j = 0; j < NUM_MESH; j++)
        {
            world_view        
= g_world_matrices[j] * view_matrix;
            world_view_proj 
= g_world_matrices[j] * view_matrix * g_proj_matrix;

            g_cartoon_effect
->SetMatrix(g_world_view_handle,        &world_view);
            g_cartoon_effect
->SetMatrix(g_world_view_proj_handle,    &world_view_proj);
            g_cartoon_effect
->SetVector(g_color_handle,                &g_mesh_colors[j]);

            g_cartoon_effect
->CommitChanges();

            g_meshes[j]
->DrawSubset(0);
        }    

        g_cartoon_effect
->EndPass();
    }    
    
    g_cartoon_effect
->End();
    g_device
->EndScene();

    g_device
->Present(NULL, NULL, NULL, NULL);

    
return true;
}

///////////////////////////////////////////////////////////////////////////////////////////////////////

LRESULT CALLBACK wnd_proc(HWND hwnd, UINT msg, WPARAM word_param, LPARAM long_param)
{
    
switch(msg)
    {
    
case WM_DESTROY:
        PostQuitMessage(
0);
        
break;

    
case WM_KEYDOWN:
        
if(word_param == VK_ESCAPE)
            DestroyWindow(hwnd);

        
break;
    }

    
return DefWindowProc(hwnd, msg, word_param, long_param);
}

///////////////////////////////////////////////////////////////////////////////////////////////////////

int WINAPI WinMain(HINSTANCE inst, HINSTANCE, PSTR cmd_line, int cmd_show)
{
    
if(! init_d3d(inst, WIDTH, HEIGHT, true, D3DDEVTYPE_HAL, &g_device))
    {
        MessageBox(NULL, 
"init_d3d() - failed."0, MB_OK);
        
return 0;
    }

    
if(! setup())
    {
        MessageBox(NULL, 
"Steup() - failed."0, MB_OK);
        
return 0;
    }

    enter_msg_loop(display);

    cleanup();
    g_device
->Release();

    
return 0;
}


程序截圖:

 

下載源程序


posted on 2008-04-13 13:30 lovedday 閱讀(853) 評論(0)  編輯 收藏 引用


只有注冊用戶登錄后才能發表評論。
網站導航: 博客園   IT新聞   BlogJava   博問   Chat2DB   管理


公告

導航

統計

常用鏈接

隨筆分類(178)

3D游戲編程相關鏈接

搜索

最新評論

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            亚洲一区二区三区久久| 国产日韩精品电影| 日韩视频一区二区| 欧美日韩在线三区| 久久精品亚洲一区二区三区浴池 | 香蕉久久一区二区不卡无毒影院| 亚洲激情欧美激情| 亚洲激情偷拍| 最近中文字幕日韩精品| 亚洲日本aⅴ片在线观看香蕉| 欧美夫妇交换俱乐部在线观看| 欧美一级一区| 玖玖视频精品| 亚洲人成亚洲人成在线观看图片 | 原创国产精品91| 亚洲国产一区二区视频| 亚洲一区中文| 免费亚洲电影在线观看| 一区二区欧美国产| 欧美日韩hd| 欧美jizzhd精品欧美喷水| 亚洲激情欧美| 午夜精品久久久久久久99樱桃| 小黄鸭精品aⅴ导航网站入口 | 亚洲第一中文字幕| 91久久中文| 久久精品亚洲乱码伦伦中文 | 亚洲精品国产欧美| 香蕉乱码成人久久天堂爱免费 | 国产精品萝li| 一区二区三区蜜桃网| 久久精品国产第一区二区三区最新章节| 一本色道综合亚洲| 亚洲国产影院| 亚洲第一综合天堂另类专| 久久av在线| 在线天堂一区av电影| 国产精品一区久久久| 欧美久久精品午夜青青大伊人| 亚洲一区在线观看视频| 亚洲激情图片小说视频| 亚洲国产日韩欧美在线99| 亚洲第一黄网| 性娇小13――14欧美| 国产精品视频区| 亚洲女同性videos| 99视频精品全部免费在线| 欧美区一区二| 一本久道久久综合狠狠爱| 亚洲精品国产精品国自产观看浪潮| 久久亚洲精品一区| 激情久久婷婷| 久久精品人人做人人综合| 欧美在线免费视频| 日韩午夜三级在线| 在线视频一区二区| 国产综合久久久久久| 99视频在线观看一区三区| 国产综合色在线| 亚洲精品久久久一区二区三区| 欧美亚洲第一页| 欧美.www| 国产午夜精品在线| 亚洲精品国产精品久久清纯直播| 国产伦一区二区三区色一情| 欧美黄免费看| 激情综合色丁香一区二区| 亚洲免费观看在线观看| 在线观看欧美亚洲| 欧美一区二区三区精品| 亚洲调教视频在线观看| 欧美91福利在线观看| 久久在线免费| 一区二区三区在线视频观看| 亚洲女性裸体视频| 亚洲欧美视频在线观看| 国产精品jizz在线观看美国 | 欧美视频手机在线| 久久夜色撩人精品| 国产美女精品在线| 国产精品中文字幕在线观看| 欧美激情在线播放| 亚洲第一精品夜夜躁人人爽| 久久久久久亚洲精品杨幂换脸| 久久精品一区二区三区四区| 国产精品久久777777毛茸茸| 亚洲视频精品| 先锋影音国产精品| 国产一区二区三区最好精华液| 欧美在线播放| 亚洲国产日韩欧美| 欧美一区二区精品| 欧美在线观看一区二区| 欧美日韩国内自拍| 亚洲图片你懂的| 亚洲一区成人| 国外视频精品毛片| 欧美电影在线观看| 国产精品福利在线观看| 亚洲国产欧美日韩另类综合| 亚洲国产精品123| 激情欧美一区二区| 欧美va天堂| 国外成人性视频| 久久久免费精品视频| 国产欧美午夜| 一本色道88久久加勒比精品| 亚洲一级黄色| 亚洲精品久久在线| 国产一区二区三区四区| 欧美国产日韩一区二区| 久久久免费精品| 一区二区三区不卡视频在线观看 | 欧美在线影院在线视频| 日韩视频中文字幕| 亚洲国产一区二区三区高清| 欧美在线观看日本一区| 亚洲自啪免费| 亚洲在线一区| 欧美亚洲一区在线| 欧美一区二粉嫩精品国产一线天| 亚洲图片在线| 亚洲综合精品四区| 性色一区二区| 久久综合成人精品亚洲另类欧美| 欧美专区日韩视频| 久久综合狠狠综合久久综青草| 久久xxxx精品视频| 亚洲第一精品福利| 日韩视频免费在线| 午夜视频在线观看一区| 欧美在线free| 久久免费黄色| 亚洲第一久久影院| 最新69国产成人精品视频免费| 亚洲精品免费电影| 香蕉久久夜色精品国产使用方法 | 美女脱光内衣内裤视频久久网站| 久久久噜噜噜久久人人看| 欧美日韩精品一区二区天天拍小说| 国产精品色网| 亚洲深夜福利网站| 亚洲激情偷拍| 久久夜色精品国产亚洲aⅴ | 亚洲综合精品自拍| 香蕉成人伊视频在线观看| 99国内精品| 欧美吻胸吃奶大尺度电影| 亚洲欧美日本日韩| 暖暖成人免费视频| 正在播放亚洲| 亚洲精品国产欧美| 9久re热视频在线精品| 亚洲第一区中文99精品| 亚洲精选国产| 在线精品亚洲| 亚洲精品免费在线观看| 亚洲欧美国产77777| 欧美激情国产日韩精品一区18| 亚洲一区二区三区视频| 欧美成年人网| 国产乱码精品1区2区3区| 午夜在线不卡| 欧美中文在线观看| 欧美色图一区二区三区| 亚洲国产精品久久91精品| 久久久久久久999精品视频| 欧美一区二区三区日韩视频| 亚洲乱码久久| 亚洲人成网在线播放| 欧美激情视频一区二区三区免费| 日韩午夜激情电影| 欧美亚洲三区| 亚洲电影免费在线| 亚洲一二三区精品| 在线播放豆国产99亚洲| 欧美国产免费| 欧美久久电影| 久久国产日韩| 欧美日韩精品一本二本三本| 亚洲最新中文字幕| 亚洲一级高清| 亚洲影院在线观看| 亚洲一区二区三区涩| 欧美三级午夜理伦三级中文幕 | 欧美v国产在线一区二区三区| 欧美区在线播放| 亚洲乱码日产精品bd| 国产欧美日韩不卡| 一区二区欧美精品| 国语精品中文字幕| 久久永久免费| 国产精品h在线观看| 国产嫩草一区二区三区在线观看 | 久久久久高清| 亚洲午夜激情| 国产精品久久国产精品99gif | 99re8这里有精品热视频免费| 久久精品亚洲热| 亚洲靠逼com|