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

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

luabind: вызов функции с таблицы31 янв. 200618:54#1
подпишусь
Рендер в текстуру(OpenGL) в glut приложении работает, в своем Win32 нет30 янв. 20062:12#20
Ghost2
слушай ты внимательно смотрел те 2 проекта?
rendertotexture - это glut
TestRenderToTexture - это оконное приложение.
дак вот там все один в один за исключением glutSwapBuffers и SwapBuffers
но я исправил 2 ошибки:
>1. В функции DrawScene не надо вызывать SwapBuffers.
>2. Когда создаешь pbuffer нужно задавать и все его параметры, как для обычного контекста. glViewport, например, должен получить высоту и ширину pbuffer'a, а не основного окна. Делай это >отдельно:
но они не помогли проблеме :(
с остальнымине согласен ведбь в другом проекте работают...
что еще моджет быть не так?
Рендер в текстуру(OpenGL) в glut приложении работает, в своем Win32 нет30 янв. 20060:26#19
Ghost2
>Ну, ошибок много. Перечислю только осноные:
странно там 2 проекта идентичных за исключение что один стартует через glut, другой через оконное приложение.
Ок спасибо тебе :)) я посмотрю что нитак. потом скажу ты непропадай :)
проблемак с отсечением по frustum28 янв. 200613:37#11
-=freeman=-
замени rightPlane, leftPlane  и т.д. на свои переменные.
итого для Direct3D полный код:
float proj[16];//Матрица проекций
  //Узнаем текущую матрицу проекций
  pDevice -> GetTransform(D3DTS_PROJECTION, reinterpret_cast<D3DXMATRIX *>(proj));
float view[16];//Матрица вида
  //Узнаем текущую матрицу вида
  pDevice -> GetTransform(D3DTS_VIEW, reinterpret_cast<D3DXMATRIX *>(view));

  //Извлечение пирамиды видимости
  frustum.ExtractFrustum(proj, view);
для OpenGL полный код:
float proj[16];//Матрица проекций
  //Узнаем текущую матрицу проекций
  glGetFloatv(GL_PROJECTION_MATRIX, proj);
float view[16];//Матрица вида
  //Узнаем текущую матрицу вида
  glGetFloatv(GL_MODELVIEW_MATRIX, view);
  //Извлечение пирамиды видимости
  camera.GetFrustum().ExtractFrustum(proj, view);
