Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 22.06.2009, 20:19   #1
chuvaka4x
Новичок
Джуниор
 
Регистрация: 17.06.2009
Сообщений: 2
По умолчанию C++ DirectX OpenGL

Кто владеет тайнами 3D-графики помогите. нужен примитивный исходник на С++, который выводит элементарную фигуру (напр. треугольник) на экран используя DirectX и второй то же самое но с OpenGL. Я долеплю 2 таймера перед началом отрисовки и после, надо найти разницу в производительности. Кто то владеет искусством 3D?
chuvaka4x вне форума Ответить с цитированием
Старый 22.06.2009, 23:00   #2
vvviperrr
Тупой студент
Форумчанин
 
Аватар для vvviperrr
 
Регистрация: 12.05.2007
Сообщений: 614
По умолчанию

2chuvaka4x тяжело поюзать книги? или хотя бы поискать в инете, таких вещей очень много.
вот сорс на opengl, то, что ты и просил, вращающийся треугольник. писал по книге в линухе, в винде тоже должно работать, ибо использовал либу glut. скорее всего надо будет подключить windows.h в начале. проверить нет возможности.

Код:
#include <GL/gl.h>
#include <GL/glut.h>
#include <math.h>

static GLfloat spin = 0.0;
static GLfloat centerX;
static GLfloat centerY;

void display(void) {
	glRotatef(spin, 0.0, 0.0, 1.0);
	glClear(GL_COLOR_BUFFER_BIT);
	glBegin(GL_TRIANGLES);
		glColor3f(1.0, 0.0, 0.0);
		glVertex3f(50.0, 10.0, 0);
		glColor3f(0.0, 1.0, 0.0);
		glVertex3f(100.0, 10.0, 0);
		glColor3f(0.0, 0.0, 1.0);
		glVertex3f(75.0, 100.0, 0);
	glEnd();
	glutSwapBuffers();
}

//-----------------------------------------------------------------
void spinDisplay(short circle) {
	spin += (circle) ? 2.0 : -2.0;
	if (spin > 360.0) {
		spin -= 360.0;
	} else if (spin < 0) {
		spin += 360.0;
	}
	glutPostRedisplay();
}

//-----------------------------------------------------------------
void init(void) {
	glClearColor(0.0, 0.0, 0.0, 0.0);
}

//-----------------------------------------------------------------
void reshape(int w, int h) {
	glViewport(0, 0, (GLsizei)w, (GLsizei)h);
	glMatrixMode(GL_PROJECTION);
	glLoadIdentity();
	centerX = (GLdouble)w/2;
	centerY = (GLdouble)h/2;
	gluOrtho2D(-(GLdouble)w/2, (GLdouble)w/2, -(GLdouble)h/2, (GLdouble)h/2);
}

//-----------------------------------------------------------------
void mouse(int button, int state, int x, int y) {
	switch (button) {
	case GLUT_LEFT_BUTTON:
		if (state == GLUT_DOWN) {
			spinDisplay(1);
		}
		break;
	case GLUT_MIDDLE_BUTTON:
		if (state == GLUT_DOWN) {
			//glutIdleFunc(NULL);
		}
		break;
	default:
		break;
	}
}

//-----------------------------------------------------------------
void keyboard(unsigned char key, int x, int y) {
	switch (key) {
	case 'a':
		spinDisplay(1);
		break;
	case 'd':
		spinDisplay(0);
		break;
	}
}

//-----------------------------------------------------------------
int main(int argc, char **argv) {
	glutInit(&argc, argv);
	glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB);
	glutInitWindowSize(250, 250);
	glutInitWindowPosition(100, 100);
	glutCreateWindow("hello");
	init();
	glutDisplayFunc(display);
	glutReshapeFunc(reshape);
	glutMouseFunc(mouse);
	glutKeyboardFunc(keyboard);
	glutMainLoop();
	return 0;
}
vvviperrr вне форума Ответить с цитированием
Старый 22.06.2009, 23:17   #3
MaTBeu
Eclipse Foundation
Старожил
 
