LINUX.ORG.RU

OpenGL использование VBO


1

2

Всем привет, пытаюсь использовать OpenGL в MinGW, но почему-то когда я пытаюсь вызвать функцию glGenBuffers(1, &vId); сразу виснет программа, из-за чего это может быть? Компилируется все без ошибок, вылетает именно когда запускаю прогарамму.

class BaseObject : public DummyObject {
private:
	vboVertex*		VertexBuffer;
	vboNormal*		NormalsBuffer;
	vboTexCoord*		TexCoordsBuffer;
	GLuint*			Indices;
...
public:
	void AddVertex(glm::vec3 Vertex, glm::vec3 Normal, glm::vec2 TexCoord) {
		VertexBuffer = (vboVertex*)realloc(VertexBuffer, sizeof(vboVertex)*(vCount+1));
		VertexBuffer[vCount] = {Vertex[0], Vertex[1], Vertex[2]};
		vCount++;
		....
	}
	//
	void AddIndex(GLuint Index) {
		Indices = (GLuint*)realloc(Indices, sizeof(GLuint)*(iCount+1));
		Indices[iCount] = Index;
		iCount++;
	}
}

cpp

void BaseObject::InitVBO() {
	// Vertex Buffer
	glGenBuffersARB(1, &vId); // Вот тут вылетает программа
	glBindBuffer(GL_ARRAY_BUFFER, vId);
	glBufferData(GL_ARRAY_BUFFER, sizeof(GLfloat)*3*vCount, VertexBuffer, GL_STREAM_DRAW);	
	glBindBuffer(GL_ARRAY_BUFFER,0);
	....
};

...

★★★

Последнее исправление: Int64 (всего исправлений: 1)

ARB

ой да ладно :)

OpenGL контекст к этому времени создан? vId обычный GLuint на стеке, так?

OpenGL в MinGW

зачем? под GNU/Linux не канает? нативно не канает?

x0r ★★★★★
()

Поскольку glGenBuffersARB, формально, расширение, то зависит от того, как именно эта функция получена - через обёртку вроде GLEW или напрямую.

quiet_readonly ★★★★
()
Ответ на: комментарий от quiet_readonly

а да, я просто это для проверки, подумал вдруг ARB заработает ))) так у меня там просто glGenBuffers, vId типа GLuint, через обертку GLEW работаю, на прямую почему-то линковщик не видит эти функции вообще. MinGW мне нужен для кросс-компиляции, я использую и MinGW и g++ в Linux

Int64 ★★★
() автор топика
Ответ на: комментарий от Int64

это сто пудов что-то не правильно подключаю к MinGW, компилирую так:

g++ Main.cpp -Wall -lopengl32 -lglu32 -lfreeglut -lglew32.dll -std=gnu++0
x
когда пишу флаг просто -lglew32 тоже не находит функции работы с VBO

Int64 ★★★
() автор топика
Ответ на: комментарий от Eddy_Em

ну да, я через VirtualBox компилю там у меня MinGW стоит и там есть gcc, g++ приложения пор же gcc ) Ладно, в общем разобрался, не в том месте писал glewInit(); хотя пока что работает glGenBuffersб сейчас проверю все остальное )

Int64 ★★★
() автор топика
Ответ на: комментарий от Int64

да да да да!!! все работает, всем большое спасибо )))

Int64 ★★★
() автор топика
Ответ на: комментарий от Eddy_Em

ой не очень, не люблю windows, уже так привык к линуксу, не понимаю теперь как я раньше там работал :)))

Int64 ★★★
() автор топика
Ответ на: комментарий от Int64

man сарказм. Я просто вспоминаю, как лет 12 назад пытался что-то под мастдайкой напрограммировать. Ну и геморройное же это дело!

Eddy_Em ☆☆☆☆☆
()
Ответ на: комментарий от buddhist

вы в Games когда-нибудь заглядывали?

Не очень-то. Разве что пофлудить.

Eddy_Em ☆☆☆☆☆
()
Ответ на: комментарий от Harald

бее, ненавижу Visual C++ глючный какой-то и платный, да и мне кроме создание окна ничего больше и не нужны от WinAPI ) я даже им и не пользуюсь, использую glut

Int64 ★★★
() автор топика

После инициализации окна нужно вызвать:

glewInit();
В windows эти функции подгружаются динамически, в линуксе можно обойтись и без glewInit(); (но для кросс-платформенности лучше чтобы оно было)

blinkenlichten
()
Ответ на: комментарий от blinkenlichten

ага спасибо, я уже разобрался :)

Int64 ★★★
() автор топика
Ответ на: комментарий от Int64

на прямую почему-то линковщик не видит эти функции вообще.

Потому, что в WinAPI OpenGL заголовочники только для версии OpenGL 1.1 а дальше появился Direct3D и M$ посчитала что OpenGL нинужен.

Kosyak ★★★★
()
Ответ на: комментарий от Eddy_Em

Используют прслойку - glew. В ней есть заголовочники для всех современных версий opengl есть. А как она их линкует к настоящей OpenGL-библиотеке драйвера я не знаю, скорее всего dlopen/dlsym какой-нибудь....

Kosyak ★★★★
()
Ответ на: комментарий от Kosyak

Актульные хедеры лежат на opengl.org, а адреса функций получают в рантайме через «опенглный» dlsym (wglGetProcAddress/glXGetProcAddress). Только в винде в отличие от линукса вызов этой функции привязан к контексту, и чтобы создать контекст без легаси функционала нужно выполнять какие-то неадекватные действия.

oh-la-la
()
Ответ на: комментарий от andreyu

GLuid, я уже решил проблему, читай выше, там нужно было glewInit() дописать

Int64 ★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.