Nanashi-softプログラマ専用DirectX11開発


◇DirectX11プログラミング -テクスチャーを貼ってみる-

色を付ける時に,
>この三角は何色と指定するのではなく,この頂点は何色と指定するのです
と書きました

テクスチャーも同じ考え方でやるのですよ
この三角はこの画像と指定するのではなく,この頂点で囲まれた部分はこの画像と指定する

まずは,シェーダーにテクスチャーの通り道(?)を作ります
・頂点シェーダー(HLSL)
//入力用
struct vertexIn
{
float4 pos : POSITION0;
float4 col : COLOR0;
float2 tex : TEXCOORD0;
};

//出力用
struct vertexOut
{
float4 pos : SV_POSITION;
float4 col : COLOR;
float2 tex : TEXCOORD0;
};

vertexOut vs_main(vertexIn IN)
{
vertexOut OUT;

OUT.pos = IN.pos;
OUT.col = IN.col;
OUT.tex = IN.tex;

return OUT;
}
ただ,通しているだけです
ココでの texは,テクスチャーの座標です
・ピクセルシェーダー(HLSL)
struct pixcelIn
{
float4 pos : SV_POSITION;
float4 col : COLOR;
float2 tex : TEXCOORD0;
};

Texture2D txDiffuse : register( t0 );
SamplerState samLinear : register( s0 );

float4 ps_main(pixcelIn IN) : SV_Target
{
pixcelIn OUT;

//テクスチャーを貼る
OUT.col = txDiffuse.Sample(samLinear, IN.tex);

return OUT.col;
}
ピクセルシェーダーでテクスチャーを貼るわけですが,MSDNのマニュアルに↑こう書くように決まっている感じで書かれていました
実際,意味もわからず書いているこのシェーダーできちんと機能しています
恐らくココでレジスタ t0,s0を使う事が内部ルールで決まっているのではないかと思います(適当)

インクルードとライブラリを追加します
#include <windows.h>
#include <tchar.h>
#include <d3d11.h>
#include <d3dx11.h> //追加

#pragma once
#pragma comment(lib, "d3d11.lib")
#pragma comment(lib, "d3dx11.lib") //追加
頂点シェーダーにポリゴンの構造体を合わせます
	//ポリゴン頂点構造体
struct Vertex3D {
float pos[3]; //x-y-z
float col[4]; //r-g-b-a
float tex[2]; //x-y
};
変形していると貼りづらい(と思う)ので,四角形に戻します
	const int TYOUTEN = 4;	//ポリゴンの頂点数

//頂点データ(四角ポリゴン1枚)
Vertex3D hVectorData[TYOUTEN] = {
//500x811
{ { -0.27f, +0.75f, +0.5f }, { 1.0f, 1.0f, 1.0f, 1.0f }, {0.0f, 0.0f} },
{ { +0.27f, +0.75f, +0.5f }, { 1.0f, 1.0f, 1.0f, 1.0f }, {1.0f, 0.0f} },
{ { -0.27f, -0.75f, +0.5f }, { 1.0f, 1.0f, 1.0f, 1.0f }, {0.0f, 1.0f} },
{ { +0.27f, -0.75f, +0.5f }, { 1.0f, 1.0f, 1.0f, 1.0f }, {1.0f, 1.0f} }
};
頂点シェーダーに頂点レイアウトを合わせます
	//頂点レイアウト
//5番目のパラメータは先頭からのバイト数なので,COLORにはPOSITIONのfloat型4バイト×3を記述
D3D11_INPUT_ELEMENT_DESC hInElementDesc[] = {
{ "POSITION", 0, DXGI_FORMAT_R32G32B32_FLOAT, 0, 0, D3D11_INPUT_PER_VERTEX_DATA, 0 },
{ "COLOR", 0, DXGI_FORMAT_R32G32B32A32_FLOAT, 0, 4*3, D3D11_INPUT_PER_VERTEX_DATA, 0 },
{ "TEXCOORD", 0, DXGI_FORMAT_R32G32_FLOAT, 0, 4*3 + 4*4, D3D11_INPUT_PER_VERTEX_DATA, 0 }
};
メインループの直前に,テクスチャーファイル読み込みを追加します
	//テクスチャー読み込み
ID3D11ShaderResourceView* hpShaderResourceView = NULL;
if(FAILED(D3DX11CreateShaderResourceViewFromFile(hpDevice, _T("ira.siyoko.png"), NULL, NULL, &hpShaderResourceView, NULL))){
MessageBox(hWnd, _T("D3DX11CreateShaderResourceViewFromFile"), _T("Err"), MB_ICONSTOP);
goto End;
}

//そのテクスチャーをコンテキストに設定
ID3D11ShaderResourceView* hpShaderResourceViews[] = { hpShaderResourceView };
hpDeviceContext->PSSetShaderResources(0, 1, hpShaderResourceViews);
これを実行すると,指定した画像ファイルが貼られます


れおな屋プロデュース
http://reonaya.web.fc2.com/
トップ絵のしよ子さんをお借りしました


TOPプログラマ専用DirectX11開発