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

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

Странная проблема со смешанными массивами(glInterleavedArrays) в OpenGL25 июля 200519:57#0
Привет всем!!!! Возникла странная проблема.
итак имеем массив векторов(не обращайте внимание на имена переменных в инициализации массива это все Vector3D):
    Vector3D array[] = {    minPoint, Vector3D(minPoint.x, maxPoint.y, minPoint.z),
                            front[1],front[2],
                            front[2], front[3],front[3], front[0],
                            back[0], back[1], back[1], back[2],
                            back[2], back[3], back[3], back[0],
                            left[0], left[1], left[1], left[2],
                            left[2], left[3], left[3], left[0],
                            right[0], right[1], right[1], right[2],
                            right[2], right[3], right[3], right[0],
                            top[0], top[1], top[1], top[2],
                            top[2], top[3], top[3], top[0],
                            bottom[0], bottom[1], bottom[1], bottom[2],
                            bottom[2], bottom[3], bottom[3], bottom[0]
если рисуем это вот так:
    glBegin(GL_LINES);
        glVertex3fv(&array[0][0]);
        glVertex3fv(&array[1][0]);
        glVertex3fv(&array[2][0]);
        glVertex3fv(&array[3][0]);
        glVertex3fv(&array[4][0]);
        glVertex3fv(&array[5][0]);
        glVertex3fv(&array[6][0]);
        glVertex3fv(&array[7][0]);
    ...
        glVertex3fv(&array[40][0]);
        glVertex3fv(&array[41][0]);
        glVertex3fv(&array[42][0]);
        glVertex3fv(&array[43][0]);
        glVertex3fv(&array[44][0]);
        glVertex3fv(&array[45][0]);
        glVertex3fv(&array[46][0]);
        glVertex3fv(&array[47][0]);
    glEnd();
то все ок.
если ривуем это вот так:
    //установить смешанный массив
    glInterleavedArrays(GL_V3F, 0, array);
    //отобразить count элементов
    glDrawArrays(GL_LINES, 0, 24); //пробовал ставить 2 - т.е. 2 вершины для 1 линии
получается полная лажа!!!!!!!!!!!! не могу понять в чем проблема :(
что это может быть?
Спасибо всем зарагнее. С уважением Андрей.
Rag doll. (Комментарии к статье)14 июля 200518:34#14
resurected_timofei2
Отлмичная статья я вчера целый час любовался!!!!
Очень Красивый Дельфи!11 июля 200518:19#3711
Delphi - полный отсотой!!!!!!!!!!
и хватит спорить
Введение в физическую библиотеку Tokamak (Комментарии к статье)27 июня 200511:47#34
maths_fan
Молодец спасибо за, татью!
побольше бы женского пола в решении нетривиальных прикладных задач!!
E3. 2005. (Комментарии к статье)27 июня 200511:40#28
wat
Отличная познавательная статья...
Я прямо грустно замечтался...
Direct3D: Рендер через VB неправильный, а через DrawPrivitiveUp все ок24 июня 200512:12#17
all
все спасибо была глупая ошибка:
вместо:
hr = pDevice -> SetStreamSource(0, static_cast<Direct3DVertexBuffer *>(surface -> GetVertexBuffer()) -> GetBuffer(), 0, sizeof(Mesh::Direct3DVertice));

надо:
hr = pDevice -> SetStreamSource(0, static_cast<Direct3DVertexBuffer *>(surface -> GetVertexBuffer()) -> GetBuffer(), 0, sizeof(Mesh::Direct3DVertex));
[/code]
Тема закрыта
Direct3D: Рендер через VB неправильный, а через DrawPrivitiveUp все ок17 июня 20058:11#14
Привет всем опять неужели нет специалистов по Direct3D ?????
посмотрите пожалуйста посты...
спасибо заранее с уважением Андрей
Direct3D: Рендер через VB неправильный, а через DrawPrivitiveUp все ок11 июня 20059:29#13
Altair
>К слову, GetNumVertices возвращает количество треугольников, вроде.. Так что, имхо, ничего делить не надо.
да ты прав я коментарий написал не правильно...

Zazzy,
Altair,
stepan_win,
Извиняюсь за НЕПРАВИЛЬНЫЙ КОМЕНТАРИЙ!!!!:)))))
я все испраивил в первом посте.
вот эта конструкция возвращает число полигонов(граней)