Аватар для MaTBeu
 
Регистрация: 19.09.2007
Сообщений: 2,604
По умолчанию

А с каких это времен треугольник считается 3D-фигурой?
Вот вам пример - вращающийся куб. Свет, тень, материал присутствует.
Для работы нужен DirectX9 SDK.
Код:
#include <windows.h>
#include <d3d9.h>
#include <d3dx9.h>
#include <Mmsystem.h>
#pragma comment(lib, "d3d9.lib")
#pragma comment(lib, "d3dx9.lib")
#pragma comment(lib, "Winmm.lib")


IDirect3D9* pDirect3D=NULL;
IDirect3DDevice9* pDirect3DDevice=NULL;

struct CUSTOMVERTEX
{
	FLOAT X, Y, Z, rhw;
	FLOAT nx, ny, nz;
};

#define D3DFVF_CUSTOMVERTEX (D3DFVF_XYZ|D3DFVF_NORMAL)

IDirect3DVertexBuffer9* pBufferVertex = NULL;
IDirect3DIndexBuffer9* pBufferIndex = NULL;


HRESULT InitialDirect3D(HWND hwnd)
{
	if(NULL == (pDirect3D = Direct3DCreate9(D3D_SDK_VERSION)))//создание указателя на основной интерфейс IDirect3D
		return E_FAIL;
	D3DDISPLAYMODE Display;//создание переменной, содержащей текущую конфигурацию дисплея
	if(FAILED(pDirect3D->GetAdapterDisplayMode(D3DADAPTER_DEFAULT, &Display)))//получаем текущую конфигурацию дисплея
		return E_FAIL;
	D3DPRESENT_PARAMETERS Direct3DParametr;//параметры поведения приложения
	ZeroMemory(&Direct3DParametr, sizeof(Direct3DParametr));//очистка значений параметров
	Direct3DParametr.Windowed=TRUE;//оконный режим
	Direct3DParametr.SwapEffect=D3DSWAPEFFECT_DISCARD;//формат взаимодействия между буферами (используется один задний буфер)
	Direct3DParametr.BackBufferFormat=Display.Format;//формат поверхности заднего буффера
	Direct3DParametr.EnableAutoDepthStencil=TRUE;
	Direct3DParametr.AutoDepthStencilFormat=D3DFMT_D16;
	if(FAILED(pDirect3D->CreateDevice(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, hwnd, D3DCREATE_HARDWARE_VERTEXPROCESSING, &Direct3DParametr, &pDirect3DDevice)))//создание устройства Директ 3Д (Не путать с созданием интерфейса!!!!!)
		return E_FAIL;
	pDirect3DDevice->SetRenderState(D3DRS_CULLMODE, D3DCULL_NONE);
	pDirect3DDevice->SetRenderState(D3DRS_LIGHTING, FALSE);
	pDirect3DDevice->SetRenderState(D3DRS_ZENABLE, D3DZB_TRUE);
	return S_OK;
}

