游戏开发论坛

 找回密码
 立即注册
搜索
查看: 3535|回复: 6

SetVertexShader用?不用

[复制链接]

414

主题

611

帖子

621

积分

高级会员

Rank: 4

积分
621
发表于 2006-2-13 22:13:00 | 显示全部楼层 |阅读模式
我有???物件ㄧ??我要用VertexShader,ㄧ??不用VertexShader
Device->SetVertexShader(ToonShader);//要用的
???一下,不用VertexShader的物件要如何告知Device不用VS呢?
Device->SetVertexShader(NULL);//我????,可是物件?s出不?

132

主题

1341

帖子

1341

积分

金牌会员

Rank: 6Rank: 6

积分
1341
发表于 2006-2-13 22:40:00 | 显示全部楼层

Re:SetVertexShader用?不用

Device->SetVertexShader(D3DFVF_XYZ);
其中D3DFVF_XYZ是你的顶点格式

64

主题

855

帖子

856

积分

高级会员

Rank: 4

积分
856
QQ
发表于 2006-2-14 10:54:00 | 显示全部楼层

Re:SetVertexShader用?不用

你是用D3D9还是D3D8?

D3D8用2楼的写法是对的

D3D9应该为Device->SetFVF( D3DFVF_..... ); //D3DFVF_.....是你自己的顶点格式

同时还要注意设置世界矩阵

18

主题

573

帖子

573

积分

高级会员

Rank: 4

积分
573
发表于 2006-2-14 15:02:00 | 显示全部楼层

Re:SetVertexShader用?不用

SetVertexShader函数是设置当前的VS的,你第一个物体用了VS,就写SetVertexShader(ToonShader),第二个不用就写SetVertexShader(NULL)。另外,你的每个物体的FVF如果不同的话,还要对每个物体设置其相应的FVF,用SetFVF()。以上是DX9的。

14

主题

131

帖子

136

积分

注册会员

Rank: 2

积分
136
发表于 2006-2-14 16:24:00 | 显示全部楼层

Re:SetVertexShader用?不用

对于每个顶点流可以使用两种方式来声明顶点流的格式,一个就是FVF,渲染前要用->setfvf(fvf)来定义,一个就是顶点声明D3DVERTEXELEMENT9,渲染前要调用->setvertexshader(...);

414

主题

611

帖子

621

积分

高级会员

Rank: 4

积分
621
 楼主| 发表于 2006-2-14 21:28:00 | 显示全部楼层

Re:SetVertexShader用?不用

附上Source Code
我要?出四??物件,最後一??不要用VertexShader
Device->SetVertexShader(NULL);
我??以NULL取消,可是?果第四??物件?]有?出,其他的三??物件都有?出?


#include "d3dUtility.h"

//
// Globals
//

IDirect3DDevice9* Device = 0;

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

IDirect3DVertexShader9* ToonShader = 0;
ID3DXConstantTable* ToonConstTable = 0;

ID3DXMesh*  Meshes[4] = {0, 0, 0, 0};
D3DXMATRIX  WorldMatrices[4];
D3DXVECTOR4 MeshColors[4];

D3DXMATRIX ProjMatrix;

IDirect3DTexture9* ShadeTex  = 0;

D3DXHANDLE WorldViewHandle     = 0;
D3DXHANDLE WorldViewProjHandle = 0;
D3DXHANDLE ColorHandle         = 0;
D3DXHANDLE LightDirHandle      = 0;

//
// Framework functions
//
bool Setup()
{
        HRESULT hr = 0;

        //
        // Create geometry and compute corresponding world matrix and color
        // for each mesh.
        //

        D3DXCreateTeapot(Device, &Meshes[0], 0);
        D3DXCreateSphere(Device, 1.0f, 20, 20, &Meshes[1], 0);
        D3DXCreateTorus(Device, 0.5f, 1.0f, 20, 20, &Meshes[2], 0);
        D3DXCreateCylinder(Device, 0.5f, 0.5f, 2.0f, 20, 20, &Meshes[3], 0);

        D3DXMatrixTranslation(&WorldMatrices[0],  0.0f,  2.0f, 0.0f);
        D3DXMatrixTranslation(&WorldMatrices[1],  0.0f, -2.0f, 0.0f);
        D3DXMatrixTranslation(&WorldMatrices[2], -3.0f,  0.0f, 0.0f);
        D3DXMatrixTranslation(&WorldMatrices[3],  3.0f,  0.0f, 0.0f);

        MeshColors[0] = D3DXVECTOR4(1.0f, 0.0f, 0.0f, 1.0f);
        MeshColors[1] = D3DXVECTOR4(0.0f, 1.0f, 0.0f, 1.0f);
        MeshColors[2] = D3DXVECTOR4(0.0f, 0.0f, 1.0f, 1.0f);
        MeshColors[3] = D3DXVECTOR4(1.0f, 1.0f, 0.0f, 1.0f);

        //
        // Compile shader
        //

        ID3DXBuffer* shader      = 0;
        ID3DXBuffer* errorBuffer = 0;

        hr = D3DXCompileShaderFromFile(
                "toon.txt",
                0,
                0,
                "Main", // entry point function name
                "vs_1_1",
                D3DXSHADER_DEBUG,
                &shader,
                &errorBuffer,
                &ToonConstTable);

        // output any error messages
        if( errorBuffer )
        {
                ::MessageBox(0, (char*)errorBuffer->GetBufferPointer(), 0, 0);
                d3d::Release<ID3DXBuffer*>(errorBuffer);
        }

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

        hr = Device->CreateVertexShader(
                (DWORD*)shader->GetBufferPointer(),
                &ToonShader);

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

        d3d::Release<ID3DXBuffer*>(shader);

        //
        // Load textures.
        //

        D3DXCreateTextureFromFile(Device, "toonshade.bmp", &ShadeTex);

        Device->SetSamplerState(0, D3DSAMP_MAGFILTER, D3DTEXF_POINT);
        Device->SetSamplerState(0, D3DSAMP_MINFILTER, D3DTEXF_POINT);
        Device->SetSamplerState(0, D3DSAMP_MIPFILTER, D3DTEXF_NONE);

        //
        // Get Handles
        //

        WorldViewHandle     = ToonConstTable->GetConstantByName(0, "WorldViewMatrix");
        WorldViewProjHandle = ToonConstTable->GetConstantByName(0, "WorldViewProjMatrix");
        ColorHandle         = ToonConstTable->GetConstantByName(0, "Color");
        LightDirHandle      = ToonConstTable->GetConstantByName(0, "LightDirection");

        //
        // Set shader constants:
        //

        // Light direction:
        D3DXVECTOR4 directionToLight(-0.57f, 0.57f, -0.57f, 0.0f);

        ToonConstTable->SetVector(
                Device,
                LightDirHandle,
                &directionToLight);

        ToonConstTable->SetDefaults(Device);

        //
        // Compute projection matrix.
        //

        D3DXMatrixPerspectiveFovLH(
                        &amprojMatrix, D3DX_PI * 0.25f,
                        (float)Width / (float)Height, 1.0f, 1000.0f);

        return true;
}

