Сообщения на форуме пользователя Andrey (199 стр.)
Закритикуйте и убейте реализацию простого bump mapping'а! :) | 17 янв. 2006 | 15:22 | #35 |
---|
стабильно 32 FPS Radeon 9200 SE :)))
и никаких текстур все белое :(
наверное карта очень пещерная. ты ошибки проверяешь это хорошо(запускал при отсутвии папки Data), но хотя-бы в stderr выводи о не поддержке расширений, а то я лично не понял почему конкретно что у меня не работает :)
к сожаленибю не смог оценить красоту :(
Проблемы с обменом значений между C/C++ и Lua. | 17 янв. 2006 | 13:33 | #46 |
---|
а если не вызывать просто выполнение скрипта?
Проблемы с обменом значений между C/C++ и Lua. | 17 янв. 2006 | 11:26 | #44 |
---|
спасибо тебе за все!! :) , если еще будут вопросы я подниму тему.
Рендер в текстуру(OpenGL) в glut приложении работает, в своем Win32 нет | 16 янв. 2006 | 22: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; } |
вместо glutSwapBuffers();
SwapBuffers(hDC);
и все!!!!
вот что получается на чайнике в glut приложении:
вот чуть повернули мышь:
[
а вот и сама сцена:
я думаю по рисункам понятно что я хочу получить(в будущем хочу сделать зеркало)
Видеокарта Radeon 9200 SE.
что я делаю не так?
Спасибо заранее
С Уважением Андрей.
Правка: 16 янв. 2006 22:39
Рендер в текстуру(OpenGL) в glut приложении работает, в своем Win32 нет | 16 янв. 2006 | 22: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 янв. 2006 | 13:08 | #42 |
---|
Кстати еще вопрос стоил ли заморачиваться luabind и tolua просто с luabind проблемы с коvпиляцией :( да и
выкачать не могу поновей
ты вообще используешь свои обертки?
Проблемы с обменом значений между C/C++ и Lua. | 16 янв. 2006 | 11:30 | #40 |
---|
>А что ты исправлял?
Я и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()); }
>С одной стороны, ты создаешь глобальные переменные и, вероятно, >пытаешься с ними работать, с другой стороны, ты возвращаешь >значения из функции
>...
>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 сам размер стека увеличивает, но у меня память увеличивалась на 4 кб примерно каждые 3 сек.
>А если тебе хотелось бы и дальше получать ответы, то будь добр - >расставляй запятые и вычитывай текст перед тем, как постить его. >Понять то, что ты пишешь можно далеко не с первого раза. Хинт: >Если ты не хочешь чуть-чуть напрячься, чтобы нормально задать >вопрос, почему кто-то должен напрягаться и тратить свое время, >чтобы на него ответить? Кому это больше нужно?
все понятно буду исправляться :)
Спасибо тебе теперь все у меня работает :)
Если что будет непонятно, я подниму тему.
Проблемы с обменом значений между C/C++ и Lua. | 16 янв. 2006 | 0:09 | #38 |
---|
Ну последня проблема что со стеком?
Помогите с классами! | 15 янв. 2006 | 14:42 | #6 |
---|
можно и через realloc тоько память перевыделять не для 1 объекта а с запасом например на 5-10
свой массив самый быстрый в отличии от std::vector
Как сделать динамическое добавление объектов | 15 янв. 2006 | 14:38 | #2 |
---|
лучше через итераторы а лучше свой динамический массив через realloc только пямть перевыделять с запасом.
boost 1.33: Не хватает файла boost/mpl/apply_if.hpp | 15 янв. 2006 | 14:35 | #15 |
---|
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 дерево в D3DX9 | 15 янв. 2006 | 14:28 | #10 |
---|
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; };
вообще число узлов будет определять метод SetChild
тогда в цикле в будущем будем перебирать от 0 до NumChildNodes
итак теперь более подробное постронение
1) создаем корень дерева и вычисляем AABB гам нужно знать общий размер куба всей сценыт.е:
//создание нового узла root = new OctreeNode; //вычичление AABB корня
в этом цикле мы вычисляем в зависимости от номера узла AABB
3) проверяем попадание полигонов в узел(заодно проверяемне пренадлежит ли этот полигоно ешще какому-нибудь узлу т.к. это рекурсия)попутно решаем проблему попадания одного полигона в несолько узлов для этого попавший полигон помечаем в отдельный массив используемых полигонов у меня это occupedPolygons - в map кдюч unsigned int - этон номер поверхности(поверхность это массив полигонов принадлежащий какому-то материалу)
4) если число полигонов в узле < какого-то числа например 100 - 200(возникнет вопрос как это может быть если в сцене их много? ответ число полигонов принадлежащих на тест попадания в узел, уменьшается т.к. учитываются те полигоны которые уже попали в какие-то узлы(листья)) то мы ассоциируем полигоны с узлом(создаем вершинные буферы меши и т.д. это уже как хотите) т.е. это узел лист его и будем рендерить и у него нет дочерних узлов. выходим из текущего вызова рекурсивной функции и идем к шагу 3.
5) если кончились все полигоны выходим ихз посторения деинициализируем временные массивы.
теперь рендер дерева: все просто рекурсивно (в циекле от 0 до NumChildNodes для каждого узла)проверяем попадание текущего узла в frusum если он частично или полностью попадает и он является листом(т.к. в простом узле нет данных для рендера) производим его рендер. Продолжаем рекурсию.
Если что непонятно жду вопросов...
boost 1.33: Не хватает файла boost/mpl/apply_if.hpp | 15 янв. 2006 | 13:01 | #12 |
---|
C:\Program Files\CVSNT>cvs -d:pserver::/cvsroot/luabind login
Logging in to :pserver::2401:/cvsroot/luabind
CVS Password:
и что дальше? :(
Проблемы с обменом значений между C/C++ и Lua. | 15 янв. 2006 | 12:57 | #37 |
---|
Усе!!! я разобрался с вопросом 2!! теперь помоги с вопрососм 1!!!
почему стек переполняется что нужно снять? функцию?
Timm
>Эээ.. Хватит мазохизмом занимаццо. Стек Луа - сложная и непонятная вещь, фактически это не стек а двусвязный список, >за ним нужно только так следить.
>Используй tolua - очень простая библиотечка, проще разобраться чем с Luabind, быстрее работает и главное - ничего >руками писать не надо - скармливаешь ему файл с объявлениями классов, функций, переменных - на выходе готовый файл >*.cpp для связки. Если переменные и функции ещё можно как то вручную, но вот с классами разбираццо дооолго...
ладно я пока потихонечку въезжаю, но классы это уже привязка к коду.
я пока могу обмениваться с скриптом большим числом переменных и вызывать функции этого на первых порах достаточно.
я хочу переменные и функции описать в текстовом файле и пусть объект запоминает имена перменных и функция в своих данных и дает это скрипту мы так я делаю независимость от имен осталась реализовать независимость от действий.
Octree дерево в D3DX9 | 15 янв. 2006 | 0:35 | #4 |
---|
Я тебе попозже напишу как сделал(мф же сегодня с тобой в аське говорили?)