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

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

Проблема с VBO: неправильное отображение геометрии3 июня 200518:36#4
cppguru
>Ты вполне можешь использовать glInterleaved и VBO одновременно. Так что это будет лишь проще в написании и отладке,
>а функционально эквивалентно.
>Правка: чтобы их заюзать вместе с VBO, нужно загрузить данные (что ты уже сделал) и передать вместо указателя смещение (то есть ноль, видимо).

Так что-то я не пойму как их использовать вместе?
вот так на экране пусто:

glBindBufferARB(GL_ARRAY_BUFFER_ARB, surface -> bufferId);
glInterleavedArrays(GL_T2F_N3F_V3F, 0, surface -> openGLVertices);
glDrawArrays(GL_TRIANGLES, 0, 3 * surface -> numVertices);
вот так все ок естесвенно:
glInterleavedArrays(GL_T2F_N3F_V3F, 0, surface -> openGLVertices);
glDrawArrays(GL_TRIANGLES, 0, 3 * surface -> numVertices);

дак VBO берет из видео память а
glInterleavedArrays из оперативной это же совсем разные вещи как их совместить?

что ты еще по колу можешь сказать гле ошибка?


[/code]

Проблема с VBO: неправильное отображение геометрии3 июня 200518:17#2
cppguru
спасибо  за ответ но не помогло :(
>Во-вторых, это можно было пофиксить и самому, а не создавать две одинаковых (!) ветки на форуме.
извиняюсь торопился  насчет 2 веток насчет постить запутался с адресами :)
>В-третьих, непонятно, почему бы тебе не рендерить через glInteleavedArrays(), как ты это предлагал делать
>(тем более, что это лишь сокращение для длинного и нудного кода, который ты запостил выше):

а что это будет НЕ МЕДЛЕННЕЕ VBO ?????????????????

>В-четвёртых, и самое главное, если ты перейдёшь на optimized triangle strips, ты сможешь в несколько раз ускорить этот рендеринг
GL_TRIANGLE_STRIP?

Проблема с VBO: неправильное отображение геометрии3 июня 200517:53#0
Привет всем!!!
решил разобраться с VBO.

отображается полная лажа.

мешь представлен таким кодом:

//Класс мешь
class Mesh2 {
public:
...
	//вершина для OpenGL
	struct OpenGLVertex {
		//Текстурные координаты
		Vector2D tvert;
		//Нормаль
		Vector3D normal;
		//координаты вершины
		Vector3D vert;
	};
...
//Грань OpenGL
	struct OpenGLVertice {
		OpenGLVertex openGLVertex[3];
	};
...
	//Поверхность
	class Surface {
	public:
		union {
			struct {
				//индекс буфера
				unsigned int bufferId;
				//массив вершин для OpenGL
				OpenGLVertice *openGLVertices;
			};
		...
		};
	//число вершин
	int numVertices;
...
                };
...
};

Каждая поверхность Mesh'а(surface)  проинициализировона таким образом:

...
glGenBuffersARB (1, &surface.bufferId);
//выбрать его
glBindBufferARB(GL_ARRAY_BUFFER_ARB, surface.bufferId);
 //проинициализировать
glBufferDataARB(GL_ARRAY_BUFFER_ARB, 3 * surface.numVertices * sizeof(Mesh2::OpenGLVertex), surface.openGLVertices, GL_STATIC_DRAW_ARB);
...

рендер провожу таким образом :

//Отображение Меша
void DrawOGLMesh(Mesh2 *mesh)
{

	//число поверхностей
	int num = mesh -> GetNumSurface();
	Mesh2::Surface *surface;
...
//цикл по поверхностям
	for(int i = 0; i < num; i++) {
...
//получить поверхность
		surface = &mesh -> GetSurface(i);
...

		//выбрать буфер
		glBindBufferARB(GL_ARRAY_BUFFER_ARB, surface -> bufferId);

		//разрешить вершинный массив
		glEnableClientState(GL_VERTEX_ARRAY);
		//разрешить массив текстурных координат
		glEnableClientState(GL_TEXTURE_COORD_ARRAY);
		//разрешить массив нормалей
		glEnableClientState(GL_NORMAL_ARRAY);
		//указатель на вершины
		glVertexPointer(3, GL_FLOAT, sizeof(Vector2D) + sizeof(Vector3D), (char *)NULL + sizeof(Vector2D) + sizeof(Vector3D));
		//указатель на нормали
		glNormalPointer(GL_FLOAT, sizeof(Vector2D) + sizeof(Vector3D), (char *)NULL + sizeof(Vector2D) + sizeof(Vector3D));
		//указатель на текстурные координаты
		glTexCoordPointer(2, GL_FLOAT, sizeof(Vector2D) + sizeof(Vector3D), NULL);
		//отобразить элементы
		glDrawArrays(GL_TRIANGLES, 0, 3 *  surface -> numVertices);
		glDisableClientState(GL_VERTEX_ARRAY);
		glDisableClientState(GL_TEXTURE_COORD_ARRAY);
		glDisableClientState(GL_NORMAL_ARRAY);
		....
	}
}