HRESULT InitialObject()
{
	CUSTOMVERTEX Vertex[] = 
	{
		{1.0f, -1.0f, -1.0f, 0.0f, 0.0f, -1.0f}, // vertex A
		{-1.0f, -1.0f, -1.0f, 0.0f, 0.0f, -1.0f}, // vertex B
		{-1.0f, 1.0f, -1.0f, 0.0f, 0.0f, -1.0f},  // vertex C
		{1.0f, 1.0f, -1.0f, 0.0f, 0.0f, -1.0f},	//vertex D
		//x		  y	   z	     color
		{-1.0f, -1.0f, 1.0f, -1.0f, 0.0f, 0.0f},  // vertex A2
		{-1.0f, -1.0f, -1.0f, -1.0f, 0.0f, 0.0f},  // vertex B2
		{-1.0f, 1.0f, -1.0f, -1.0f, 0.0f, 0.0f},  // vertex C2
		{-1.0f, 1.0f, 1.0f, -1.0f, 0.0f, 0.0f},  // vertex D2

		{1.0f, -1.0f, 1.0f, 0.0f, 0.0f, 1.0f},  // vertex A3
		{-1.0f, -1.0f, 1.0f, 0.0f, 0.0f, 1.0f},  // vertex B3
		{-1.0f, 1.0f, 1.0f, 0.0f, 0.0f, 1.0f},  // vertex C3
		{1.0f, 1.0f, 1.0f, 0.0f, 0.0f, 1.0f},  // vertex D3

		{1.0f, -1.0f, -1.0f, 1.0f, 0.0f, 0.0f},  // vertex A4
		{1.0f, -1.0f, 1.0f, 1.0f, 0.0f, 0.0f},  // vertex B4
		{1.0f, 1.0f, 1.0f, 1.0f, 0.0f, 0.0f},  // vertex C4
		{1.0f, 1.0f, -1.0f, 1.0f, 0.0f, 0.0f},  // vertex D4

		{1.0f, 1.0f, 1.0f, 0.0f, -1.0f, 0.0f},  // vertex A5
		{-1.0f, 1.0f, 1.0f, 0.0f, -1.0f, 0.0f},  // vertex B5
		{-1.0f, 1.0f, -1.0f, 0.0f, -1.0f, 0.0f},  // vertex C5
		{1.0f, 1.0f, -1.0f, 0.0f, -1.0f, 0.0f},  // vertex D5

		{1.0f, -1.0f, 1.0f, 0.0f, 1.0f, 0.0f},  // vertex A6
		{-1.0f, -1.0f, 1.0f, 0.0f, 1.0f, 0.0f},  // vertex B6
		{-1.0f, -1.0f, -1.0f, 0.0f, 1.0f, 0.0f},  // vertex C6
		{1.0f, -1.0f, -1.0f, 0.0f, 1.0f, 0.0f}  // vertex D6
	};

	const unsigned short Index[] = 
	{
		0, 1, 2,		2, 3, 0,
		4, 5, 6,		6, 7, 4,
		8, 9, 10,		10, 11, 8,
		12, 13, 14,		14, 15, 12,
		16, 17, 18,		18, 19, 16,
		20, 21, 22,		22, 23, 20
	};

	if(FAILED(pDirect3DDevice->CreateVertexBuffer(36*sizeof(CUSTOMVERTEX), 0, D3DFVF_CUSTOMVERTEX, D3DPOOL_DEFAULT, &pBufferVertex, NULL)))
		return E_FAIL;
	VOID *pBV;
	if(FAILED(pBufferVertex->Lock(0, sizeof(Vertex), (void**)&pBV, 0)))
		return E_FAIL;
	memcpy(pBV, Vertex, sizeof(Vertex));
	pBufferVertex->Unlock();

	//creating index buffer

		pDirect3DDevice->CreateIndexBuffer(36 * sizeof(Index), 0, D3DFMT_INDEX16, D3DPOOL_DEFAULT, &pBufferIndex, NULL);
		VOID* pBI;
		pBufferIndex->Lock(0, sizeof(Index), (void**)&pBI, 0);
		memcpy(pBI, Index, sizeof(Index));
		pBufferIndex->Unlock();
	return S_OK;
}
//это еще не конец...
MaTBeu вне форума Ответить с цитированием
Старый 22.06.2009, 23:19   #4
MaTBeu
Eclipse Foundation
Старожил
 
Аватар для MaTBeu
 
Регистрация: 19.09.2007
Сообщений: 2,604
По умолчанию

