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

天行健 君子當自強而不息

效果框架(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>
            模特精品在线| 亚洲在线免费| 亚洲欧美激情视频在线观看一区二区三区 | 中文在线资源观看视频网站免费不卡| 亚洲第一精品影视| 亚洲丶国产丶欧美一区二区三区| 在线国产精品播放| 亚洲精品国产无天堂网2021| 亚洲人成网站777色婷婷| 日韩亚洲欧美中文三级| 亚洲性视频网站| 香蕉免费一区二区三区在线观看| 欧美一区网站| 欧美激情偷拍| 中文日韩在线| 久久久之久亚州精品露出| 狂野欧美一区| 欧美日韩国产区一| 国产精品欧美久久久久无广告| 国产日本欧美视频| 亚洲国产精品电影| 亚洲特色特黄| 欧美aa在线视频| 亚洲天堂视频在线观看| 久久香蕉精品| 国产精品手机在线| 亚洲片国产一区一级在线观看| 亚洲无毛电影| 亚洲国产99| 艳女tv在线观看国产一区| 欧美专区在线| 欧美系列一区| 91久久精品网| 久久精品成人| 中国av一区| 欧美剧在线观看| 亚洲高清不卡av| 久久久久久国产精品mv| 亚洲精品美女在线| 久久久国际精品| 国产精品五月天| 一区二区三区成人精品| 欧美第一黄网免费网站| 亚洲免费视频在线观看| 欧美精品激情blacked18| 国内精品99| 亚洲专区欧美专区| 亚洲欧洲一区二区三区| 久久久久久久久久看片| 欧美午夜剧场| 在线亚洲免费| 日韩午夜三级在线| 欧美 日韩 国产精品免费观看| 亚洲人成在线影院| 精品二区视频| 久久成人精品无人区| 亚洲黄页视频免费观看| 老司机免费视频一区二区三区 | 亚洲免费一区二区| 欧美视频一区二区三区| 一区二区欧美在线| 亚洲乱码国产乱码精品精可以看| 欧美高清视频一区二区| 亚洲国产视频直播| 欧美成人自拍视频| 欧美mv日韩mv国产网站| 在线观看日韩av先锋影音电影院| 久久久久九九视频| 久久精品国产综合精品| 一区二区三区在线免费观看| 麻豆精品网站| 欧美成人在线网站| 亚洲手机视频| 香蕉久久国产| 尤物精品在线| 亚洲欧洲精品一区二区三区不卡 | 欧美亚洲免费电影| 一区二区三区自拍| 亚洲第一精品夜夜躁人人爽| 欧美精品久久久久久久久久| 一区二区福利| 亚洲在线免费观看| 精品51国产黑色丝袜高跟鞋| 欧美激情成人在线视频| 欧美三级午夜理伦三级中视频| 亚洲永久精品国产| 久久av最新网址| 日韩视频免费大全中文字幕| 亚洲图片欧美一区| 在线观看av不卡| 日韩亚洲欧美在线观看| 国产亚洲欧美一区二区三区| 亚洲第一福利视频| 国产精品一区二区三区成人| 久热re这里精品视频在线6| 欧美xxx成人| 久久av一区二区三区亚洲| 免费看精品久久片| 先锋影音久久久| 免费欧美在线| 欧美在线地址| 欧美日本韩国在线| 久久精品午夜| 欧美日韩三级在线| 欧美aⅴ99久久黑人专区| 国产精品扒开腿做爽爽爽视频 | 国产精品久久久久久一区二区三区 | 国产午夜精品久久| 亚洲精品一区二区三区四区高清| 亚洲欧美一区二区三区极速播放| 午夜性色一区二区三区免费视频| 亚洲精品乱码| 久久成人在线| 亚洲一级免费视频| 久久久水蜜桃| 欧美一区观看| 国产精品国产自产拍高清av王其| 麻豆精品网站| 国产综合视频| 香蕉av福利精品导航| 亚洲先锋成人| 欧美精品 日韩| 亚洲高清毛片| 国内精品免费午夜毛片| 亚洲一区尤物| 亚洲免费在线看| 欧美色精品天天在线观看视频 | 亚洲一区3d动漫同人无遮挡| 亚洲美女在线视频| 美女性感视频久久久| 老**午夜毛片一区二区三区| 国产日韩精品一区| 午夜日韩在线| 久久精品亚洲热| 国产美女精品| 亚洲欧美影院| 久久久久国产一区二区三区四区| 国产精品私人影院| 亚洲一区中文字幕在线观看| 亚洲永久免费精品| 国产乱码精品一区二区三区不卡 | 欧美日韩dvd在线观看| 欧美顶级少妇做爰| 亚洲欧洲精品一区| 欧美激情一区二区三区全黄 | 久久久91精品| 母乳一区在线观看| 亚洲欧洲一区| 欧美片第1页综合| 一区二区三区欧美| 欧美一区二区观看视频| 国产欧美精品一区二区三区介绍| 亚洲综合视频网| 免费欧美电影| 一本综合精品| 国产精自产拍久久久久久| 欧美一区久久| 亚洲福利视频专区| 亚洲一级特黄| 狠狠v欧美v日韩v亚洲ⅴ| 美女精品自拍一二三四| 亚洲开发第一视频在线播放| 午夜精品福利一区二区三区av| 国产视频精品va久久久久久| 久久精品国产96久久久香蕉| 亚洲第一网站| 欧美一区二区免费观在线| 在线观看视频一区二区欧美日韩| 蜜桃av一区二区三区| 日韩午夜在线视频| 久久精品视频亚洲| 亚洲免费观看高清在线观看| 国产精品一区免费观看| 欧美日韩成人综合天天影院| 亚洲一二三区在线观看| 久久久久久久久久看片| 亚洲国产精品免费| 欧美系列精品| 另类亚洲自拍| 亚洲女人天堂成人av在线| 美女精品视频一区| 亚洲欧美经典视频| 精品成人在线观看| 国产精品毛片va一区二区三区 | 亚洲免费视频中文字幕| 久久精品青青大伊人av| 亚洲第一黄色网| 欧美日韩亚洲一区在线观看| 久久精品五月| 亚洲一区三区电影在线观看| 嫩草伊人久久精品少妇av杨幂| 亚洲一区二区在线视频| 91久久精品国产91久久性色tv| 国产精品视频| 欧美日韩精品国产| 欧美精品一区二区三区在线播放| 久久国产婷婷国产香蕉| 亚洲欧美电影院| 一区二区三区视频观看| 亚洲精品一二三|