游戏开发论坛

 找回密码
 立即注册
搜索
查看: 5948|回复: 7

CreatePixelShader?rD3DERR_INVALIDCALL,Why

[复制链接]

414

主题

611

帖子

621

积分

高级会员

Rank: 4

积分
621
发表于 2005-12-14 00:27:00 | 显示全部楼层 |阅读模式
CreatePixelShader?rD3DERR_INVALIDCALL,Why?
source Code?碓?
3D??虺淌皆O?入? 使用DirectX9.0??作
Chapter 18\PS MultiTexture?例

#include "d3dUtility.h"
#include "dxerr9.h"

//
// Globals
//

IDirect3DDevice9* Device = 0;

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

IDirect3DPixelShader9* MultiTexPS = 0;
ID3DXConstantTable* MultiTexCT = 0;

IDirect3DVertexBuffer9* QuadVB = 0;

IDirect3DTexture9* BaseTex = 0;
IDirect3DTexture9* SpotLightTex = 0;
IDirect3DTexture9* StringTex = 0;

D3DXHANDLE BaseTexHandle = 0;
D3DXHANDLE SpotLightTexHandle = 0;
D3DXHANDLE StringTexHandle = 0;

D3DXCONSTANT_DESC BaseTexDesc;
D3DXCONSTANT_DESC SpotLightTexDesc;
D3DXCONSTANT_DESC StringTexDesc;

//
// Structs
//

struct MultiTexVertex
{
MultiTexVertex(float x, float y, float z,
float u0, float v0,
float u1, float v1,
float u2, float v2)
{
_x = x; _y = y; _z = z;
_u0 = u0; _v0 = v0;
_u1 = u1; _v1 = v1;
_u2 = u2, _v2 = v2;
}

float _x, _y, _z;
float _u0, _v0;
float _u1, _v1;
float _u2, _v2;

static const DWORD FVF;
};
const DWORD MultiTexVertex::FVF = D3DFVF_XYZ | D3DFVF_TEX3;

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

//
// Create geometry.
//

Device->CreateVertexBuffer(
6 * sizeof(MultiTexVertex),
D3DUSAGE_WRITEONLY,
MultiTexVertex::FVF,
D3DPOOL_MANAGED,
&QuadVB,
0);

MultiTexVertex* v = 0;
QuadVB->Lock(0, 0, (void**)&v, 0);

v[0] = MultiTexVertex(-10.0f, -10.0f, 5.0f, 0.0f, 1.0f, 0.0f, 1.0f, 0.0f, 1.0f);
v[1] = MultiTexVertex(-10.0f, 10.0f, 5.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f);
v[2] = MultiTexVertex( 10.0f, 10.0f, 5.0f, 1.0f, 0.0f, 1.0f, 0.0f, 1.0f, 0.0f);

v[3] = MultiTexVertex(-10.0f, -10.0f, 5.0f, 0.0f, 1.0f, 0.0f, 1.0f, 0.0f, 1.0f);
v[4] = MultiTexVertex( 10.0f, 10.0f, 5.0f, 1.0f, 0.0f, 1.0f, 0.0f, 1.0f, 0.0f);
v[5] = MultiTexVertex( 10.0f, -10.0f, 5.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f);

QuadVB->Unlock();

//
// Compile shader
//

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

hr = D3DXCompileShaderFromFile(
"ps_multitex.txt",
0,
0,
"Main", // entry point function name
"ps_1_1",
D3DXSHADER_DEBUG,
&shader,
&errorBuffer,
&MultiTexCT);

// 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;
}

//
// Create Pixel Shader
//
hr = Device->CreatePixelShader(
(DWORD*)shader->GetBufferPointer(),
&MultiTexPS);

if(FAILED(hr))
{
const TCHAR *str=DXGetErrorString9(hr);//D3DERR_INVALIDCALL
::MessageBox(0, "CreateVertexShader - FAILED", 0, 0);
return false;
}

sf_2005121402721.zip

277.97 KB, 下载次数:

64

主题

855

帖子

856

积分

高级会员

Rank: 4

积分
856
QQ
发表于 2005-12-14 09:39:00 | 显示全部楼层

Re:CreatePixelShader?rD3DERR_INVALIDCALL,Why

先查查你的显卡是否支持Pixel Shader

414

主题

611

帖子

621

积分

高级会员

Rank: 4

积分
621
 楼主| 发表于 2005-12-24 00:34:00 | 显示全部楼层

Re:CreatePixelShader?rD3DERR_INVALIDCALL,Why

如何?z查?示卡是否支援Pixel shader?
可以?供一下source code??

414

主题

611

帖子

621

积分

高级会员

Rank: 4

积分
621
 楼主| 发表于 2005-12-24 22:18:00 | 显示全部楼层

Re:CreatePixelShader?rD3DERR_INVALIDCALL,Why

Chapter 18\PS MultiTexture?例
我?上它的shader,?大家看ㄧ下是否是shader File的?法有???

//
// Globals
//

sampler BaseTex;
sampler SpotLightTex;
sampler StringTex;

//
// Structures
//


struct PS_INPUT
{
    float2 base : TEXCOORD0;
    float2 spotlight : TEXCOORD1;
    float2 text : TEXCOORD2;
};

struct PS_OUTPUT
{
    vector diffuse : COLOR0;
};


//
// Main
//

