D3D 练习小框架

自己练习D3D 程序搭的小框架,记录在这里,将来看到好回顾自己独自摸索的苦逼样子。

#pragma once

#pragma comment(lib,"d3d9.lib")
#pragma comment(lib,"d3dx9.lib")

#include<d3d9.h>
#include<d3dx9.h>

struct CUSTOMVERTEX
{
	float x;
	float y;
	float z;
	float rhw;
};

#define D3DFVF_CUSTOMVERTEX D3DFVF_XYZRHW

HRESULT InitD3D(HWND hWnd);
void CleanUp();
void Render();
LRESULT CALLBACK MsgProc(HWND hWnd,UINT msg,WPARAM wParam,LPARAM lParam);
HRESULT InitD3DVertexBuffer();

//TODO: 0 declare d3d variables.
LPDIRECT3D9 g_pd3d=NULL;
LPDIRECT3DDEVICE9 g_pd3dDevice9=NULL;
LPDIRECT3DVERTEXBUFFER9 g_pd3dVB=NULL;

//application entry point.
INT WINAPI wWinMain(
	HINSTANCE,
	HINSTANCE,
	LPWSTR,
	INT)
{
	//initialize wnd class.
	WNDCLASSEX wcex;
	wcex.cbClsExtra=0;
	wcex.cbSize=sizeof(wcex);
	wcex.cbWndExtra=0;
	wcex.hbrBackground=NULL;
	wcex.hCursor=NULL;
	wcex.hIcon=NULL;
	wcex.hIconSm=NULL;
	wcex.hInstance=GetModuleHandle(NULL);
	wcex.lpfnWndProc=MsgProc;
	wcex.lpszClassName=L"Self001";
	wcex.lpszMenuName=NULL;
	wcex.style=CS_CLASSDC;

	//register wnd class.
	RegisterClassEx(&wcex);

	//create window.
	HWND hWnd=CreateWindowEx(
		WS_EX_OVERLAPPEDWINDOW,
		L"Self001",
		L"Self001 Window",
		WS_OVERLAPPEDWINDOW,
		100,
		100,
		300,
		300,
		NULL,
		NULL,
		wcex.hInstance,
		NULL);

	//init d3d
	if(SUCCEEDED(InitD3D(hWnd)))
	{
		//show window.
		ShowWindow(hWnd,SW_SHOWDEFAULT);
		UpdateWindow(hWnd);

		//message loop.
		MSG msg;
		ZeroMemory(&msg,sizeof(msg));
		while(msg.message != WM_QUIT)
		{
			if(PeekMessage(&msg,hWnd,0,0,PM_REMOVE))
			{
				TranslateMessage(&msg);
				DispatchMessage(&msg);
			}
			else
			{
				Render();
			}
		}
	}

	//unregister wnd class.
	UnregisterClass(L"Self001",wcex.hInstance);

	return 0;
}

//init d3d.
HRESULT InitD3D(HWND hWnd)
{
	//create d3d.
	g_pd3d=Direct3DCreate9(D3D_SDK_VERSION);
	if(g_pd3d == NULL)
	{
		return E_FAIL;
	}

	//initialize d3d present parameters.
	D3DPRESENT_PARAMETERS d3dpp;
	ZeroMemory(&d3dpp,sizeof(d3dpp));
	d3dpp.Windowed=TRUE;
	d3dpp.SwapEffect=D3DSWAPEFFECT_DISCARD;
	d3dpp.BackBufferFormat=D3DFMT_UNKNOWN;

	//create d3d device.
	if(FAILED(g_pd3d->CreateDevice(
		D3DADAPTER_DEFAULT,
		D3DDEVTYPE_HAL,
		hWnd,
		D3DCREATE_SOFTWARE_VERTEXPROCESSING,
		&d3dpp,
		&g_pd3dDevice9)))
	{
		return E_FAIL;
	}

	//init vertex buffer.
	if(FAILED(InitD3DVertexBuffer()))
	{
		return E_FAIL;
	}

	return S_OK;
}

//clean up d3d.
void CleanUp()
{
	//TODO: 3 clean up d3d.
	if(g_pd3dVB != NULL)
	{
		g_pd3dVB->Release();
	}

	//release device.
	if(g_pd3dDevice9 != NULL)
	{
		g_pd3dDevice9->Release();
	}

	//release d3d.
	if(g_pd3d != NULL)
	{
		g_pd3d->Release();
	}
}

//render the scene.
void Render()
{
	//clear target.
	g_pd3dDevice9->Clear(
		0,
		NULL,
		D3DCLEAR_TARGET,
		D3DCOLOR_XRGB(0,0,0),
		1.0f,
		0);

	//draw primitive.
	if(SUCCEEDED(g_pd3dDevice9->BeginScene()))
	{
		//TODO: 2 render d3d.
		g_pd3dDevice9->SetStreamSource(0,g_pd3dVB,0,sizeof(CUSTOMVERTEX));
		g_pd3dDevice9->SetFVF(D3DFVF_CUSTOMVERTEX);
		g_pd3dDevice9->DrawPrimitive(D3DPT_TRIANGLELIST,0,1);

		g_pd3dDevice9->EndScene();
	}

	//present sence.
	g_pd3dDevice9->Present(NULL,NULL,NULL,NULL);
}

//window message handler.
LRESULT CALLBACK MsgProc(HWND hWnd,UINT msg,WPARAM wParam,LPARAM lParam)
{
	switch(msg)
	{
	case WM_DESTROY:
		CleanUp();
		return 0L;
	}

	return DefWindowProc(hWnd,msg,wParam,lParam);
}

