テクスチャが表示されません

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
fxy

テクスチャが表示されません

#1

投稿記事 by fxy » 12年前

DirectX9で3Dゲーム開発をしようと思っています。
HLSLを使おうとしたのですがテクスチャが表示されなくて困っています。
テクスチャなしの時はちゃんと表示されます。

hlsl.fx

コード:

float4x4 mWVP; // ローカル→射影空間 変換行列
texture Tex;

sampler Samp = sampler_state	// サンプラステート
{
	Texture = <Tex>;
	MinFilter = LINEAR;
	MagFilter = LINEAR;
	MipFilter = NONE;
	AddressU  = Clamp;
	AddressV  = Clamp;
};

struct VS_INPUT
{
	float4 Pos	: POSITION;		
	float4 Nor	: NORMAL0;
	float2 Tex	: TEXCOORD0;	
};

struct VS_OUTPUT
{
	float4 Pos	: POSITION;	
	float4 Col	: COLOR0;
	float2 Tex	: TEXCOORD0;	
};

struct PS_INPUT
{
	float4 Col	: COLOR0;
	float2 Tex	: TEXCOORD0;	
};

struct PS_OUTPUT
{
	float4 Col	: COLOR0;
};


//-----------------------
// 頂点シェーダ
//------------------------------------------------------
VS_OUTPUT VS( VS_INPUT In )
{
	VS_OUTPUT Out = (VS_OUTPUT)0;
	Out.Pos = mul( In.Pos, mWVP );
	Out.Col = In.Col;
	Out.Tex = In.Tex;
	return Out;
}

//-----------------------
// ピクセルシェーダ
//------------------------------------------------------
PS_OUTPUT PS ( PS_INPUT In ) : COLOR0
{
	PS_OUTPUT Out = (PS_OUTPUT)0;
	//Out.Col = In.Col;
	Out.Col = tex2D( Samp, In.Tex );
	return Out;
}

//-----------------------
// テクニック
//------------------------------------------------------
technique TShader
{
	pass P0
	{
		VertexShader	= compile vs_2_0 VS();
		PixelShader	= compile ps_2_0 PS();
	}
}

どこをどう直せばいいのか全くわかりません。
助けてください。

アバター
うしお
記事: 56
登録日時: 13年前

Re: テクスチャが表示されません

#2

投稿記事 by うしお » 12年前

かなりエスパーな回答で申し訳ないのですが、
ID3DXEffectを使っているかと思いますが、
ID3DXEffect::SetTextureにてテクスチャを設定していますか?

fxy

Re: テクスチャが表示されません

#3

投稿記事 by fxy » 12年前

返信ありがとうございます

>ID3DXEffect::SetTextureにてテクスチャを設定していますか?
設定してます

ライトは使ってないんですが、使わないとダメでしょうか?

アバター
うしお
記事: 56
登録日時: 13年前

Re: テクスチャが表示されません

#4

投稿記事 by うしお » 12年前

ちょっと長いですが、ためしに書いてみました。一部fx修正後、正常に描画できました。
fxは47行目の
Out.Col = In.Col;
をコメントアウトしました。
fxの問題はそれだけで、あとはメインソースのほうの問題ではないでしょうか?
またライトはなくてもテクスチャは張れます。

コード:

#pragma comment(lib,"d3d9.lib")
#pragma comment(lib,"d3dx9.lib")
#include <Windows.h>
#include <d3d9.h>
#include <d3dx9.h>
#include <cassert>
#include <iostream>

#include <crtdbg.h>

//global
//win
HWND g_windowHandle = 0;

//dx
IDirect3D9* g_pD3D = 0;
IDirect3DDevice9* g_pD3DDevice = 0;
ID3DXEffect* g_pEffect = 0;
IDirect3DTexture9* g_pTexture = 0; 

LRESULT CALLBACK WindowProcedure(HWND hWnd,UINT iMsg,WPARAM wParam,LPARAM lParam);
bool MessagePump();