на экране получается полная лажа. Есть подозрения что я не правильно ставлю смещения адресов в
glNormalPointer
glVertexPointer
glTexCoordPointer

если проводить редер проводить обычным способом:

glInterleavedArrays(GL_T2F_N3F_V3F, 0, surface -> openGLVertices);
			glDrawArrays(GL_TRIANGLES, 0, 3 * surface -> numVertices);
то все в порядке.

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

Delphi 4k Demo2 июня 200515:03#5
DEN
а вот это заработало..
Delphi 4k Demo2 июня 200514:11#3
XProger
А у меня не запускается :( (Windows 2000) только *.exe  12 кб работает
Строки в С++31 мая 200514:39#12
Neill
тебе только поможет возможно отдельный тест проблемных участков кода в отдельной прграмме...
меня он не раз спасал...
Какая работа для программиста самая высокооплачиваемая?31 мая 200512:45#49
Jakobz
>Но это все не геймдев -> довольно скучно. СУБД, например, ужасно нудная вещь.
да, как ты прав!!!! особенно про СУБД... но системное программирование по моему не скучно...я работаю сам с СУБД  какая скучная лажа :(((
стоит ли покупать эту книгу?(ссылка внутри)31 мая 20059:01#6
All
Всем спасибо за ответы!!!
тема закрыта
стоит ли покупать эту книгу?(ссылка внутри)30 мая 200515:23#2
IvanOFF

а вообще там про OpenGL что-нибудь поновей есть или там только самые основы?

Спасибо за ответ!!!!

Вопрос про бинарный формат30 мая 200512:09#8
Ravager
>ну а как например в *.x файле содержится строка типа normal, vertices при загрузке(в бинарном формате) это ведь как то >распознается где цифра, где заголовок

значит так берешь разрабатываешь свой бинарный формат.
ты сам будешь знать где у тебя строка  - и читать строку где число - читать число.
строку можно писать так:
1) 1 байт пишем длину, последующие байты это строка, берешь читаешь длину а потом строку этой длины.
2) записать в строку нулевой термирующий символ '\0' читать по символу пока не вcтретится '\0'. годится для небольших строк
3) сразу прочитать этак 255 байт строки в память. потом из памяти прочитать строку до нулевого символа и вернутся на позицию равную текущая - (255 - длина прочитанной строки)...

читать числа ты уже умешь.. какие еще проблемы?

Вопрос про бинарный формат30 мая 200510:21#4
Ravager
#include <fstream>
//ofstream находится в namespace std, поэтому подключаем его
using namespace std;

int main()
{
	fstream handler;//лучше fstream он для ввода/вывода
	handler.open("Log.txt", ios_base::binary | ios_base::out);//открыть двоичный файл для вывода
	if (!handler.is_open()) //проверка открытия
		return -1;
	float x=0.04f;
	handler.write((char*)&x, sizeof(float)); //записываем 4 байта этого float
	handler.close();//вот тут обязательно закрыть
	handler.open("Log.txt", ios_base::binary | ios_base::in););//открыть двоичный файл для ввода
	if (!handler.is_open()) //проверка открытия
		return -1;
	handler.read((char*)&x, sizeof(float)); //читаем 4 байта этого float
	return 0;
//здесь handler автоматически закроется...
}
стоит ли покупать эту книгу?(ссылка внутри)30 мая 20059:47#0
Привет всем!
вот ссылка http://www.williamspublishing.com/Books/5-8459-0772-1.html
я вот почитал содержание и подумал что объем довольно большой и материал достойный внимания что на это скажите?
стоит ли ее покупать? есть ли она у кого нибудь?

спасибо всем заранее с Уважением Андрей.

DX9c vs VC627 мая 200513:38#10
WW
ясно у меня стоит 7.0 все собирается... протсо непонятно почему под 6.0 не получается
Direct3D:Компилятор ругается на значения из enum'а27 мая 200511:39#3
keYMax
Все ясно  тема закрыта.
Direct3D:Компилятор ругается на значения из enum'а27 мая 200511:33#2
keYMax
я пробовал убирать
#include<d3dtypes.h>
тоже самое... :(

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

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