//init d3d vertex buffer.
HRESULT InitD3DVertexBuffer()
{
	//TODO: 1 init vertex buffer data.
	//create vertex data.
	CUSTOMVERTEX vertices[3]=
	{
		{50.0f,250.0f,1.0f,1.0f},
		{150.0f,50.0f,1.0f,1.0f},
		{250.0f,250.0f,1.0f,1.0f}
	};

	//create vertex buffer.
	if(FAILED(g_pd3dDevice9->CreateVertexBuffer(
		sizeof(vertices),
		0,
		D3DFVF_CUSTOMVERTEX,
		D3DPOOL_DEFAULT,
		&g_pd3dVB,
		NULL)))
	{
		return E_FAIL;
	}

	//file vertex buffer.
	void* pVertices=NULL;
	if(FAILED(g_pd3dVB->Lock(0,sizeof(vertices),&pVertices,0)))
	{
		return E_FAIL;
	}

	memcpy(pVertices,vertices,sizeof(vertices));

	g_pd3dVB->Unlock();

	return S_OK;
}

1.配置好d3d sdk 路径。

2.打开任务栏,调到凝视,開始练习。

时间: 2024-11-02 19:22:34

D3D 练习小框架的相关文章

ios 常用的小框架

在ios开发中,一些请求 kvc 下拉列表  图片请求等等自己手写代码的话非常麻烦,还容易出现一系列的问题,现在整理了一些常用的一些小框架. 其中MJExtension 和 MJRefresh 这两个框架是 MJ自己写的, 1.AFNetworking-master 是用于数据请求的 用法: [objc] view plaincopy // 1.创建请求管理对象 AFHTTPRequestOperationManager *mgr = [AFHTTPRequestOperationManager

分析一个类似于jquery的小框架

在网上下了一个类似于jQuery的小框架,分析源码,看看怎么写框架. 选择器Select //用沙箱闭包其整个代码,只有itcast和I暴漏在全局作用域 (function( window , undefined){ //Itcast函数,参数:selector.返回值一个Itcast对象,功能:new Itcast.prototype.init() function Itcast(selector){ return new Itcast.prototype.init(); } // Itcas

一、搭建自己的开发小框架之构思

入IT这行许久,但一直毫无建树.为何?国人的惯性思维而已! 今早起来,瞬间冒出一想法,为何自己不做一个与功能性有关的.一键式的开发小框架.本人做了几年的研发,随时会遇到有各种功能性软件的需求.如果自己有一套可以一键自动生成某些功能的开发框架,那么每次开发起来岂不是可以减少大量重复搭建框架的操作. 就拿最简单的例子来说,此操作共计4步: 1.导入Execl文件: 2.筛选数据: 3.计算结果: 4.导出Excel文件. 如果一般性开发的话,首选还要寻找能操作Excel的dll文件,其次,还要cop

java创建一个简单的小框架frame

import java.awt.*; import javax.swing.*; public class SimpleFrameTest { public static void main(String[] args) { EventQueue.invokeLater(new Runnable(){ // 开一个线程 public void run() { SimpleFrame frame = new SimpleFrame(); frame.setTitle("记事本"); //

实现AOP功能的封装与配置的小框架

内容 java基础巩固笔记 - 实现AOP功能的封装与配置的小框架 设计(目录): XXX = java.util.ArrayList中 代码 Advice接口 MyAdvice类 BeanFactory类 ProxyFactoryBean类 AopFrameWorkTest类 输出 本文通过是动态代理实现的AOP功能的封装与配置的小框架.加深对动态代理和AOP编程的理解 获取源码,学习交流,那就加入小编的学习交流群吧!616 959 444 设计 根据配置文件的键xxx对应的值(类全名)创建相

D3D 线列 小例子

画两条线 #pragma once #pragma comment(lib,"d3d9.lib") #pragma comment(lib,"d3dx9.lib") #include<d3d9.h> #include<d3dx9.h> //TODO: -1 custom vertex struct CUSTOMVERTEX { float x; float y; float z; float rhw; }; #define D3DFVF_CU

自己封装的一个Ajax小框架

在经历了Jsp实训的惨痛教训后,特意花了点时间学习Ajax,学完后自我感觉良好,于是写了如下一个小框架: 1 /** 2 * frameAjax 3 * 4 * 参数: 5 * paramsObj: Json 6 * required params: 7 * type:请求参数类型(String) 8 * url:请求地址(String) 9 * data:请求参数(Json),data可为空值. 10 * success:请求回调(Function) 11 * async:表示请求是否异步处理

三行代码接入,社交软件打字时底下弹出的表情布局,自定义ViewPager+页面点标+各种功能的android小框架。

(转载请声明出处:http://www.cnblogs.com/linguanh/) 前言: 接上次分享的 ListView 动态加载类,入口:http://www.cnblogs.com/linguanh/p/4645115.html  这次分享给大家的是,刚些写好的类似社交软件打字时地下弹出的表情布局. 先看下我的默认效果图. 该效果图里面使用的图片资源,是默认的IC_lanucher,在我的类里面,你可以自定义,包括布局,几行几列,什么的,都可以自定义.底下的是小点标. 下集预告:我将在使

封装一个自己的 Ajax小框架

框架代码如下: // 使用封装方法的人只关心提供http的请求方法,url地址,数据,成功和失败的回调方法 // 类的构造定义,主要职责就是新建出 XMLHttpRequest 对象 var MyXMLHttpRequest = function () { var xmlhttprequest; if (window.XMLHttpRequest) { xmlhttprequest = new XMLHttpRequest(); if (xmlhttprequest.overrideMimeTy