ポリゴン魂 このページをアンテナに追加 RSSフィード

2004 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2005 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2006 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2007 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2008 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2009 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2010 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2011 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2012 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2013 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2014 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2015 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2016 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2017 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
profile「sanoh」
 | 

2009-03-04 HLSL インチキ環境マッピング

[]HLSL インチキ環境マッピング

VertexShader インチキ環境マッピング+いろいろ」をHLSLで表現してみると

G9lib.h

#pragma once

#pragma once
#include	"windows.h"
#include	<d3d9.h>
#include	<d3dx9.h>

class G9lib
{
public:
	G9lib(void);
public:
	~G9lib(void);
private:
	LPDIRECT3D9 pD3D;
	LPDIRECT3DDEVICE9 pD3DDevice;
	D3DPRESENT_PARAMETERS d3dppApp;
	LPDIRECT3DVERTEXBUFFER9 gVBuffer;
	LPDIRECT3DTEXTURE9	image01;
	LPD3DXEFFECT     pEffect;      // シェーダが書かれたエフェクト
public:
	bool	Init( HWND hwnd );
	void	Exit( void );
	void	TestDraw();
};

//頂点フォーマット
struct D3DVERNORMAL {
	float	x,y,z;		//	座標
	float	nx,ny,nz;		//	法線

	enum { FVF = D3DFVF_XYZ | D3DFVF_NORMAL } ;
};

G9lib.cpp

#include	"G9lib.h"
#include	"../VertexShader/Model.h"

//ライブラリ登録
#pragma comment(lib, "dxguid.lib")
#pragma comment(lib, "d3d9.lib")
#pragma comment(lib, "d3dx9.lib")

G9lib::G9lib(void)
{
	pD3D		= NULL;
	pD3DDevice	= NULL;
	gVBuffer	= NULL;
	image01		= NULL;
	pEffect  = NULL;
}

G9lib::~G9lib(void)
{
	if (pD3D) {
		pD3D->Release();
		pD3D = NULL;
	}
	if (pD3DDevice) {
		pD3DDevice->Release();
		pD3DDevice = NULL;
	}
	if( gVBuffer ){
		gVBuffer->Release();
		gVBuffer	= NULL;
	}
	if( image01 ){
		image01->Release();
		image01	= NULL;
	}
	if( pEffect ){
		pEffect->Release();
		pEffect	= NULL;
	}
}

//------------------------------------------------------------------------------
//■ライブラリ初期化
//------------------------------------------------------------------------------
bool	G9lib::Init( HWND hwnd )
{
	// Direct3Dオブジェクトの取得
	pD3D = Direct3DCreate9(D3D_SDK_VERSION);
	if (pD3D == NULL) {
		MessageBox( hwnd, L"Direct3Dの初期化に失敗しました、DirectX 9.0がインストールされているか確認してください。",L"Base",MB_OK | MB_ICONSTOP);
		return FALSE;
	}

	// 現在のディスプレイモードを得る
	D3DDISPLAYMODE dmode;
	if (FAILED(pD3D->GetAdapterDisplayMode(D3DADAPTER_DEFAULT, &dmode))) {
		MessageBox( hwnd, L"ディスプレイモードの取得に失敗しました。",L"Base",MB_OK | MB_ICONSTOP);
		return FALSE;
	}
	// バックサーフェースのフォーマットをコピーして使用する
	ZeroMemory(&d3dppApp, sizeof(d3dppApp));
	d3dppApp.Windowed	= TRUE;							// ウィンドウモード
	d3dppApp.SwapEffect = D3DSWAPEFFECT_DISCARD;		// 垂直同期でフリップ
	d3dppApp.BackBufferCount = 1;
	d3dppApp.BackBufferFormat = dmode.Format;
	d3dppApp.EnableAutoDepthStencil = TRUE;
	d3dppApp.AutoDepthStencilFormat= D3DFMT_D16;

	// デバイスの作成
	if (FAILED(pD3D->CreateDevice(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, hwnd, D3DCREATE_HARDWARE_VERTEXPROCESSING, &d3dppApp, &pD3DDevice))) {
		if (FAILED(pD3D->CreateDevice(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, hwnd, D3DCREATE_SOFTWARE_VERTEXPROCESSING, &d3dppApp, &pD3DDevice))) {
			MessageBox( hwnd, L"デバイスの作成に失敗しました、画面モードが16ビットあるいは32ビットになっていることを確認してください。",L"Base",MB_OK | MB_ICONSTOP);
			return FALSE;
		}
	}
	{
		D3DXMATRIX      matView;
		D3DXMATRIX      matProj;
		D3DXMATRIX      matWorld;

		//Zバッファを有効にする
		pD3DDevice->SetRenderState( D3DRS_ZENABLE, TRUE );
		D3DXMatrixRotationY( &matWorld,timeGetTime()/5000.0f );
		D3DXMatrixLookAtLH(&matView,&D3DXVECTOR3(0.0f, -5.0f, 30.0f),	//	カメラの位置を表す3次元ベクトル
		                            &D3DXVECTOR3(0.0f, 0.0f, 0.0f),		//	カメラの注視点を表す3次元ベクトル
		                            &D3DXVECTOR3(0.0f, 1.0f, 0.0f));	//	上方向を表す3次元ベクトル
		D3DXMatrixPerspectiveFovLH( &matProj, D3DX_PI/4, 1.0f, 10.0f, 2000.0f );

		pD3DDevice->SetTransform( D3DTS_WORLD, &matWorld );
		pD3DDevice->SetTransform( D3DTS_VIEW, &matView );
		pD3DDevice->SetTransform( D3DTS_PROJECTION,&matProj );
	}
	//-------------------------------------------------------------------
	//	シェーダー登録
	if( FAILED( D3DXCreateEffectFromFile( pD3DDevice, L"vsample01.fx", NULL, NULL, 0, NULL, &pEffect, NULL ) ) )
		return FALSE;

	//-----------------------------------------
	//	モデル登録
	void       *lpVertices;
	HRESULT    hr;

	hr	= pD3DDevice->CreateVertexBuffer(sizeof(modelData), 0, D3DVERNORMAL::FVF, D3DPOOL_DEFAULT, &gVBuffer, NULL );
	if (FAILED(hr))
		return  FALSE;
	// 頂点バッファをコピー
	hr	= gVBuffer->Lock(0, sizeof(modelData), (LPVOID*)&lpVertices, 0);
	if (FAILED(hr))
		return FALSE;
	memcpy(lpVertices, modelData, sizeof(modelData));
	gVBuffer->Unlock();
	//-----------------------------------------
	//テクスチャ読み込み
	if( D3DXCreateTextureFromFile(pD3DDevice, L"image01.bmp", &image01 ) != D3D_OK )
		image01	= NULL;
	return TRUE;
}