surface -> GetNumVertices();
еще 1 особенность если написать чтобы рендерилось всегда 76 оплигонов то все правильно работает,
но естественно не все выводится но похоже на правду.
pDevice -> DrawPrimitive(D3DPT_TRIANGLELIST, 0, 76);
76 я взял т.к. наменьшее число полигонов  принадлежаших какому-то материалу(т.к. есть сортирорвка по материалам)
из наборов поверхеностей(surface) всего Mesh'а.
Еще я подумал что у меня в какой-то поверхности содержится слишком большое число полигонов, а метод
DrawPrimitive судя по DirectX 9.0 SDK
может рендерить ограниченно число примитивов, сколько конкретно  это проверил таким способом:
D3DCAPS9 pCaps;
memset(&pCaps, 0, sizeof(pCaps));
pDevice -> GetDeviceCaps(&pCaps);
тогда в перемнной pCaps я увидел
что pСaps.MaxPrimitiveCount = 6555
у меня в меше максимальое  полигонов в 1 из поверхностей(набор полигонов принадлежащих какому-то материалу) = 1114!!!
т.е.  у меня значит все правильно.
Еще 1 особенность поставив правильное число полигонов для рендера:
hr = pDevice -> DrawPrimitive(D3DPT_TRIANGLELIST, 0, surface -> GetNumVertices());

на 1 из машин: Windows XP Radeon 9200SE ОС ушла в перезагрузку!!!
на другой Windows 2000 GeForce FX 5200 вообще на экране пусто!!!

all
что вы теперь на это скажите?
Прощу помощи не знаю как дальше быть
спасибо всем заранее.
С уважением Андрей

Правка: граматика, переменная

Правка: 11 июня 2005 9:30