int main(int argc,char* argv[])
{
	_CrtSetDbgFlag(_CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF);

	const int WINDOW_WIDTH = 640;
	const int WINDOW_HEIGHT = 480;
	const int WINDOW_STYLE = WS_CAPTION|WS_SYSMENU|WS_MINIMIZEBOX;

	//win
	const wchar_t* CLASS_NAME = L"CLASS1";
	WNDCLASSW wndClass = {CS_HREDRAW|CS_VREDRAW,WindowProcedure,0,0,GetModuleHandleW(0),0,
		(HCURSOR)LoadImageW(0,MAKEINTRESOURCEW(IDC_ARROW),IMAGE_CURSOR,0,0,LR_DEFAULTSIZE | LR_SHARED),0,0,CLASS_NAME};
	RegisterClassW(&wndClass);
	RECT rc = {0,0,WINDOW_WIDTH,WINDOW_HEIGHT};
	AdjustWindowRect(&rc,WINDOW_STYLE,false);
	g_windowHandle = CreateWindowW(CLASS_NAME,L"Form1",WINDOW_STYLE,0,0,rc.right-rc.left,rc.bottom-rc.top,0,0,GetModuleHandleW(0),0);
	ShowWindow(g_windowHandle,SW_SHOW);
	UpdateWindow(g_windowHandle);

	//dx
	g_pD3D = Direct3DCreate9(D3D_SDK_VERSION);
	D3DPRESENT_PARAMETERS d3dpp = {WINDOW_WIDTH,WINDOW_HEIGHT,D3DFMT_UNKNOWN,1,D3DMULTISAMPLE_NONE,0,D3DSWAPEFFECT_DISCARD,
		g_windowHandle,TRUE,TRUE,D3DFMT_D24X8,0,D3DPRESENT_RATE_DEFAULT,D3DPRESENT_RATE_DEFAULT};

	{
		HRESULT hr = 0;
		if(FAILED( hr =g_pD3D->CreateDevice(D3DADAPTER_DEFAULT,D3DDEVTYPE_HAL,g_windowHandle,D3DCREATE_HARDWARE_VERTEXPROCESSING,&d3dpp,&g_pD3DDevice) ))
		{
			if(FAILED( g_pD3D->CreateDevice(D3DADAPTER_DEFAULT,D3DDEVTYPE_HAL,g_windowHandle,D3DCREATE_SOFTWARE_VERTEXPROCESSING,&d3dpp,&g_pD3DDevice) ))
			{
				return EXIT_FAILURE;
			}
		}
	}

	//Init
	unsigned CREATE_EFFECT_FLAGS = 0;
#ifndef NDEBUG
	CREATE_EFFECT_FLAGS |= D3DXSHADER_DEBUG;
#endif

	ID3DXBuffer* error = 0;
	if(FAILED( D3DXCreateEffectFromFileA(
		g_pD3DDevice,
		"effect.fx",
		NULL,
		NULL,
		CREATE_EFFECT_FLAGS,
		NULL,
		&g_pEffect,
		&error) ))
	{
		if(error)
		{
			std::cout << reinterpret_cast<char*>( error->GetBufferPointer() ) << std::endl;
			error->Release();
			error = 0;
		}
		assert(0);
	}

	if(FAILED( D3DXCreateTextureFromFileA(g_pD3DDevice,"texture.png",&g_pTexture) ))
	{
		assert(0);
	}

	while(MessagePump())
	{
		g_pD3DDevice->Clear(0,NULL,D3DCLEAR_TARGET | D3DCLEAR_ZBUFFER,0x0,1.0f,0);
		g_pD3DDevice->BeginScene();

		struct Vertex{
			float x,y,z;
			float u,v;
		};
		Vertex vertices[4] = {
			{-0.9f, 0.9f,0, 0,0},
			{ 0.9f, 0.9f,0, 1.f,0},
			{-0.9f,-0.9f,0, 0,1.f},
			{ 0.9f,-0.9f,0, 1.f,1.f},
		};

		g_pD3DDevice->SetFVF(D3DFVF_XYZ | D3DFVF_TEX1);

		D3DXMATRIX wvp;
		D3DXMatrixIdentity(&wvp);
		g_pEffect->SetMatrix("mWVP",&wvp);
		g_pEffect->SetTexture("Tex",g_pTexture);

		g_pEffect->SetTechnique("TShader");
		unsigned numPass = 0;
		g_pEffect->Begin(&numPass,0);
		g_pEffect->BeginPass(0);

		g_pD3DDevice->DrawPrimitiveUP(D3DPT_TRIANGLESTRIP,2,vertices,sizeof(Vertex));

		g_pEffect->EndPass();
		g_pEffect->End();

		g_pD3DDevice->EndScene();
		g_pD3DDevice->Present(0,0,0,0);
	}


	if(g_pTexture)
	{
		g_pTexture->Release();
		g_pTexture = 0;
	}
	if(g_pEffect)
	{
		g_pEffect->Release();
		g_pEffect = 0;
	}
	if(g_pD3DDevice)
	{
		g_pD3DDevice->Release();
		g_pD3DDevice = 0;
	}
	if(g_pD3D)
	{
		g_pD3D->Release();
		g_pD3D = 0;
	}
	DestroyWindow(g_windowHandle);
	g_windowHandle = 0;
	UnregisterClassW(CLASS_NAME,GetModuleHandleW(0));

	return EXIT_SUCCESS;
}
bool MessagePump()
{
	MSG msg = {0};
	if(PeekMessageW(&msg,NULL,0U,0U,PM_REMOVE))
	{
		TranslateMessage(&msg);
		DispatchMessageW(&msg);
	}
	return msg.message != WM_QUIT;
}
LRESULT CALLBACK WindowProcedure(HWND hWnd,UINT iMsg,WPARAM wParam,LPARAM lParam)
{
	if(iMsg == WM_DESTROY){PostQuitMessage(0);}
	return DefWindowProc(hWnd,iMsg,wParam,lParam);
}
SDKバージョン等書き忘れました。
Microsoft DirectX SDK (June 2010)
VS2010 Express

fxy

Re: テクスチャが表示されません

#5

投稿記事 by fxy » 12年前

ソースコードまで書いてくださってありがとうございます

実はすごく単純なミスでHLSLとは全く関係ありませんでした
テクスチャUVがなぜか0.1fになっていたので1.0fにしたところ表示できました

こんなつまらないミスですみません
今度からはもっとよく注意します

閉鎖

“C言語何でも質問掲示板” へ戻る