エフェクトファイルでコンパイル時にエラー

アバター
てんむすキツネ
記事: 88
登録日時: 14年前
住所: 岡山

エフェクトファイルでコンパイル時にエラー

投稿記事 by てんむすキツネ » 13年前

c++ではないので
こちらの日記の方で質問させてもらいました。

HLSLとDxLibをつかってゲームを作り始めたのですが
(HLSLはほぼ理解していません)

HLSL(エフェクトファイル)でヘッダファイルをincludeしようとすると
コンパイル時にエラーがでます。

そのincludeしたいファイル(d3dx9.h)自体はincludeできるのですが
そのd3dx9.hの中でincludeされているファイルがincludeされなくて
エラーが発生します。(オープン・ソース・ファイルに失敗しました。)

別のヘッダファイルでd3dx9.hをincludeしてVCでコンパイルすればエラーはでません。

つまりエフェクトファイルでないファイルで呼び出した時はうまくいくんです。

一応コードを(エフェクトファイル)

CODE:

#include "Include/d3dx9.h"

float4 temp;

struct PS_INPUT{
	float4 Diffuse:COLOR0;
	float4 Specular:COLOR1;
	float2 TexCoords0:TEXCOORD0;
};

struct PS_OUTPUT{
	float4 Output:COLOR0;
};

sampler sampler0:register(s0);