Продолжение...
Код:
VOID Matrix()
{
	D3DXMATRIX MatrixWorld, MatrixWorldX, MatrixWorldY, MatrixWorldZ;
	D3DXMATRIX MatrixView;
	D3DXMATRIX MatrixProjection;
//matrix world
	UINT Time = timeGetTime() % 5000;
	FLOAT Angle = Time * (2.0f * D3DX_PI)/5000.0f;
	D3DXMatrixRotationX(&MatrixWorldX, Angle);
	D3DXMatrixRotationY(&MatrixWorldY, Angle);
	//D3DXMatrixRotationZ(&MatrixWorldZ, Angle);
	D3DXMatrixMultiply(&MatrixWorld, &MatrixWorldX, &MatrixWorldY);
	//D3DXMatrixMultiply(&MatrixWorld, &MatrixWorld, &MatrixWorldZ);
	pDirect3DDevice->SetTransform(D3DTS_WORLD, &MatrixWorld);
//matrix view
	D3DXMatrixLookAtLH(&MatrixView, &D3DXVECTOR3(0.0f, 0.0f, -8.0f), &D3DXVECTOR3(0.0f, 0.0f, 0.0f), &D3DXVECTOR3(0.0f, 1.0f, 0.0f));
	pDirect3DDevice->SetTransform(D3DTS_VIEW, &MatrixView);
//matrix projection
	D3DXMatrixPerspectiveFovLH(&MatrixProjection, D3DX_PI/4, 1.0f, 1.0f, 100.0f);
	pDirect3DDevice->SetTransform(D3DTS_PROJECTION, &MatrixProjection);
}
VOID LightMaterial()
{
	D3DMATERIAL9 Material;
	D3DLIGHT9 Light;
	
	ZeroMemory(&Material, sizeof(D3DMATERIAL9));
	Material.Diffuse.r=Material.Ambient.r=1.0f;
	Material.Diffuse.g=Material.Ambient.g=1.0f;
	Material.Diffuse.b=Material.Ambient.b=0.0f;
	Material.Diffuse.a=Material.Ambient.a=1.0f;
	pDirect3DDevice->SetMaterial(&Material);

	D3DXVECTOR3 VectorDir;

	//Light
	ZeroMemory(&Light, sizeof(D3DLIGHT9));
	Light.Type=D3DLIGHT_DIRECTIONAL;
	Light.Diffuse.r=1.0f;
	Light.Diffuse.g=1.0f;
	Light.Diffuse.b=1.0f;
	Light.Range=1000.0f;
	VectorDir=D3DXVECTOR3(0.0f, 0.0f, 1.0f),
	D3DXVec3Normalize((D3DXVECTOR3*)&Light.Direction, &VectorDir);
	pDirect3DDevice->SetLight(0, &Light);
	pDirect3DDevice->LightEnable(0, TRUE);
	pDirect3DDevice->SetRenderState(D3DRS_LIGHTING, TRUE);
	pDirect3DDevice->SetRenderState(D3DRS_AMBIENT, 0);
}

VOID RenderingDirect3D()
{
	if(pDirect3DDevice == NULL)
		return;
	pDirect3DDevice->Clear(0, NULL, D3DCLEAR_TARGET|D3DCLEAR_ZBUFFER, D3DCOLOR_XRGB(60, 100, 150), 1.0f, 0);//очистка буфера в заданный цвет
	pDirect3DDevice->BeginScene();//начало сцены

		LightMaterial();
		Matrix();
		pDirect3DDevice->SetStreamSource(0, pBufferVertex, 0, sizeof(CUSTOMVERTEX));
		pDirect3DDevice->SetFVF(D3DFVF_CUSTOMVERTEX);
		pDirect3DDevice->SetIndices(pBufferIndex);
		pDirect3DDevice->DrawIndexedPrimitive(D3DPT_TRIANGLELIST, 0, 0, 36, 0, 12);
	
	pDirect3DDevice->EndScene();//окончание сцены
	pDirect3DDevice->Present(NULL, NULL, NULL, NULL);//копирование всего из заднего буфера в передний, тоесть прорисовка на экране
}

VOID DeleteDirect3D()
{
	if(pBufferIndex!=NULL)
		pBufferIndex->Release();
	if(pBufferVertex!= NULL)
		pBufferVertex->Release();
	if(pDirect3DDevice!=NULL)
		pDirect3DDevice->Release();
	if(pDirect3D!=NULL)
		pDirect3D->Release();
}

