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

天行健 君子當自強而不息

效果框架(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>
            亚洲人精品午夜| 欧美www视频| 另类专区欧美制服同性| 久久国产精品99国产精| 欧美一级专区| 久久免费99精品久久久久久| 欧美亚洲综合网| 久久久视频精品| 欧美**人妖| 91久久在线观看| 亚洲精品欧洲| 亚洲资源av| 玖玖玖国产精品| 欧美日韩一区二区三区在线观看免| 欧美日韩天堂| 国产日本欧美一区二区三区| 樱桃国产成人精品视频| 99国产精品久久久久老师| 午夜精品久久久久久久99樱桃| 欧美诱惑福利视频| 欧美黄色影院| 亚洲免费人成在线视频观看| 久久亚洲私人国产精品va| 欧美日韩在线精品| 国产综合欧美| 99国产精品一区| 久久av二区| 亚洲毛片av| 久久综合久久美利坚合众国| 欧美色图首页| 亚洲国产一区二区三区a毛片| 亚洲综合二区| 久久影院午夜论| 午夜久久99| 亚洲国产精品va在线看黑人动漫 | 乱人伦精品视频在线观看| 欧美美女日韩| 在线播放豆国产99亚洲| 午夜精品福利视频| 亚洲国产精品专区久久 | 欧美 日韩 国产精品免费观看| 国产精品99一区| 亚洲精品综合久久中文字幕| 久久久精品国产99久久精品芒果| 日韩天堂在线观看| 免费在线播放第一区高清av| 国产一区视频网站| 午夜精品婷婷| 99精品久久久| 欧美日韩精品免费在线观看视频| 在线观看亚洲专区| 久久精品国产一区二区三区免费看| 亚洲精品免费在线播放| 久久久久久噜噜噜久久久精品| 国产精品欧美在线| 亚洲免费视频成人| 99在线精品观看| 欧美日韩免费观看一区三区| 亚洲乱码国产乱码精品精98午夜| 欧美国产日韩在线观看| 美女黄毛**国产精品啪啪| 狠狠色香婷婷久久亚洲精品| 久久精品综合| 久久久xxx| 亚洲国产小视频在线观看| 欧美成人国产va精品日本一级| 久久久xxx| 亚洲激情成人网| 亚洲黄页一区| 欧美日韩在线另类| 欧美一级理论性理论a| 亚洲永久在线| 亚洲区欧美区| 欧美成人午夜视频| 欧美国产第二页| 中文精品一区二区三区| 一本大道久久a久久综合婷婷| 欧美日韩国产综合久久| 亚洲一区二区三| 亚洲午夜影视影院在线观看| 国产噜噜噜噜噜久久久久久久久| 久久成人一区| 美女被久久久| 亚洲综合精品一区二区| 午夜精品美女久久久久av福利| 国产欧美在线观看| 欧美xxx成人| 欧美日韩另类视频| 欧美影院在线播放| 亚洲与欧洲av电影| 欧美激情综合色| 欧美日韩国产999| 欧美一区二区三区四区夜夜大片| 午夜精品久久久久久| 亚洲高清网站| 亚洲一区二区三区高清| 亚洲成人资源| 亚洲一区二区精品在线观看| 在线欧美不卡| 亚洲午夜在线视频| 亚洲激情视频| 性18欧美另类| 在线亚洲欧美专区二区| 欧美一区2区视频在线观看 | 欧美一区二区网站| 99re热这里只有精品视频| 午夜在线一区二区| 日韩视频在线免费| 久久精品国产v日韩v亚洲| 一区二区三区欧美| 噜噜爱69成人精品| 久久精品国产免费看久久精品| 欧美极品aⅴ影院| 久久久久久一区二区三区| 欧美三级小说| 亚洲欧洲在线视频| 亚洲国产高清一区二区三区| 亚洲欧美日韩在线一区| av不卡在线看| 免费在线成人| 欧美国产亚洲视频| 一区二区三区在线看| 亚洲欧美高清| 亚洲资源av| 欧美亚一区二区| 亚洲精品影院在线观看| 亚洲精品在线看| 欧美xxx在线观看| 久久亚洲综合| 韩国自拍一区| 久久精品91久久香蕉加勒比| 亚久久调教视频| 国产精品乱子久久久久| 一本色道久久综合亚洲精品小说 | 亚洲精品影视| 欧美va亚洲va日韩∨a综合色| 另类av导航| 亚洲高清不卡在线| 另类图片综合电影| 亚洲第一区中文99精品| 亚洲国产高清视频| 欧美劲爆第一页| 亚洲免费av电影| 亚洲一区视频在线| 国产乱码精品一区二区三区五月婷| 亚洲一区二区久久| 久久精品国产91精品亚洲| 国产婷婷97碰碰久久人人蜜臀| 午夜激情亚洲| 免费在线观看成人av| 亚洲人体影院| 国产精品h在线观看| 亚洲一区二区在线播放| 亚洲在线视频观看| 久久高清免费观看| 黑人极品videos精品欧美裸| 久久久一区二区三区| 免费在线成人av| 亚洲精品一区在线观看| 欧美色区777第一页| 午夜精品视频在线| 欧美ab在线视频| 亚洲视频二区| 国产综合久久久久久鬼色| 免费不卡视频| 亚洲先锋成人| 欧美成人午夜77777| 一区二区毛片| 韩国av一区二区三区在线观看| 欧美成人精品一区二区三区| 亚洲午夜久久久久久久久电影网| 久久噜噜亚洲综合| 99精品视频免费观看| 国产日韩一区二区三区在线播放| 久久夜色精品国产噜噜av| 一区二区高清视频| 欧美成人精品高清在线播放| 亚洲午夜一级| 一区二区在线不卡| 国产精品久久久久aaaa九色| 久久午夜精品一区二区| 中日韩午夜理伦电影免费| 久久久97精品| 亚洲网站在线播放| 亚洲国产欧美日韩精品| 国产精品亚洲人在线观看| 麻豆国产精品va在线观看不卡| 在线亚洲一区观看| 欧美激情中文字幕一区二区| 欧美一区二区三区在| 亚洲美女黄色| 在线观看国产精品网站| 国产精品亚洲欧美| 欧美日韩午夜| 欧美肥婆在线| 乱码第一页成人| 久久女同互慰一区二区三区| 亚洲一区三区电影在线观看| 亚洲乱码一区二区| 亚洲经典一区|