//------------------------------------------------------------------------------
//■ライブラリ開放
//------------------------------------------------------------------------------
void	G9lib::Exit( void )
{
}

//------------------------------------------------------------------------------
//■テスト描画
//------------------------------------------------------------------------------
void	G9lib::TestDraw()
{
	D3DXMATRIX      matView;
	D3DXMATRIX      matProj;
	D3DXMATRIX      matWorld;

	pD3DDevice->Clear(0, NULL, D3DCLEAR_TARGET | D3DCLEAR_ZBUFFER, D3DCOLOR_XRGB(0,0,0), 1.0, 0);
	pD3DDevice->SetRenderState( D3DRS_SPECULARENABLE, TRUE );

	pD3DDevice->SetRenderState( D3DRS_CULLMODE, D3DCULL_CCW );	//	片面
	pD3DDevice->SetRenderState( D3DRS_LIGHTING,FALSE);		//	光源無効

	pD3DDevice->BeginScene();
	//-----------------------------------------
	D3DXMatrixRotationY( &matWorld,timeGetTime()/5000.0f );
	D3DXMatrixLookAtLH(&matView,&D3DXVECTOR3(0.0f, -5.0f, 30.0f),	//	カメラの位置を表す3次元ベクトル
                                &D3DXVECTOR3(0.0f, 0.0f, 0.0f),		//	カメラの注視点を表す3次元ベクトル
                                &D3DXVECTOR3(0.0f, 1.0f, 0.0f));	//	上方向を表す3次元ベクトル
	D3DXMatrixPerspectiveFovLH( &matProj, D3DX_PI/4, 1.0f, 10.0f, 2000.0f );

	//-----------------------------------------
	pEffect->SetMatrix( "mWVP", &(matWorld * matView * matProj) );
	//-----------------------------------------
	//	モデル登録
	UINT nPasses;
	D3DXHANDLE hTechnique = pEffect->GetTechniqueByName( "TShader" );
	pEffect->SetTechnique( hTechnique );
	pEffect->Begin( &nPasses, 0 );
	pEffect->BeginPass(0);
	{
		pD3DDevice->SetTexture( 0, image01 );
		pD3DDevice->SetFVF(D3DVERNORMAL::FVF);
		pD3DDevice->SetStreamSource( 0, gVBuffer, 0, sizeof(D3DVERNORMAL) );
		pD3DDevice->DrawPrimitive( D3DPT_TRIANGLELIST , 0, sizeof(modelData)/sizeof(D3DVERNORMAL)/3 );
		pD3DDevice->SetTexture( 0, NULL );
	}
	pEffect->EndPass();
	pEffect->End();
	//-----------------------------------------
	//	描画
	pD3DDevice->EndScene();
	pD3DDevice->Present(NULL, NULL, NULL, NULL);
}

image01.bmp

f:id:sanoh:20090224010209j:image

vsample01.fx

//---------------------------------------------------------------
float4x4 mWVP;

struct VS_OUTPUT
{
	float4 Pos	: POSITION;
	float2 Tex0	: TEXCOORD0;   //テクスチャUV
};

//---------------------------------------------------------------
VS_OUTPUT VS( float4 Pos : POSITION, float3 Normal : NORMAL )
{
	VS_OUTPUT Out = (VS_OUTPUT)0;

	Out.Pos		= mul(Pos, mWVP);
	Out.Tex0	= normalize( mul(Normal,mWVP))*0.5f+0.5f;
	return Out;
}

//---------------------------------------------------------------
technique TShader
{
	pass P0
	{
		VertexShader= compile vs_1_1 VS();
	}
}

f:id:sanoh:20090224010355j:image

スパム対策のためのダミーです。もし見えても何も入力しないでください
ゲスト


画像認証

 | 
ページビュー
357500
Connection: close