Direct3D: Рендер через VB неправильный, а через DrawPrivitiveUp все ок10 июня 200511:11#8
Zazzy
не помогает, буду разбиратся... спасибо большое!!!!
Direct3D: Рендер через VB неправильный, а через DrawPrivitiveUp все ок10 июня 200510:55#6
Zazzy
>Хм-м. А что у тебя "хрезалты" возвращают?
выдают S_OK т.е. все нормально...
>И что, при "pDevice -> DrawPrimitive(D3DPT_TRIANGLELIST, 0, 1); " на екране не пусто было, если не считать один полигон?
была какая-то фигня пару полигонов...
Direct3D: Рендер через VB неправильный, а через DrawPrivitiveUp все ок10 июня 200510:42#4
Zazzy
ставлю так вообще на экране пусто :(
pDevice -> DrawPrimitive(D3DPT_TRIANGLELIST, 0, surface -> GetNumVertices() );
 
Direct3D: Рендер через VB неправильный, а через DrawPrivitiveUp все ок10 июня 200510:24#2
Zazzy
т.е. не правильное число полигонов?
Direct3D: Рендер через VB неправильный, а через DrawPrivitiveUp все ок10 июня 200510:02#0
Привет всем!!!

создаю вершинный буйфер как обычно вот код:
код Mesh'а

//Класс мешь
class Mesh {
public:
...
//вершина для Direct3D
	struct Direct3DVertex {
		//координаты вершины
		Vector3D vert;
		//Нормаль
		Vector3D normal;
		//Текстурные координаты
		Vector2D tvert;
	};
//грань
struct Direct3DVertice {
		Direct3DVertex direct3DVertex[3];
	};
};
//Поверхность
	class Surface {
	private:
		//вертексный буффер
		VertexBuffer *vertexBuffer;
		//указатель на массив полигонов
		void *vertices;
//число полигонов
		int numVertices;
...
public:
//число вершин
//установка числа полигонов
		void SetNumberVertices(int number)
		{
			numVertices = number;
		}
		//возврат указателя на полигоны
		inline void *GetVertices() const
		{
			return vertices;
		}
};

вод код создания:

//память под грани
	vertices = new Mesh::Dirct3DVertice[surface.GetNumVertices()];
//тут идет заполнение данными
//созждать вершинный буфер
			CreateVertexBuffer(buffer, surface.GetVertices(),  3 * surface.GetNumVertices() * sizeof(Mesh::Direct3DVertex));
			//сохранить указатель
			surface.SetVertexBuffer(buffer);
...
//создание вертексного буффера
void CreateVertexBuffer(VertexBuffer *&buffer, void *vertices, int size) const
{
	if (!size)
		return;
	//указатель на вершинный буфер Direct3D
	IDirect3DVertexBuffer9 *buf = NULL;
	//создать новый буфер
	buffer = new Direct3DVertexBuffer;
	if (!buffer)
		return;
	//массив полигонов
	void *faces = NULL;
	//создание
	HRESULT hr = pDevice -> CreateVertexBuffer(size,
	0, D3DFVF_XYZ | D3DFVF_NORMAL | D3DFVF_TEX1, D3DPOOL_DEFAULT, &buf, 0);
	if (hr != S_OK) {
		application.GetConsole().AddMessage(Console::ERROR_MESSAGE,
		"Ошибка при создании вертексного буффера: %s%s", DXGetErrorString9(hr), "\n");
		return;
	}
	if (!buf)
		return;
	//захват
	buf -> Lock(0, size, &faces, 0);
	//копирование данных
	memcpy(faces, vertices, size);
	//разблокировка
	buf -> Unlock();
	//установить вертексный буфер
	static_cast<Direct3DVertexBuffer *>(buffer) -> SetVertexBuffer(buf);
}
класс Direct3DVertexBuffer имеет вот такой интерфейс:
//вершинный буфер для API Direct3D
class Direct3DVertexBuffer : public VertexBuffer {
private:
	//вертексный буфер
	IDirect3DVertexBuffer9 *buffer;
public:
	//установка указателя на вершинный буфер
	void SetVertexBuffer(IDirect3DVertexBuffer9* vb)
	{
		buffer = vb;
	}
	//возврат ссылки на вершинный буфер
	IDirect3DVertexBuffer9 *GetBuffer() const
	{
		return buffer;
	}
	Direct3DVertexBuffer() : buffer(NULL) {}
	virtual ~Direct3DVertexBuffer(){}
};
класс VertexBuffer пустой, используется как интерфейс.

вот вывод:

//Отображение Меша
void Direct3DRender::DrawMesh(Mesh *mesh)
{
	int num = mesh -> GetNumSurface();
...
	Mesh::Surface *surface;
	//установка формата вершин
	HRESULT hr = pDevice -> SetFVF(D3DFVF_XYZ | D3DFVF_NORMAL | D3DFVF_TEX1);
	for(int i = 0; i < num; i++) {
	//получить поверхность
	surface = &mesh -> GetSurface(i);
//..установка материалов
	}
	hr = pDevice -> SetStreamSource(0, static_cast<Direct3DVertexBuffer *>(surface -> GetVertexBuffer()) -> GetBuffer(), 0, sizeof(Mesh::Direct3DVertice));
	hr = pDevice -> DrawPrimitive(D3DPT_TRIANGLELIST, 0, 1);
...
	}
}

короче выдается полная лажа...
но если делать вот так:
...
hr = pDevice -> DrawPrimitiveUP(D3DPT_TRIANGLELIST, surface -> GetNumVertices(), reinterpret_cast<Mesh::Direct3DVertice* >(surface -> GetVertices()), sizeof(Mesh::Direct3DVertex));
..

то все прекрасно рендерится...

что я делаю не так?
Спасибо всем заранее.
С уважением Андрей.

Правка: 11 июня 2005 9:08

Проблема с VBO: неправильное отображение геометрии4 июня 200516:12#8
cppguru
Ghost3
Спасибо за ответы!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

у меня все заработало!!!!!!!!!!!!!!

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

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