Это должно работать.
ты пойми вычисление пирамиды видимости не изменяется, а вот заполнение матриц проекции и видовой которые заполнят API OpenGL и Direct3D будут различны. попробуй так. У меня точно работает и в OpenGL  и в Direct3D.
проблемак с отсечением по frustum28 янв. 200613:37#10
-=freeman=-
смотри при рендере сцены нужно посчитать пирамиду видимости.
Дак вот каждый API OpenGL или Direct3D как тебе и сказали работает с разными ориентациями координат. Для этого
ты давай им 1 и туже матрицу Вида и проекций.
а вычисление ExtractFrustum оставь прежним. Direct3D и OpenGL сами эти матрицы  заполнят как им надо в соответсвии с их настройками и реализацией.
вот мой код реализации выичлсния пирамиды видимости
//Функция расчета пирамиды
	INLINE void ExtractFrustum(const float* proj, const float* modl)
	{
		float clip[16];
		//Впомогательная переменная
		float t;
		//Параметры уравнения плоскости
		float a,b,c,d;
		//Комбинируем матрицы(перемножаем)
		clip[0] = modl[0] * proj[0] + modl[1] * proj[4] + modl[2] * proj[8] + modl[3] * proj[12];
		clip[1] = modl[0] * proj[1] + modl[1] * proj[5] + modl[2] * proj[9] + modl[3] * proj[13];
		clip[2] = modl[0] * proj[2] + modl[1] * proj[6] + modl[2] * proj[10] + modl[3] * proj[14];
		clip[3] = modl[0] * proj[3] + modl[1] * proj[7] + modl[2] * proj[11] + modl[3] * proj[15];
		clip[4] = modl[4] * proj[0] + modl[5] * proj[4] + modl[6] * proj[8] + modl[7] * proj[12];
		clip[5] = modl[4] * proj[1] + modl[5] * proj[5] + modl[6] * proj[9] + modl[7] * proj[13];
		clip[6] = modl[4] * proj[2] + modl[5] * proj[6] + modl[6] * proj[10] + modl[7] * proj[14];
		clip[7] = modl[4] * proj[3] + modl[5] * proj[7] + modl[6] * proj[11] + modl[7] * proj[15];
		clip[8] = modl[8] * proj[0] + modl[9] * proj[4] + modl[10] * proj[8] + modl[11] * proj[12];
		clip[9] = modl[8] * proj[1] + modl[9] * proj[5] + modl[10] * proj[9] + modl[11] * proj[13];
		clip[10] = modl[8] * proj[2] + modl[9] * proj[6] + modl[10] * proj[10] + modl[11] * proj[14];
		clip[11] = modl[8] * proj[3] + modl[9] * proj[7] + modl[10] * proj[11] + modl[11] * proj[15];
		clip[12] = modl[12] * proj[0] + modl[13] * proj[4] + modl[14] * proj[8] + modl[15] * proj[12];
		clip[13] = modl[12] * proj[1] + modl[13] * proj[5] + modl[14] * proj[9] + modl[15] * proj[13];
		clip[14] = modl[12] * proj[2] + modl[13] * proj[6] + modl[14] * proj[10] + modl[15] * proj[14];
		clip[15] = modl[12] * proj[3] + modl[13] * proj[7] + modl[14] * proj[11] + modl[15] * proj[15];
		//Находим A, B, C, D для ПРАВОЙ плоскости
		a = clip[3] - clip[0];
		b = clip[7] - clip[4];
		c = clip[11] - clip[8];
		d = clip[15] - clip[12];
		//Приводим уравнение плоскости к нормальному виду
		t = static_cast<float>(sqrt(a * a + b * b + c * c));
		a /= t;
		b /= t;
		c /= t;
		d /= t;
		//Вычисление правой плоскости отсечения
		rightPlane.computePlane(a, b, c, d);
		//Находим A, B, C, D для ЛЕВОЙ плоскости
		a = clip[3] + clip[0];
		b = clip[7] + clip[4];
		c = clip[11] + clip[8];
		d = clip[15] + clip[12];
		//Приводим уравнение плоскости к нормальному виду
		t = static_cast<float>(sqrt(a * a + b * b + c * c));
		a /= t;
		b /= t;
		c /= t;
		d /= t;
		//Вычисление левой плоскости отсечения
		leftPlane.computePlane(a, b, c, d);
		//Находим A, B, C, D для НИЖНЕЙ плоскости
		a = clip[3] + clip[1];
		b = clip[7] + clip[5];
		c = clip[11] + clip[9];
		d = clip[15] + clip[13];
		//Приводим уравнение плоскости к нормальному
		t = static_cast<float>(sqrt(a * a + b * b + c * c));
		a /= t;
		b /= t;
		c /= t;
		d /= t;
		//Вычисление нижней плоскости отсечения
		topPlane.computePlane(a, b, c, d);
		//ВЕРХНЯЯ плоскость
		a = clip[3] - clip[1];
		b = clip[7] - clip[5];
		c = clip[11] - clip[9];
		d = clip[15] - clip[13];
		//Нормальный вид
		t = static_cast<float>(sqrt(a * a + b * b + c * c));
		a /= t;
		b /= t;
		c /= t;
		d /= t;
		//Вычисление верхней плоскости отсечения
		bottomPlane.computePlane(a, b, c, d);
		//ДАЛЬНЯЯ плоскость
		a = clip[3] - clip[2];
		b = clip[7] - clip[6];
		c = clip[11] - clip[10];
		d = clip[15] - clip[14];
		//Нормальный вид
		t = static_cast<float>(sqrt(a * a + b * b + c * c));
		a /= t;
		b /= t;
		c /= t;
		d /= t;
		//Вычисление дальней плоскости отсечения
		farPlane.computePlane(a, b, c, d);
		//ПЕРЕДНЯЯ плоскость
		a = clip[3] + clip[2];
		b = clip[7] + clip[6];
		c = clip[11] + clip[10];
		d = clip[15] + clip[14];
		//Нормальный вид
		t = static_cast<float>(sqrt(a * a + b * b + c * c));
		a /= t;
		b /= t;
		c /= t;
		d /= t;
		//Вычисление ближней плоскости отсечения
		nearPlane.computePlane(a, b, c, d);
	}
