폴더내에 텍스쳐파일을 넣어주어야 실행시 에러가 발생하지 않습니다.
#include <Windows.h>
using namespace System;
using namespace System::Windows::Forms;
using namespace System::Drawing;
using namespace SlimDX;
using namespace SlimDX::Direct3D9;
struct TextureVertex
{
Vector3 positon;
int color;
float tu, tv;
};
public ref class WndForm : public Form
{
Direct3D^ direct3D;
PresentParameters^ presentParams;
Device^ device;
VertexBuffer^ vertexBuffer;
Texture^ texture;
public:
String^ lastError;
WndForm(void)
{
this->ClientSize = System::Drawing::Size(400, 300);
this->StartPosition = FormStartPosition::CenterScreen;
this->Text = "D3D Tutorial 6";
}
~WndForm()
{
this->!WndForm();
}
!WndForm()
{
Release();
}
void Release()
{
if (vertexBuffer)
delete vertexBuffer;
if (texture)
delete texture;
if (direct3D)
delete direct3D;
if (device)
delete device;
}
bool InitD3D()
{
try {
// 환경변수 세팅
direct3D = gcnew Direct3D();
presentParams = gcnew PresentParameters();
presentParams->Windowed = true;
presentParams->SwapEffect = SwapEffect::Discard;
presentParams->BackBufferFormat = Format::Unknown;
presentParams->EnableAutoDepthStencil = true;
presentParams->AutoDepthStencilFormat = Format::D16;
// 디바이스 생성
device = gcnew Device(direct3D, 0, DeviceType::Hardware, this->Handle, CreateFlags::SoftwareVertexProcessing, presentParams);
// 디바이스 세팅
device->SetRenderState(RenderState::CullMode, Cull::None);
device->SetRenderState(RenderState::ZEnable, true);
device->SetRenderState(RenderState::Lighting, false);
// 텍스쳐 생성
texture = Texture::FromFile(device, "tiger.bmp");
if (!texture) {
lastError = "texture not found";
return false;
}
device->SetTexture(0, texture);
device->SetTextureStageState(0, TextureStage::ColorOperation, TextureOperation::Modulate);
device->SetTextureStageState(0, TextureStage::ColorArg1, TextureArgument::Texture);
device->SetTextureStageState(0, TextureStage::ColorArg2, TextureArgument::Diffuse);
device->SetTextureStageState(0, TextureStage::AlphaOperation, TextureOperation::Disable);
// 버퍼 생성
vertexBuffer = gcnew VertexBuffer(device, 100 * sizeof(TextureVertex), Usage::WriteOnly, VertexFormat::Position | VertexFormat::Diffuse | VertexFormat::Texture1, Pool::Default);
DataStream^ stream = vertexBuffer->Lock(0, 0, LockFlags::None);
IntPtr vptr = stream->DataPointer;
TextureVertex *vert = (TextureVertex *)vptr.ToPointer();
for (int i = 0; i < 50; i++) {
float theta = (float)(2 * Math::PI * i) / (50 - 1);
vert[2 * i].positon = Vector3((float)Math::Sin(theta), -1.0f, (float)Math::Cos(theta));
vert[2 * i].color = 0xffffffff;
vert[2 * i].tu = ((float)i) / (50 - 1);
vert[2 * i].tv = 1.0f;
vert[2 * i + 1].positon = Vector3((float)Math::Sin(theta), 1.0f, (float)Math::Cos(theta));
vert[2 * i + 1].color = 0xff808080;
vert[2 * i + 1].tu = ((float)i) / (50 - 1);
vert[2 * i + 1].tv = 0.0f;
}
vertexBuffer->Unlock();
return true;
}
catch (Direct3D9Exception^ ex) {
lastError = ex->ToString();
return false;
}
}
void SetupMatrix()
{
device->SetTransform(TransformState::World, Matrix::RotationAxis(Vector3((float)Math::Cos(Environment::TickCount / 250.0f), 1, (float)Math::Sin(Environment::TickCount / 250.0f)), Environment::TickCount / 1000.0f));
device->SetTransform(TransformState::View, Matrix::LookAtLH(Vector3(0.0f, 3.0f, -5.0f), Vector3(0.0f, 0.0f, 0.0f), Vector3(0.0f, 1.0f, 0.0f)));
device->SetTransform(TransformState::Projection, Matrix::PerspectiveFovLH((float)Math::PI / 4, 1.0f, 1.0f, 100.0f));
}
void Render()
{
if (!device)
return;
// 렌더링 시작
device->Clear(ClearFlags::Target | ClearFlags::ZBuffer, System::Drawing::Color::Black, 1.0f, 0);
device->BeginScene();
SetupMatrix();
// 렌더링
device->SetStreamSource(0, vertexBuffer, 0, sizeof(TextureVertex));
device->VertexFormat = VertexFormat::Position | VertexFormat::Diffuse | VertexFormat::Texture1;
device->DrawPrimitives(PrimitiveType::TriangleStrip, 0, (4*25)-2);
// 렌더링 끝
device->EndScene();
device->Present();
}
};
INT WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, INT)
{
WndForm^ frm = gcnew WndForm();
if (!frm->InitD3D()) {
MessageBox::Show(frm->lastError);
delete frm;
return 0;
}
frm->Show();
while (frm->Created) {
frm->Render();
Application::DoEvents();
}
if (frm)
delete frm;
return 0;
}


0 개의 댓글:
댓글 쓰기