void Cleanup()
{
        for(int i = 0; i < 4; i++)
        {
                d3d::Release<ID3DXMesh*>(Meshes);
        }
        d3d::Release<IDirect3DTexture9*>(ShadeTex);
        d3d::Release<IDirect3DVertexShader9*>(ToonShader);
        d3d::Release<ID3DXConstantTable*>(ToonConstTable);
}

bool Display(float timeDelta)
{
        if( Device )
        {
                //
                // Update the scene: Allow user to rotate around scene.
                //
               
                static float angle  = (3.0f * D3DX_PI) / 2.0f;
                static float height = 5.0f;
       
                if( ::GetAsyncKeyState(VK_LEFT) & 0x8000f )
                        angle -= 0.5f * timeDelta;

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

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

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

                D3DXVECTOR3 position( cosf(angle) * 7.0f, height, sinf(angle) * 7.0f );
                D3DXVECTOR3 target(0.0f, 0.0f, 0.0f);
                D3DXVECTOR3 up(0.0f, 1.0f, 0.0f);
                D3DXMATRIX view;
                D3DXMatrixLookAtLH(&view, &position, &target, &up);

                //
                // Render
                //

                Device->Clear(0, 0, D3DCLEAR_TARGET | D3DCLEAR_ZBUFFER, 0xffffffff, 1.0f, 0);
                Device->BeginScene();

               
                Device->SetTexture(0, ShadeTex);

                D3DXMATRIX WorldView;
                D3DXMATRIX WorldViewProj;
                for(int i = 0; i < 4; i++)
                {
                        WorldView     = WorldMatrices * view;
                        WorldViewProj = WorldMatrices * view * ProjMatrix;

                        ToonConstTable->SetMatrix(
                                Device,
                                WorldViewHandle,
                                &WorldView);

                        ToonConstTable->SetMatrix(
                                Device,
                                WorldViewProjHandle,
                                &WorldViewProj);

                        ToonConstTable->SetVector(
                                Device,
                                ColorHandle,
                                &MeshColors);

                        if (i<=2)
                                Device->SetVertexShader(ToonShader);
                        else
                                Device->SetVertexShader(NULL);
                       
                        Meshes->DrawSubset(0);
                }
               
                Device->EndScene();
                Device->Present(0, 0, 0, 0);
        }
        return true;
}

//
// WndProc
//
LRESULT CALLBACK d3d::WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
        switch( msg )
        {
        case WM_DESTROY:
                :ostQuitMessage(0);
                break;
               
        case WM_KEYDOWN:
                if( wParam == VK_ESCAPE )
                        :estroyWindow(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", 0, 0);
                return 0;
        }
               
        if(!Setup())
        {
                ::MessageBox(0, "Setup() - FAILED", 0, 0);
                return 0;
        }

        d3d::EnterMsgLoop( Display );

        Cleanup();

        Device->Release();

        return 0;
}

414

主题

611

帖子

621

积分

高级会员

Rank: 4

积分
621
 楼主| 发表于 2006-2-15 23:45:00 | 显示全部楼层

Re:SetVertexShader用?不用

我解?Q了,做以下修改即可.??大家的?兔

if (i<=2)
Device->SetVertexShader(ToonShader);
else
{
Device->SetVertexShader(NULL);
Device->SetFVF(D3DFVF_XYZ | D3DFVF_NORMAL);
Device->SetTransform(D3DTS_PROJECTION, &amprojMatrix);
Device->SetTransform(D3DTS_VIEW, &view);
Device->SetTransform(D3DTS_WORLD, &WorldMatrices[3]);
}

可是又有一?????

ID3DXMesh* Meshes[4] = {0, 0, 0, 0};
D3DXCreateTeapot(Device, &Meshes[0], 0);
我如何可以??eshes[0]染成指定的?色(不要以VertexShader做)
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

作品发布|文章投稿|广告合作|关于本站|游戏开发论坛 ( 闽ICP备17032699号-3 )

GMT+8, 2026-1-23 10:40

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表