GameDev.ru
/ GameDev.ru / Пользователи / Andrey / Сообщения на форуме пользователя Andrey (199 стр.)

Сообщения на форуме пользователя Andrey (199 стр.)

Закритикуйте и убейте реализацию простого bump mapping'а! :)17 янв. 200615:22#35
resurected_timofei
стабильно 32 FPS Radeon 9200 SE :)))
и никаких текстур все белое :(
наверное карта очень пещерная. ты ошибки проверяешь это хорошо(запускал при отсутвии папки Data), но хотя-бы в stderr выводи о не поддержке расширений, а то я лично не понял почему конкретно что у меня не работает :)
к сожаленибю не смог оценить красоту :(
Проблемы с обменом значений между C/C++ и Lua.17 янв. 200613:33#46
Misterion
а если не вызывать просто выполнение скрипта?
Проблемы с обменом значений между C/C++ и Lua.17 янв. 200611:26#44
Sneer
спасибо тебе за все!! :) , если еще будут вопросы я подниму тему.
Рендер в текстуру(OpenGL) в glut приложении работает, в своем Win32 нет16 янв. 200622:33#1
инициализация:
//создание рендера в текстуру
void CreateRenderToTexture(unsigned int width, unsigned int height) const
{
	// do some error checking to make sure function pointers were initialized correctly
	if (!wglMakeContextCurrentARB || !wglChoosePixelFormatARB
		|| !wglCreatePbufferARB || !wglDestroyPbufferARB
		|| !wglGetPbufferDCARB || !wglReleasePbufferDCARB
		|| !wglQueryPbufferARB || !wglBindTexImageARB
		|| !wglReleaseTexImageARB || !wglSetPbufferAttribARB) {
		return;
	}
	// if the pbuffer is already initialized make sure the previous buffer
	// is freed before allocating a new one.
	if (pbuffer.pbufferInitialized) {
		PBufferDestroy(pbuffer);
	}
	// keep track of the pbuffer size incase we have to create a new one
	// because of a display mode change.
	// get the current opengl device and render context
	HDC hcurDC = wglGetCurrentDC();
	HGLRC hcurRC = wglGetCurrentContext();
	if (!hcurDC) {
...
		return;
	}
	if (!hcurRC) {
..
		return;
	}
	// define the minimum pixel format requirements we will need for our pbuffer
	// a pbuffer is just like a frame buffer, it can have a depth buffer associated
	// with it and it can be double buffered.
	int attr[] =  {
		WGL_SUPPORT_OPENGL_ARB, TRUE, // pbuffer will be used with gl
		WGL_DRAW_TO_PBUFFER_ARB, TRUE, // enable render to pbuffer
		WGL_BIND_TO_TEXTURE_RGBA_ARB, TRUE, // pbuffer will be used as a texture
		WGL_RED_BITS_ARB, 8, // at least 8 bits for RED channel
		WGL_GREEN_BITS_ARB, 8, // at least 8 bits for GREEN channel
		WGL_BLUE_BITS_ARB, 8, // at least 8 bits for BLUE channel
		WGL_ALPHA_BITS_ARB, 8, // at least 8 bits for ALPHA channel
		WGL_STENCIL_BITS_ARB, 8,
		WGL_ACCUM_BITS_ARB, 32,
		WGL_DEPTH_BITS_ARB, 24, // at least 24 bits for depth buffer
		WGL_DOUBLE_BUFFER_ARB, FALSE, // we don't require double buffering
		0 // zero terminates the list
	};
	// choose a pixel format that meets our minimum requirements
	unsigned int count = 0;
	enum {MAX_FORMATS = 20};
	int pixelFormats[MAX_FORMATS] = {0};
	float fattr[MAX_FORMATS] = {0.0f};
	wglChoosePixelFormatARB(hcurDC, attr, fattr, MAX_FORMATS, pixelFormats, &count);
	if (!count) {
...
		return;
	}
	// set some pbuffer attributes so that we can use this pbuffer as a
	// 2D RGBA texture target
	int pAttrib[] = {
		WGL_TEXTURE_FORMAT_ARB, // our pbuffer will have texture format RGBA
		WGL_TEXTURE_RGBA_ARB,
		WGL_TEXTURE_TARGET_ARB, // of texture type GL_TEXTURE_2D
		WGL_TEXTURE_2D_ARB,
		0 // zero terminates the list
	};
	unsigned int err = 0;
	int pixelFormat = pixelFormats[0];
	// allocate the pbuffer
	pbuffer.hPBuffer = wglCreatePbufferARB(hcurDC, pixelFormat, width, height, pAttrib);
	if(!pbuffer.hPBuffer) {
...
		return;
	}
	CheckOpenGLError();
	pbuffer.hGLDC = wglGetPbufferDCARB(pbuffer.hPBuffer);
	if(!pbuffer.hGLDC) {
...
		return;
	}
	CheckOpenGLError();
	pbuffer.hGLRC = wglCreateContext(pbuffer.hGLDC);
	if(!pbuffer.hGLRC) {
...
		return;
	}
	wglQueryPbufferARB(pbuffer.hPBuffer, WGL_PBUFFER_WIDTH_ARB,  reinterpret_cast<int*>(&width));
	wglQueryPbufferARB(pbuffer.hPBuffer, WGL_PBUFFER_HEIGHT_ARB, reinterpret_cast<int*>(&height));
...
	err = wglShareLists(hcurRC, pbuffer.hGLRC) != 0;
	// make a texture object for binding the pbuffer to
	glGenTextures(1, &pbuffer.pbufferTextureID);
	glBindTexture(GL_TEXTURE_2D, pbuffer.pbufferTextureID);
	glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
	glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
	glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
	glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
	glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
	pbuffer.pbufferInitialized = true;
}
разница лишь в Win32:
вместо glutSwapBuffers();
SwapBuffers(hDC);
и все!!!!
вот что получается на чайнике в glut приложении:
Изображение удалено
вот чуть повернули мышь:
[Изображение удалено
а вот и сама сцена:
Изображение удалено
я думаю по рисункам понятно что я хочу получить(в будущем хочу сделать зеркало)
Видеокарта Radeon 9200 SE.
что я делаю не так?
Спасибо заранее
С Уважением Андрей.

Правка: 16 янв. 2006 22:39

Рендер в текстуру(OpenGL) в glut приложении работает, в своем Win32 нет16 янв. 200622:32#0
Привет всем!!!
Проблема у меня с рендером в текстуру в OpenGL.
делаю по книге Борескова "Расширения OpenGL"
с glut приложением все ок, а вот если создавать свое Win32 то видим только фон :(.
хотя код идеитичен
я рендерю всю сцену и накладываю ее на чайник, и в чайнике двигается вся сцена т.е. как бы видишь движение по сцене на
чайнике.
это все ок в glut.
вот код:
#include <gl/glew.h>
#include <gl/wglew.h>

//реализация p-Buffer'а
class OpenGLPBuffer {
public:
	//флаг инициализации
	bool pbufferInitialized;
	//текстура pbufer'а
	unsigned int pbufferTextureID;
	HDC hGLDC;
	HGLRC hGLRC;
	// handle, device context and render context for pbuffer buffer
	HPBUFFERARB hPBuffer;
	HDC hPBufferDC;
	HGLRC hPBufferRC;
	OpenGLPBuffer() : pbufferTextureID(0), pbufferInitialized(false),
	hGLDC(NULL), hGLRC(NULL), hPBuffer(NULL), hPBufferDC(NULL), hPBufferRC(NULL)
	{}
	~OpenGLPBuffer(){}
};
//начало рендера в текстуру
void BeginRenderToTexture(OpenGLPBuffer &pbuffer)
{
	pbuffer.hPBufferDC = wglGetCurrentDC();
	pbuffer.hPBufferRC = wglGetCurrentContext();
	if (!wglMakeCurrent(pbuffer.hGLDC, pbuffer.hGLRC)) {
	//	CheckOpenGLError();
	}
	glClearColor(0, 0.0, 0, 0);
	glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
	glEnable(GL_TEXTURE_2D);
}
//конец рендера в текстуру
void EndRenderToTexture(OpenGLPBuffer &pbuffer)
{
	// make sure the pbuffer has been initialized
	if (!pbuffer.pbufferInitialized) {
		return;
	}
	bool res = wglMakeCurrent(pbuffer.hPBufferDC, pbuffer.hPBufferRC) != 0;
	if (!res)
		return;
	pbuffer.hPBufferDC =  NULL;
	pbuffer.hPBufferRC =  NULL;
	// make sure we haven't lost our pbuffer due to a display mode change
	int flag = 0;
	res = wglQueryPbufferARB(pbuffer.hPBuffer, WGL_PBUFFER_LOST_ARB, &flag) != 0;
	if (flag != 0) 	{
		return;
	}
	// bind pbuffer to the currently bound texture object
	// while the pbuffer is bound to a texture it is illegal
	// to read or write from the pbuffer until it is released
	res = wglBindTexImageARB(pbuffer.hPBuffer, WGL_FRONT_LEFT_ARB) != 0;
	// make sure the pbuffer has been initialized
	glBindTexture(GL_TEXTURE_2D, pbuffer.pbufferTextureID);
	// release the pbuffer so that it can be rendered to again
	res = wglReleaseTexImageARB(pbuffer.hPBuffer, WGL_FRONT_LEFT_ARB) != 0;
	glBindTexture(GL_TEXTURE_2D, 0);
	// bind a texture object that we will associate a pbuffer with
	glBindTexture (GL_TEXTURE_2D, pbuffer.pbufferTextureID);
	// bind pbuffer to the currently bound texture object
	// while the pbuffer is bound to a texture it is illegal
	// to read or write from the pbuffer until it is released
	wglBindTexImageARB(pbuffer.hPBuffer, WGL_FRONT_LEFT_ARB);
}
делаю это вот так:
void redraw()
{
	BeginRenderToTexture(pbuffer);
	DrawScene();
	EndRenderToTexture(pbuffer);
	dt1 += 5;
	glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );
	glLoadIdentity();
	glTranslatef(0.0f, 0.0f, -3);
	dt += 0.8;
	glRotatef(dt, 1.0f, 0.0f, 0.0f);
	glRotatef(dt, 0.0f, 1.0f, 0.0f);
	glRotatef(dt, 0.0f, 0.0f, 1.0f);
	glutSolidTeapot(0.5);
	DrawPolygon(&vertice[0], 2);
	glFlush();
	glutSwapBuffers();
}
Проблемы с обменом значений между C/C++ и Lua.16 янв. 200613:08#42
Sneer
Кстати еще вопрос стоил ли заморачиваться luabind и tolua просто с luabind проблемы с коvпиляцией :( да и
выкачать не могу поновей
ты вообще используешь свои обертки?
Проблемы с обменом значений между C/C++ и Lua.16 янв. 200611:30#40
Sneer
>А что ты исправлял?
Я иcправил предачу и получение значений:
void GetValue(lua_State* state, const string& varName, float &num)
{
	lua_getglobal(state, varName.c_str());
	num = static_cast<float>(lua_tonumber(state, -1));
	lua_pop(state, 1);
	fprintf(stderr, "%f%s", num, "\n");
}
void SetValue(lua_State* state, const string& varName, float num)
{
	lua_pushnumber(state, num);
	lua_setglobal(state, varName.c_str());
}
>Вообще, у меня подозрение, что ты смешал два способа получать от >Lua информацию.
>С одной стороны, ты создаешь глобальные переменные и, вероятно, >пытаешься с ними работать, с другой стороны, ты возвращаешь >значения из функции
>...
>return dx, dy --возврат значения функции
это уже убрал, теперь скрипт выглядет так:
function test()
dx = math.random()--math.sin(os.clock()) --задаем закон движения
dy = math.sin(os.clock()) --задаем закон движения
dt = dt + 1
end
>Нужно выбрать что-то одно.
Я выбрал использование глобальных переменных, я вызываю функцию теперь так:
result = lua_pcall(state, 0, 0, 0);
вместо
result = lua_pcall(state, 0, 3, 0);
я так понимаю функция уже ничего не возвращает, а просто меняет глобальные переменные известные Lua.
Работают оба варианта вызова функции, но с последним исчезло сообщения о переполнении стека!!!, я так понимаю Lua сам размер стека увеличивает, но у меня память увеличивалась на 4 кб примерно каждые 3 сек.
>А если тебе хотелось бы и дальше получать ответы, то будь добр - >расставляй запятые и вычитывай текст перед тем, как постить его. >Понять то, что ты пишешь можно далеко не с первого раза. Хинт: >Если ты не хочешь чуть-чуть напрячься, чтобы нормально задать >вопрос, почему кто-то должен напрягаться и тратить свое время, >чтобы на него ответить? Кому это больше нужно?
все понятно буду исправляться :)
Спасибо тебе теперь все у меня работает :)
Если что будет непонятно, я подниму тему.
Проблемы с обменом значений между C/C++ и Lua.16 янв. 20060:09#38
Sneer
Ну последня проблема что со стеком?
Помогите с классами!15 янв. 200614:42#6
Aiming
можно и через realloc тоько память перевыделять не для 1 объекта а с запасом например на 5-10
свой массив самый быстрый в отличии от std::vector
Как сделать динамическое добавление объектов15 янв. 200614:38#2
Nomand
лучше через итераторы а лучше свой динамический массив через realloc только пямть перевыделять с запасом.
boost 1.33: Не хватает файла boost/mpl/apply_if.hpp15 янв. 200614:35#15
ArT
eXire
Нехрена не понимаю я просто этим не пользовался. Вот нажал Enter
и как быть с этой непонятной ошибкой?
C:\Program Files\CVSNT>cvs -d:pserver::/cvsroot/lua
bind login
Logging in to :pserver::2401:/cvsroot/luabind
CVS Password:
cvs [login aborted]: Error reading from server cvs.sourceforge.net: -1: Unknown
error