PS_OUTPUT main(PS_INPUT psin){
		
	PS_OUTPUT psout;
	float2 tempcoord;
	float4 texc;

	float dx=psin.TexCoords0.x-0.5;
	float dy=psin.TexCoords0.y-0.5;
	float dist=dx*dx+dy*dy;

	if(dist

#define D3DX_DEFAULT            ((UINT) -1)
#define D3DX_DEFAULT_NONPOW2    ((UINT) -2)
#define D3DX_DEFAULT_FLOAT      FLT_MAX
#define D3DX_FROM_FILE          ((UINT) -3)
#define D3DFMT_FROM_FILE        ((D3DFORMAT) -3)

#ifndef D3DXINLINE
#ifdef _MSC_VER
  #if (_MSC_VER >= 1200)
  #define D3DXINLINE __forceinline
  #else
  #define D3DXINLINE __inline
  #endif
#else
  #ifdef __cplusplus
  #define D3DXINLINE inline
  #else
  #define D3DXINLINE
  #endif
#endif
#endif



// Includes
#include "d3d9.h"
#include "d3dx9math.h"
#include "d3dx9core.h"
#include "d3dx9xof.h"
#include "d3dx9mesh.h"
#include "d3dx9shader.h"
#include "d3dx9effect.h"

#include "d3dx9tex.h"
#include "d3dx9shape.h"
#include "d3dx9anim.h"



// Errors
#define _FACDD  0x876
#define MAKE_DDHRESULT( code )  MAKE_HRESULT( 1, _FACDD, code )

enum _D3DXERR {
    D3DXERR_CANNOTMODIFYINDEXBUFFER     = MAKE_DDHRESULT(2900),
    D3DXERR_INVALIDMESH                 = MAKE_DDHRESULT(2901),
    D3DXERR_CANNOTATTRSORT              = MAKE_DDHRESULT(2902),
    D3DXERR_SKINNINGNOTSUPPORTED        = MAKE_DDHRESULT(2903),
    D3DXERR_TOOMANYINFLUENCES           = MAKE_DDHRESULT(2904),
    D3DXERR_INVALIDDATA                 = MAKE_DDHRESULT(2905),
    D3DXERR_LOADEDMESHASNODATA          = MAKE_DDHRESULT(2906),
    D3DXERR_DUPLICATENAMEDFRAGMENT      = MAKE_DDHRESULT(2907),
	D3DXERR_CANNOTREMOVELASTITEM		= MAKE_DDHRESULT(2908),
};


#endif //__D3DX9_H__

どうすればエフェクトファイルでincludeされるようになるでしょうか。
最後に編集したユーザー てんむすキツネ on 2012年5月26日(土) 16:41 [ 編集 2 回目 ]

naohiro19
記事: 256
登録日時: 14年前

Re: エフェクトファイルでコンパイル時にエラー

投稿記事 by naohiro19 » 13年前

Codeタグで囲んでください。

アバター
てんむすキツネ
記事: 88
登録日時: 14年前
住所: 岡山

Re: エフェクトファイルでコンパイル時にエラー

投稿記事 by てんむすキツネ » 13年前

どうもすみませんです。
わすれていました。

ISLe
記事: 2650
登録日時: 14年前

Re: エフェクトファイルでコンパイル時にエラー

投稿記事 by ISLe » 13年前

そもそも何故d3dx9.hをインクルードしたいんですか?
HLSLはHLSLという言語であってC++言語ではないのですが。

HLSLをコンパイルするにはDirectX SDKに付いているシェーダコンパイラ(fxc)を使います。
あるいは実行時にDirectXのAPIを使ってコンパイルします。
DXライブラリはコンパイル済みのものしか読み込めないのですかね?

アバター
てんむすキツネ
記事: 88
登録日時: 14年前
住所: 岡山

Re: エフェクトファイルでコンパイル時にエラー

投稿記事 by てんむすキツネ » 13年前

自分が大きなかんちがいをしていました。

d3dx9.hはc++の方でincludeして
テクスチャを新たにつくって(加工して)
それを描画したりするようです。


今c++の方でD3DXCreateTextureFromFileEx
http://msdn.microsoft.com/ja-jp/library/cc372753
をつかった処理をかいていますが
これの第二引数(pSrcFile)はGetDrawScreenGraphなどで作成した画像
のグラフィックハンドルではだめなのでしょうか?

それと、最後の引数(ppTexture)に使う引数の定義の仕方がよくわかりません。
LPDIRECT3DCUBETEXTURE9 IMAGE;
と定義して&IMAGEを引数にしてみましたが
エラー 3 error C4430: 型指定子がありません - int と仮定しました。メモ: C++ は int を既定値としてサポートしていません
とでてコンパイルが通りません。

ISLe
記事: 2650
登録日時: 14年前

Re: エフェクトファイルでコンパイル時にエラー

投稿記事 by ISLe » 13年前

天紆 狐 さんが書きました:今c++の方でD3DXCreateTextureFromFileEx
http://msdn.microsoft.com/ja-jp/library/cc372753.aspx
をつかった処理をかいていますが
これの第二引数(pSrcFile)はGetDrawScreenGraphなどで作成した画像
のグラフィックハンドルではだめなのでしょうか?
DXライブラリのグラフィックハンドルはDXライブラリでのみ通用するものなので使えません。
GetDrawScreenGraphはグラフィックハンドルを作成する関数ではないですし何をしたいのでしょう。
天紆 狐 さんが書きました:それと、最後の引数(ppTexture)に使う引数の定義の仕方がよくわかりません。
LPDIRECT3DCUBETEXTURE9 IMAGE;
と定義して&IMAGEを引数にしてみましたが
エラー 3 error C4430: 型指定子がありません - int と仮定しました。メモ: C++ は int を既定値としてサポートしていません
とでてコンパイルが通りません。
なぜC4430なのかは分かりませんがD3DXCreateTextureFromFileExの宣言では引数の型はLPDIRECT3DTEXTURE9 *となっているので
LPDIRECT3DTEXTURE9 IMAGE; // 何で大文字?
と宣言してください。
戻り値のところにキューブテクスチャと書いてあるのは翻訳ミスですね。
日本語訳を信用してはいけませんよ。

HLSLとDxLibで作っているんですよね?
掲示板で質問したほうが良いと思いますよ。

アバター
てんむすキツネ
記事: 88
登録日時: 14年前
住所: 岡山

RE: エフェクトファイルでコンパイル時にエラー

投稿記事 by てんむすキツネ » 13年前

こんどからは掲示板の方で質問は行いますね

すみません。
どうやら、引数の型をみるところを間違えていたようです。
そのエラーは消えたのですが、

こんどは外部参照が未解決と出てしまいます。
どこかでスペルミスしているかと思います。

CODE:

D3DXCreateTextureFromFileEx(
		RippleVertex.Device,
		RippleVertex.file_pus,
		0,
		0,
		0,
		0,
		D3DFMT_UNKNOWN,
		D3DPOOL_MANAGED,
		D3DX_FILTER_NONE,
		D3DX_FILTER_NONE,
		D3DCOLOR_ARGB(0, 0, 0, 0),
		NULL,
		NULL,
		&RippleVertex.IMAGE
		);
定義されているヘッダ

CODE:

// FromFileEx

HRESULT WINAPI
    D3DXCreateTextureFromFileExA(
        LPDIRECT3DDEVICE9         pDevice,
        LPCSTR                    pSrcFile,
        UINT                      Width,
        UINT                      Height,
        UINT                      MipLevels,
        DWORD                     Usage,
        D3DFORMAT                 Format,
        D3DPOOL                   Pool,
        DWORD                     Filter,
        DWORD                     MipFilter,
        D3DCOLOR                  ColorKey,
        D3DXIMAGE_INFO*           pSrcInfo,
        PALETTEENTRY*             pPalette,
        LPDIRECT3DTEXTURE9*       ppTexture);

HRESULT WINAPI
    D3DXCreateTextureFromFileExW(
        LPDIRECT3DDEVICE9         pDevice,
        LPCWSTR                   pSrcFile,
        UINT                      Width,
        UINT                      Height,
        UINT                      MipLevels,
        DWORD                     Usage,
        D3DFORMAT                 Format,
        D3DPOOL                   Pool,
        DWORD                     Filter,
        DWORD                     MipFilter,
        D3DCOLOR                  ColorKey,
        D3DXIMAGE_INFO*           pSrcInfo,
        PALETTEENTRY*             pPalette,
        LPDIRECT3DTEXTURE9*       ppTexture);

#ifdef UNICODE
#define D3DXCreateTextureFromFileEx D3DXCreateTextureFromFileExW
#else
#define D3DXCreateTextureFromFileEx D3DXCreateTextureFromFileExA
#endif


あと、GetDrawScreenGraphですが、どんなモノを作ろうとしているか説明文がまったくありませんでした。すみません

自分は今、画像をぐにゃぐにゃさせるエフェクトを作りたいとおもっています。
そこで背景を描画したあと、ぐにゃぐにゃさせたい範囲の画像をとってきて
それを、エフェクトファイルに送る(?)ということを行いたいのです。

CODE:

void rippleeffect(){

	int X1,Y1;
	int ghsize=256;
	int grhandle,grhandle2,grhandle3;
	//画像切り抜き用
	int ghsize_x=ghsize,ghsize_y=ghsize;
	int X2,Y2;
	int flag=0;
	int grhandle4;

	X1=FX+ch.x-ghsize/2;Y1=FY+ch.y-ghsize/2;
	X2=X1;Y2=Y1;

	if(X1480){
		ghsize_y-=(Y1+ghsize)-480;
		flag=4;
	}
	if(Y1+ghsize>480 && X1640){
		ghsize_x-=(X1+ghsize)-640;
		flag=4;
	}

	grhandle2=MakeGraph(ghsize_x,ghsize_y);
	grhandle=MakeGraph(ghsize,ghsize);

	grhandle4=MakeGraph(FMX,FMY);
	GetDrawScreenGraph(FX,FY,FX+FMX,FY+FMY,grhandle4);	


	switch(flag){
		case 0:
			GetDrawScreenGraph(X1,Y1,X1+ghsize,Y1+ghsize,grhandle);	
			break;
		case 1:

			GetDrawScreenGraph(X2,Y2,X2+ghsize_x,Y2+ghsize_y,grhandle2);

			DrawGraph(0-X1,0,grhandle2,FALSE);
			GetDrawScreenGraph(0,0,ghsize,ghsize,grhandle);

			break;
		case 2:

			GetDrawScreenGraph(X2,Y2,X2+ghsize_x,Y2+ghsize_y,grhandle2);

			DrawGraph(0,0-Y1,grhandle2,FALSE);
			GetDrawScreenGraph(0,0,ghsize,ghsize,grhandle);

			break;
		case 3:
			GetDrawScreenGraph(X2,Y2,X2+ghsize_x,Y2+ghsize_y,grhandle2);

			DrawGraph(0-X1,0-Y1,grhandle2,FALSE);
			GetDrawScreenGraph(0,0,ghsize,ghsize,grhandle);

			break;
		case 4:
			grhandle=MakeGraph(ghsize_x,ghsize_y);
			GetDrawScreenGraph(X1,Y1,X1+ghsize_x,Y1+ghsize_y,grhandle);
			break;
		case 5:

			GetDrawScreenGraph(X2,Y1,X2+ghsize_x,Y1+ghsize_y,grhandle2);

			DrawGraph(0-X1,0,grhandle2,FALSE);
			GetDrawScreenGraph(0,0,ghsize,ghsize,grhandle);

			break;
		case 6:
			grhandle=MakeGraph(ghsize_x,ghsize_y);
			GetDrawScreenGraph(X1,Y1,X1+ghsize_x,Y1+ghsize_y,grhandle);
			break;

	}
	RippleVertex.Vert[0].pos=VGet(float(X1),float(Y1),0.0f);
	RippleVertex.Vert[1].pos=VGet(float(X1+ghsize),float(Y1),0.0f);
	RippleVertex.Vert[2].pos=VGet(float(X1),float(Y1+ghsize),0.0f);
	RippleVertex.Vert[3].pos=VGet(float(X1+ghsize),float(Y1+ghsize),0.0f);
	RippleVertex.Vert[4]=RippleVertex.Vert[2];
	RippleVertex.Vert[5]=RippleVertex.Vert[1];

	FLOAT4 vec;
	vec.x=0.05f+0.01f*sin(count%150*PI/75);
	SetPSConstF(0,vec);
	vec.y=float((20+10*sin(count%360*PI/360))*PI);
	SetPSConstF(0,vec);


	DrawGraph(FX,FY,grhandle4,FALSE);

	D3DXCreateTextureFromFileEx(
		RippleVertex.Device,
		RippleVertex.file_pus,
		0,
		0,
		0,
		0,
		D3DFMT_UNKNOWN,
		D3DPOOL_MANAGED,
		D3DX_FILTER_NONE,
		D3DX_FILTER_NONE,
		D3DCOLOR_ARGB(0, 0, 0, 0),
		NULL,
		NULL,
		&RippleVertex.IMAGE
		);

	SetUseTextureToShader(0,(int)RippleVertex.IMAGE);//ここは今てきとうにいれてるだけ。あとできちんとしたグラフィックハンドルをつくる
	SetUsePixelShader(RipplePShandle);

	DrawPrimitive2DToShader(RippleVertex.Vert,6,DX_PRIMTYPE_TRIANGLELIST);

	DeleteGraph(grhandle);
	DeleteGraph(grhandle2);
	DeleteGraph(grhandle4);
}
テクスチャサイズが2のn乗以外扱えない時ではうまくいっていました。
ようは、サイズが2のn乗以外でも描画できるようにしたいんです。
http://cdn-ak.f.st-hatena.com/images/fo ... 193316.jpg
最後に編集したユーザー てんむすキツネ on 2012年5月27日(日) 08:33 [ 編集 3 回目 ]

アバター
てんむすキツネ
記事: 88
登録日時: 14年前
住所: 岡山

RE: エフェクトファイルでコンパイル時にエラー

投稿記事 by てんむすキツネ » 13年前

解決できました。
ライブラリをよみこんでいなかったようです

ISLe
記事: 2650
登録日時: 14年前

Re: エフェクトファイルでコンパイル時にエラー

投稿記事 by ISLe » 13年前

掲示板でしばしば言われることですが…。
エラーが出ているときはエラーメッセージを一切削らずに貼り付けてください。
(個人情報に繋がる部分があれば*等に置き換えてください。)
上手くいかないときはどう上手くいかないのか具体的に書いてください。

D3DXCreateTextureFromFileExで読み込んだテクスチャのハンドルをDXライブラリで使うことはできません。
なのでいま出ているエラーを解決しても意味がないと思います。

"DrawPrimitive2DToShader"でググったら↓のページがヒットしました。役に立つのでは?
http://hpcgi2.nifty.com/natupaji/bbs/pa ... ew&no=2594

(追記)
解決したというのは期待どおりに動作したという意味でしょうか?
最後に編集したユーザー ISLe on 2012年5月27日(日) 17:08 [ 編集 2 回目 ]

アバター
てんむすキツネ
記事: 88
登録日時: 14年前
住所: 岡山

RE: エフェクトファイルでコンパイル時にエラー

投稿記事 by てんむすキツネ » 13年前

掲示板でしばしば言われることですが…。
エラーが出ているときはエラーメッセージを一切削らずに貼り付けてください。
申し訳ございませんでした。今度からは的確に必要な情報をあげていきたいと思っています。
解決したというのは期待どおりに動作したという意味でしょうか?
D3DXCreateTextureFromFileExで読み込んだテクスチャのハンドルをDXライブラリで使うことはできません。
なのでいま出ているエラーを解決しても意味がないと思います。
関数を呼び出してもエラーが表示されなくなった、というだけです。
ですので、貴方様が言われるとおり、意味がないことに気が付きました。
"DrawPrimitive2DToShader"でググったら↓のページがヒットしました。役に立つのでは?
本当にありがとうございます!
最後に編集したユーザー てんむすキツネ on 2012年5月27日(日) 19:16 [ 編集 1 回目 ]