LRESULT CALLBACK MainWinProc(HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam)
{
	switch(msg)
	{
		case WM_PAINT:
			{
				RenderingDirect3D();
				ValidateRect(hwnd, NULL);//прорисовка всего окна
				return 0;
			}
			break;
		case WM_DESTROY:
			{
				DeleteDirect3D();
				PostQuitMessage(0);
				return 0;
			}
			break;
	}
		return (DefWindowProc(hwnd, msg, wparam, lparam));
}

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nShowCmd)
{
	WNDCLASSEX windowsclass;
	HWND hwnd;
	MSG msg;

	windowsclass.cbSize = sizeof(windowsclass);
	windowsclass.style = CS_VREDRAW | CS_HREDRAW | CS_OWNDC | CS_DBLCLKS;//флаги стиля окна, если перемещен по вертикали - перерисовать окно, если перемещено по горизонтали - перерисовать окно, для каждого окна - свой контекст устройств, сообщение о двойном щелчке
	windowsclass.lpfnWndProc = MainWinProc;
	windowsclass.cbClsExtra = 0;
	windowsclass.cbWndExtra = 0;
	windowsclass.hInstance = hInstance;
	windowsclass.hIcon = LoadIcon(NULL, IDI_APPLICATION);
	windowsclass.hCursor = LoadCursor(NULL, IDC_ARROW);
	windowsclass.hbrBackground = (HBRUSH)GetStockObject(GRAY_BRUSH);
	windowsclass.lpszMenuName = NULL;
	windowsclass.lpszClassName = L"Windowsclass";
	windowsclass.hIconSm = LoadIcon(NULL, IDI_APPLICATION);//иконка на панели задач

	RegisterClassEx(&windowsclass);
	
	hwnd = CreateWindowEx(NULL, L"Windowsclass", L"DirectX", WS_OVERLAPPEDWINDOW | WS_VISIBLE, 300, 150, 500, 400, NULL, NULL, hInstance, NULL);
	if(SUCCEEDED(InitialDirect3D(hwnd)))
	{
		if(SUCCEEDED(InitialObject()))
		{
			ShowWindow(hwnd, SW_SHOWDEFAULT);
			UpdateWindow(hwnd);
			ZeroMemory(&msg, sizeof(msg));

			while(msg.message!= WM_QUIT)
			{
				if(PeekMessage(&msg, NULL, 0, 0, PM_REMOVE))
				{
					TranslateMessage(&msg);
					DispatchMessage(&msg);
				}
				else
				RenderingDirect3D();
			}
		}
	}
	return 0;
}
MaTBeu вне форума Ответить с цитированием
Старый 23.06.2009, 12:21   #5
Blade
Software Engineer
Участник клуба
 
Аватар для Blade
 
Регистрация: 07.04.2007
Сообщений: 1,618
По умолчанию

Цитата:
Сообщение от chuvaka4x Посмотреть сообщение
Я долеплю 2 таймера перед началом отрисовки и после, надо найти разницу в производительности.
Для этой задачи нужны сцены посерьезней, чем примитивные фигуры, ибо с примитивами разница будет незаметна
Мужество есть лишь у тех, кто ощутил сердцем страх, кто смотрит в пропасть, но смотрит с гордостью в глазах. (с) Ария
Blade вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
DirectX или OpenGL? chuvaka4x Win Api 6 22.06.2009 09:00
С++ и DirectX Элодар Gamedev - cоздание игр: Unity, OpenGL, DirectX 2 22.02.2009 00:23
OpenGL или всё же DirectX? Dogmat Gamedev - cоздание игр: Unity, OpenGL, DirectX 2 24.09.2008 17:55
DirectX Doom4eg Gamedev - cоздание игр: Unity, OpenGL, DirectX 2 06.08.2008 13:08