C:\Program Files\CVSNT>rem cvs -z3 -d:pserver::/cvs
root/luabind co -P luabind

C:\Program Files\CVSNT>pause
Для продолжения нажмите любую клавишу . . .

Octree дерево в D3DX915 янв. 200614:28#10
Mr_Crystall
Feaerenil
Scart
Feaerenil
Mr_Crystall
итак вот примерные классы узла дерева и самого дерева.
//класс узла octree
class OctreeNode {
private:
//ограничивающее тело узла (т.е. куб с min и max точкой)
	AABB Box;
//число детей узла
	unsigned int NumChildNodes;

//дети узла
	OctreeNode *child[8];
public:
	enum {
		NUMBERPOLIGONS = 100//максимальное число полигонов в узле
	};
//присвоить новый узел
void SetChild(OctreeNode* node)
{
	child[NumChildNodes] = node;
//увеличить число узлов
	NumChildNodes++;
}
};
class Octree {
//узел дерева
	OctreeNode *root;
//массив помеченных полигонов
	map<unsigned int, vector<unsigned int> > occupedPolygons;
};
OctreeNode *child[8]; заранее пусть будет 8 узлов, на самом деле их может быть меньше, т.к. все зависит от геометнии и того какие полигоны попадут в узел.
вообще число узлов будет определять метод SetChild
тогда в цикле в будущем будем перебирать от 0 до NumChildNodes
итак теперь более подробное постронение
1) создаем корень дерева  и вычисляем AABB гам нужно знать общий размер куба всей сценыт.е:
//создание нового узла
		root = new OctreeNode;
