본문 바로가기

[ C/ C++ 프로그래밍 ]/[ Shader ]

[HLSL] 삼각형에 Texture 입히기

ㅇ hlsl.fx
1 float4x4 matViewProjection;
2
3 texture DiffuseTex;
4
5 sampler2D DiffuseSampler =  sampler_state
6 {
7 texture = (DiffuseTex);
8 minfilter = LINEAR;
9 magfilter = LINEAR;
10 mipfilter = LINEAR;
11 addressu = wrap;
12 };
13
14 struct VS_INPUT
15 {
16 float4 Position : POSITION0; 17 float2 TexCoord : TEXCOORD0;
18
19 };
20
21 struct VS_OUTPUT
22 {
23 float4 Position : POSITION0;
24 float2 TexCoord : TEXCOORD0;
25
26 };
27
28 VS_OUTPUT vs_main( VS_INPUT Input )
29 {
30 VS_OUTPUT Output;
31
32 Output.Position = mul( Input.Position, matViewProjection );
33 Output.TexCoord  = Input.TexCoord;
34
35 return( Output );
36
37 }
38
39
40 struct PS_INPUT
41 {
42 float2 TexCoord : TEXCOORD0;
43 };
44
45
46 float4 ps_main( PS_INPUT Input) : COLOR0
47 {  
48 return( tex2D( DiffuseSampler, Input.TexCoord));
49
50 }
51
52
53
54 technique  TShader
55 {
56     pass P0
57 {
58         VertexShader = compile  vs_2_0  vs_main();
59         PixelShader  = compile  ps_2_0  ps_main();
60 }
61 }

ㅇ D3DX 초기화
1
2 /*  세이더관련함수*/
3
4 /// 셰이더초기화   
5 void  D3DX::ShaderInii()
6 {
7     HRESULT hr;
8    /// 이펙트파일처리
9 LPD3DXBUFFER pErr = NULL;
10
11     /// 이펙트파일읽기
12
13     if( FAILED ( hr = D3DXCreateEffectFromFile( m_pd3dDevice, "hlsl.fx", NULL, NULL, 0, NULL, &m_pEffect, &pErr ) ) )
14     {
15         MessageBox( 0, "File Faild", "Error", 0 );
16         pErr->Release();
17         return ;
18     }
19
20     /// 테크닉선언
21     // TShader은hlsl.fx 파일안에서technique가TShader로되어있어야한다.
22     m_hTechnique = m_pEffect->GetTechniqueByName("TShader");
23
24     if ( pErr )  pErr->Release();
25
26 }
27
28 /// 세이더해체
29 void  D3DX::ShaderDelete()       
30 {
31     //if ( m_hmWVP != NULL)    { m_hmWVP = NULL; }
32     if ( m_hTechnique != NULL) { m_hTechnique = NULL; }
33     if ( m_pEffect != NULL ) { m_pEffect->Release();  m_pEffect = NULL; }
34 }
35
36 /// 세이더상수설정
37 void  D3DX::ShaderUpate()
38 {
39     D3DXMATRIX mat, _matWorld, _matView, _matProj;
40
41     m_pd3dDevice->GetTransform(D3DTS_WORLD,         &_matWorld);
42     m_pd3dDevice->GetTransform(D3DTS_VIEW ,         &_matView);
43     m_pd3dDevice->GetTransform(D3DTS_PROJECTION, &_matProj);
44    
45     mat =  _matWorld * _matView * _matProj;
46
47     m_pEffect->SetMatrix("matViewProjection", &mat);
48
49     m_pEffect->SetTexture("DiffuseTex", m_pTexure);
50 }

ㅇ D3DX 랜더링
 1 void D3DX::Render()
2 {
3     /// 후면버퍼와Z버퍼초기화
4     m_pd3dDevice->Clear( 0, NULL, D3DCLEAR_TARGET | D3DCLEAR_ZBUFFER, D3DCOLOR_XRGB(200,200,200), 1.0f, 0 );
5
6    
7
8     /// 렌더링시작
9     if( SUCCEEDED( m_pd3dDevice->BeginScene() ) )
10     {   
11         Animate();
12
13          /// 세이더설정
14             m_pEffect->SetTechnique( m_hTechnique);
15             m_pEffect->Begin( 0, 0 );
16             m_pEffect->BeginPass(0);
17
18             m_pd3dDevice->SetStreamSource( 0, m_pSphereVB, 0 ,sizeof(ModelVertex));
19             m_pd3dDevice->SetFVF(D3DFVF_CUSTOMVERTEX);
20             m_pd3dDevice->DrawPrimitive(D3DPT_TRIANGLELIST, 0, 3 );
21
22             /*m_pd3dDevice->SetStreamSource( 0, m_pSphereVB, 0, sizeof(FigureObjectODELVERTEX) );*/
23             //m_pd3dDevice->SetIndices(m_pSphereIB);
24             //m_pd3dDevice->DrawIndexedPrimitive( D3DPT_TRIANGLELIST,0,0,m_nVertexCount,  0,m_nIndexCount);
25
26             m_pEffect->EndPass();
27             m_pEffect->End();
28
29         // 렌더링종료
30         QueryPerformanceFPS();
31         DrawFont();
32         m_pd3dDevice->EndScene();
33     }
34
35    
36     /// 후면버퍼를보이는화면으로!
37     m_pd3dDevice->Present( NULL, NULL, NULL, NULL );
38 }


ㅇ 결과

'[ C/ C++ 프로그래밍 ] > [ Shader ]' 카테고리의 다른 글

[HLSL] 램버트 확산 조명  (1) 2010.06.02
렌더몽키 다운로드 사이트  (2) 2010.05.31
[HLSL] 간단한 삼각형 그리기  (0) 2010.05.31
HLSL 설정 - 2  (0) 2010.05.31
HLSL 설정 - 1  (1) 2010.05.31