PS_OUTPUT Main(PS_INPUT input)
{
    // zero out members of output
    PS_OUTPUT output = (PS_OUTPUT)0;

    // sample appropriate textures
    vector b = tex2D(BaseTex, input.base);
    vector s = tex2D(SpotLightTex, input.spotlight);
    vector t = tex2D(StringTex, input.text);

    // combine texel colors
    vector c = b * s + t;

    // increase the intensity of the pixel slightly
    c += 0.1f;

    // save the resulting pixel color
    output.diffuse = c;

    return output;
}

414

主题

611

帖子

621

积分

高级会员

Rank: 4

积分
621
 楼主| 发表于 2005-12-24 22:21:00 | 显示全部楼层

Re:CreatePixelShader?rD3DERR_INVALIDCALL,Why

我在?上有???的????例的程式?,???就出?在CreatePixelShader失???eturn D3DERR_INVALIDCALL

IDirect3DDevice9* Device = 0;

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

IDirect3DPixelShader9* MultiTexPS = 0;
ID3DXConstantTable* MultiTexCT = 0;

IDirect3DVertexBuffer9* QuadVB = 0;

IDirect3DTexture9* BaseTex = 0;
IDirect3DTexture9* SpotLightTex = 0;
IDirect3DTexture9* StringTex = 0;

D3DXHANDLE BaseTexHandle = 0;
D3DXHANDLE SpotLightTexHandle = 0;
D3DXHANDLE StringTexHandle = 0;

D3DXCONSTANT_DESC BaseTexDesc;
D3DXCONSTANT_DESC SpotLightTexDesc;
D3DXCONSTANT_DESC StringTexDesc;

//
// Structs
//

struct MultiTexVertex
{
MultiTexVertex(float x, float y, float z,
float u0, float v0,
float u1, float v1,
float u2, float v2)
{
_x = x; _y = y; _z = z;
_u0 = u0; _v0 = v0;
_u1 = u1; _v1 = v1;
_u2 = u2, _v2 = v2;
}

float _x, _y, _z;
float _u0, _v0;
float _u1, _v1;
float _u2, _v2;

static const DWORD FVF;
};
const DWORD MultiTexVertex::FVF = D3DFVF_XYZ | D3DFVF_TEX3;

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

//
// Create geometry.
//

Device->CreateVertexBuffer(
6 * sizeof(MultiTexVertex),
D3DUSAGE_WRITEONLY,
MultiTexVertex::FVF,
D3DPOOL_MANAGED,
&QuadVB,
0);

MultiTexVertex* v = 0;
QuadVB->Lock(0, 0, (void**)&v, 0);

v[0] = MultiTexVertex(-10.0f, -10.0f, 5.0f, 0.0f, 1.0f, 0.0f, 1.0f, 0.0f, 1.0f);
v[1] = MultiTexVertex(-10.0f, 10.0f, 5.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f);
v[2] = MultiTexVertex( 10.0f, 10.0f, 5.0f, 1.0f, 0.0f, 1.0f, 0.0f, 1.0f, 0.0f);

v[3] = MultiTexVertex(-10.0f, -10.0f, 5.0f, 0.0f, 1.0f, 0.0f, 1.0f, 0.0f, 1.0f);
v[4] = MultiTexVertex( 10.0f, 10.0f, 5.0f, 1.0f, 0.0f, 1.0f, 0.0f, 1.0f, 0.0f);
v[5] = MultiTexVertex( 10.0f, -10.0f, 5.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f);

QuadVB->Unlock();

//
// Compile shader
//

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

hr = D3DXCompileShaderFromFile(
"ps_multitex.txt",
0,
0,
"Main", // entry point function name
"ps_1_1",
D3DXSHADER_DEBUG,
&shader,
&errorBuffer,
&MultiTexCT);

// 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;
}

//
// Create Pixel Shader
//
hr = Device->CreatePixelShader(
(DWORD*)shader->GetBufferPointer(),
&MultiTexPS);

if(FAILED(hr))
{
const TCHAR *str=DXGetErrorString9(hr);//D3DERR_INVALIDCALL
::MessageBox(0, "CreatePixelShader - FAILED", 0, 0);
return false;
}

?大家?臀铱川缦率枪?例的程式有????是?例的Shader File有???.

5

主题

72

帖子

74

积分

注册会员

Rank: 2

积分
74
发表于 2008-6-20 08:26:00 | 显示全部楼层

Re: CreatePixelShader?rD3DERR_INVALIDCALL,Why

我也遇到同样问题!

5

主题

755

帖子

757

积分

高级会员

Rank: 4

积分
757
发表于 2008-6-20 11:00:00 | 显示全部楼层

Re:CreatePixelShader?rD3DERR_INVALIDCALL,Why

D3DXCompileShaderFromFile 这个不是返回给你错误信息吗看里面是什么不就知道了

2

主题

19

帖子

19

积分

新手上路

Rank: 1

积分
19
QQ
发表于 2008-6-21 20:08:00 | 显示全部楼层

Re:CreatePixelShader?rD3DERR_INVALIDCALL,Why

        D3DCAPS9 caps;
        if ( FAILED( hr = m_pD3D->GetDeviceCaps(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, &caps) ) )
                return hr;

        //检查设备是否支持vertexshader2.0
        if( caps.VertexShaderVersion < D3DVS_VERSION(2, 0) )
        {
                g_pLog->AddLog( LT_ERROR, "检测到设备不支持vertexshader2.0" );
                return E_FAIL;
        }

        //检查设备是否支持pixelshader2.0
        if( caps.PixelShaderVersion < D3DPS_VERSION(2, 0) )
        {
                g_pLog->AddLog( LT_ERROR, "检测到设备不支持pixelshader2.0" );
                return E_FAIL;
        }
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2026-1-22 05:22

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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