//вычичление AABB корня
2) цикл по от 0 до 7
в этом цикле мы вычисляем в зависимости от номера узла AABB
3) проверяем  попадание полигонов в узел(заодно проверяемне пренадлежит ли этот полигоно ешще какому-нибудь узлу т.к. это рекурсия)попутно решаем проблему попадания одного полигона в несолько узлов для этого попавший полигон помечаем в отдельный массив используемых полигонов у меня это occupedPolygons - в map кдюч unsigned int  - этон номер поверхности(поверхность это массив полигонов принадлежащий какому-то материалу)
4) если число полигонов в узле < какого-то числа например 100 - 200(возникнет вопрос как это может быть если в сцене их много? ответ число полигонов принадлежащих на тест попадания в узел, уменьшается т.к. учитываются те полигоны которые уже попали в какие-то узлы(листья)) то мы ассоциируем полигоны с узлом(создаем вершинные буферы меши и т.д. это уже как хотите) т.е. это узел лист его и будем рендерить и у него нет дочерних узлов. выходим из текущего вызова рекурсивной функции и идем к шагу 3.
5) если кончились все полигоны выходим ихз посторения деинициализируем временные массивы.

теперь рендер дерева: все просто рекурсивно (в циекле от 0 до NumChildNodes для каждого узла)проверяем попадание текущего узла в frusum если он частично или полностью попадает и он является листом(т.к. в простом узле нет данных для рендера) производим его рендер. Продолжаем рекурсию.