проблемак с отсечением по frustum28 янв. 20069:07#8
-=freeman=-
оставь реализацию ExtractFrustum такую как в NeHe уроке. и сделай что я предложил.
Дело в том что у меня так работает.
Рендер в текстуру(OpenGL) в glut приложении работает, в своем Win32 нет28 янв. 20069:02#15
Ghost2
>Если ничего не поможет сделай два тестовых примера - где работает, а где нет и выложи тут. Будем разбираться по коду
они уже сделаны.
Там меш здоровый на 1 метр с текстурами будет, выкачаешь?
проблемак с отсечением по frustum27 янв. 200622:59#4
-=freeman=-
слушай я в движке использую 2 рендера Direct3D и OpenGL у меня нет таких проблем. Но я использую единую камеру со своем матрицей
а потом преобразую ее к D3DXMATRIX * в случае работы с Direct3D рендером.
при вычислении пирамиды видимости делаю так:
для Direct3D рендера
//отображение сцены
void Direct3DRender::RenderScene(float dt)
{
	float proj[16];//Матрица проекций
	pDevice -> GetTransform(D3DTS_PROJECTION, reinterpret_cast<D3DXMATRIX *>(proj));
	//Извлечение пирамиды видимости
	camera.GetFrustum().ExtractFrustum(proj, camera.GetMatrix());
....
}
для OpenGL рендера:
//Отображения сцены
void OpenGLRender::RenderScene(float dt)
{
....
	float proj[16];//Матрица проекций
	//Узнаем текущую матрицу проекций
	glGetFloatv(GL_PROJECTION_MATRIX, proj);
	//Извлечение пирамиды видимости
	camera.GetFrustum().ExtractFrustum(proj, camera.GetMatrix());
...
}
Вот камера:
class Camera  {
private:
...
	Matrix4x4 Matrix;  //Матрица преобразования камеры
...
public:
//Возвращает матрицу преобразования
	INLINE float *GetMatrix()
	{
		return const_cast<float *>(Matrix.GetMatrix());
	};
Тебе надо давать для обоих API единый буфер равный 16 числам float т.е. 16 * sizeof(float)
а Direct3D и OpenGL сами разберуться кк менять этот буфер. Я думаю проблемв в этом. Но могу ошибаться.
Рендер в текстуру(OpenGL) в glut приложении работает, в своем Win32 нет27 янв. 20061:22#13
Ghost2
>Посмотрел я повнимательнее на две верхние картинки и задался вопросом: а в чем разница?
>разницы нет просто я показал 2 кадра :) мышкой повернул и запечатлил.
>Какие там текст. координаты на чайнике?
а причем тут текстурные координаты? по моему если не ошибаюсь в glut текстурные координаты автоматом генерятся.
на чайнике искаженное изображение получается т.е. текстура сцены.
вот как с этим ращзберусь буду накладывать эту текстуру на плоскость получиться должно зеркало.
что еще не понятно? :)
как лучше рисовать плоский текст в openGL26 янв. 200611:10#6
Illinar
глянул статью мельком неплохая :). Попробую твой подход.
Рендер в текстуру(OpenGL) в glut приложении работает, в своем Win32 нет25 янв. 200623:49#11

Ну и еще раз попытаюсь обратиться к знатокам...
Пиксел vs Пиксель25 янв. 200613:04#58
_Winnie
что только народ не придумает  :)))
пиксель
есть ли аналог auxDIBImageLoad в glut25 янв. 200613:01#1
mynic
>Работаю в СБилдере6
1) очень убогий отстойный компилятор как и толку нет от навороченной тормозной и глюченной среды;
2) скорей всего этот отстой С++ Builder использует другой формат *.lib файлов, поэтому  в каталоге bin найди утилитку *.exe файл(не помню как называется но он точно есть и работает т.к. сам пользовался и все линковалось) который преобразует glaux.lib в тот формат который понимает линковщик дебилдера.
>И если не трудно как заставить работать glaux.h? Вроде стандартная, идет в поставке с билдером, а трансляция не идет.....
что-то не вериться, gluax.lib бибилиотека от Microsoft к тому же еще и глюченная с ошибками.
советую перейти на Visual C++ а для загрузки графических форматов использовать DevIL или еще что нибудь.
вот можешь мою статью почитать:http://www.gamedev.ru/articles/?id=70123

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

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