Если что непонятно жду вопросов...

boost 1.33: Не хватает файла boost/mpl/apply_if.hpp15 янв. 200613:01#12
ArT
C:\Program Files\CVSNT>cvs -d:pserver::/cvsroot/luabind login
Logging in to :pserver::2401:/cvsroot/luabind
CVS Password:
и что дальше? :(
Проблемы с обменом значений между C/C++ и Lua.15 янв. 200612:57#37
Sneer
Усе!!! я разобрался с вопросом 2!! теперь помоги с вопрососм 1!!!
почему стек переполняется что нужно снять? функцию?
Timm
>Эээ.. Хватит мазохизмом занимаццо. Стек Луа - сложная и непонятная вещь, фактически это не стек а двусвязный список, >за ним нужно только так следить.

>Используй tolua - очень простая библиотечка, проще разобраться чем с Luabind, быстрее работает и главное - ничего >руками писать не надо - скармливаешь ему файл с объявлениями классов, функций, переменных - на выходе готовый файл >*.cpp для связки. Если переменные и функции ещё можно как то вручную, но вот с классами разбираццо дооолго...
ладно я пока потихонечку въезжаю, но классы это уже привязка к коду.
я пока могу обмениваться с  скриптом большим числом переменных и вызывать функции этого на первых порах достаточно.
я хочу переменные и функции описать в текстовом файле и пусть объект запоминает имена перменных и функция в своих данных и дает это скрипту мы так я делаю независимость от имен осталась реализовать независимость от действий.

Octree дерево в D3DX915 янв. 20060:35#4
Mr_Crystall
Я тебе попозже напишу как сделал(мф же сегодня с тобой в аське говорили?)

Следующие темы >>

2001—2012 © GameDev.ru — Разработка игр