Войти
ПрограммированиеФорумГрафика

Где скачать последнюю версию OpenGL? (комментарии) (3 стр)

Страницы: 1 2 3 4 Следующая »
#30

gkv311
> Это был ответ на оба вопроса
у тебя был не ответ а вопрос )))

30 мар. 2012

#31

cNoNim, можешь поподробней про всю эту систему взаимодействий (в винде) драйвер, opengl32.dll, opengl32.lib, gl.h, компилятор, линкер?

"хидеры по сути то вообще не нужны компилятору, если все в ручную писать )))" - а это как?

30 мар. 2012

#32

cNoNim
> gkv311
> > Это был ответ на оба вопроса
> у тебя был не ответ а вопрос )))
верное замечание!!!

30 мар. 2012

#33

правильно ли я понимаю:
1- Windows:
в system32 есть opengl32.dll от Microsoft.
при смене видеокарты и/или ее драйвера opengl32.dll НЕ меняется/обновляется.
но тогда напрашивается вывод, что в opengl32.dll НЕТ самого OpenGL API, а данная библиотека просто перенаправляет вызовы к драйверу видеокарты.
а насколько я знаю opengl32.lib необходима для линковки с opengl32.dll и  генерируется на ее (opengl32.dll) основе.
в таком случае при переходе на новую версию OpenGL, нужно только поменять видеокарту, поддерживающую новый API, соответственно драйвер и дописать в GL/gl.h новые прототипы функций и макросы.

2- Linux:
все также как в винде, но opengl32.so идет вместе с драйвером от AMD/NVIDIA.
вот только откуда идет opengl32.a и каким боком там работает Mesa3D/Gallium3D ?

Думается мне, что понимаю я все это не правильно... но ооочень хочется разобрать раз и навсегда как все это работает!

30 мар. 2012

#34

19th
> То есть получается, что файл GL.H вообще не нужен компилятору если вместо констант числа писать?

Никто тебе не мешает написать свой хидер. Я например хидер генерирую напрямую из .spec файлов.
opengl32.lib нужен больше для того, чтобы юзать всякие wgl функции, типа wglGetProcAddress(). Конечно же никто тебе при этом не мешает обойтись без lib и делать LoadLibrary для opengl32.dll и получать нужные wgl функции через GetProcAddress().

> правильно ли я понимаю:
> 1- Windows:

Да.
Насчёт Linux'а не скажу.

30 мар. 2012

#35

http://msdn.microsoft.com/en-us/library/ff568203(v=VS.85).aspx

30 мар. 2012

#36

libGL.so либо идет в составе проприетарных дров, либо в случае опенсорсных дров в составе Mesa/DRM стека. В последнем случае можно собрать и libGL.a

30 мар. 2012

Прошло более 2 лет
#37

В использовании OpenGL 1.3 и выше под Windows в VisualStudio может быть ппц путаница. Ибо все как то нелогично (нету либок, а хедер glext.h нужно качать отсюда https://www.opengl.org/registry/ или набивать ручками)
Короче, начнем
Для того чтобы использовать новый функционал OpenGL надо:
1) поставить драйвера OpenGL к твоей видеокарте (чтобы можно было юзать новые функции, чтобы работал wglGetProcAddress об этом ниже)
2) Visual Studio поддерживает только OpenGL 1.2, т.е. там есть только gl.h, glu.h и opengl32.lib (который по сути импортирует функции из opengl32.dll, которая находится уже в системе Windows наравне с kernel32.dll ) В случае gl.h и opengl32.lib происходит т.н. статическая линковка
3) Система Windows умеет своим API динамически линковать, т.е импортировать функции прямо во время выполнения программы!
Делается это функцией GetProcAddress, которая возвращает указатель на функцию а принимает Handle (тоже виндовая фишка, целое число, идентификатор чего-либо в винде) dll'ки (которая подгружается к твоей программе если вначале вызвать функцию LoadLibrary) и текстовую строку с названием функции.
Винда так устроена, что к примеру вместо LoadLibrary можно вызвать любую другую функцию, подгружающую модуль к вашей программе (подозреваю что так можно даже подгрузить COM компонеты)
А вместо GetProcAddress можно вызывать любую другую функцию возвращающую указатель на ту функцию которую хотим "импортировать"
Одна из таких - wglGetProcAddress, это тоже WinAPI'шная, она принимает только текстовую строку, ей даже не надо хендл на подгружаемый модуль!
В описании написано: The wglGetProcAddress function returns the address of an OpenGL extension function for use with the current OpenGL rendering context.
4) То есть "всего лишь навсего" надо:
-поставить дрова OpenGL на конкретную видео карту
-подключить инклуд glext.h
-написать лабуду типа PFNGLBUFFERDATAPROC glBufferData; в глобальной области видимости, обычно сразу после подключения инклуда.
Эта лабуда означает объявление указателя glBufferData типа PFNGLBUFFERDATAPROC на стеке, поэтому эта лабуда должна быть в *.cpp
Лабуду смотреть в glext.h Вот это PFNGLBUFFERDATAPROC - это тип указателя на функцию, аргументы и возвращаемое значение которого совпадает с функцией glBufferData в спецификации OpenGL. А у тебя glBufferData это будет указатель на функцию. Разницы нет, так как синтаксис использования абсолютно одинаковый. Единственное - это то что если например сделаешь вот так glBufferData(GL_ARRAY_BUFFER, sizeof(data), data, GL_STATIC_DRAW); а сам указатель glBufferData будет равняться какому-нибудь мусору, то вылезет какой нибудь seg fault или violation во время выполнения, поэтому до начала надо инициализировать указатель:
-инициализировать указатель glBufferData строчкой
glBufferData = (PFNGLACTIVETEXTUREARBPROC)wglGetProcAddress("glBufferDataARB");
Видишь в wglGetProcAddress передаем строчку glBufferDataARB. Просто возможно в системе искомая функция называется с окончанием ARB, как бы говоря нам, что это расширенная функция из OpenGL 1.5
Надо после этой строчки проверить указатель glBufferData, он не должен равняться нулю (nullptr)
Если нулю равняется, то либо wglGetProcAddress сфейлила, либо скорее всего функции glBufferDataARB нету в "current rendering context".
Можно попробовать убрать ARB
http://msdn.microsoft.com/ru-ru/library/windows/desktop/dd374386(v=vs.85).aspx - описание wglGetProcAddress
юзать можно, как только указатель после вызова wglGetProcAddress будет ненулевым

Я бы сделал такую приблуду:

glExtInit.h:

#ifndef GLEXTINIT_H
#define GLEXTINIT_H

#include <Windows.h>
#include <gl\GL.h>
#include <gl\GLU.h>
#include "GL\glext.h"


// GL_VERSION_1.5
extern PFNGLGENBUFFERSPROC glGenBuffers;
extern PFNGLBINDBUFFERPROC glBindBuffer;
extern PFNGLBUFFERDATAPROC glBufferData;

extern bool InitGLExt_15(void);
// end of GL_VERSION_1.5

#endif

glExtInit.cpp:

#include "glExtInit.h"

PFNGLGENBUFFERSPROC glGenBuffers;
PFNGLBINDBUFFERPROC glBindBuffer;
PFNGLBUFFERDATAPROC glBufferData;

bool InitGLExt_15(void)
{
  glGenBuffers = ( PFNGLGENBUFFERSPROC )wglGetProcAddress( "glGenBuffers" );
        // проверка glGenBuffers и если ноль то return false;
  return true;
}

Вызывать InitGLExt_15() надо только после инициализации контекста OpenGL (куда будет "рисоваться" OpenGL)

21 окт. 2014

#38

San4es
> Для того чтобы использовать новый функционал OpenGL
San4es
> OpenGL 1.3

Вот это никак не стыкуется =)

P.S. И да, лопату этому человеку!

21 окт. 2014

#39
P.S. И да, лопату этому человеку!

мне что-то подсказывает, что у него есть своя

21 окт. 2014

#40

Valorin
OpenGL 1.3 и выше. Это и есть новый функционал

22 окт. 2014

#41

San4es
ну смотря с какого года смотреть)

22 окт. 2014

#42

А еще для совсем-совсем ленивых, которым впадлу ручками набирать простыню импорта функций есть библиотека GLEW, которая грузит расширения и core-функциональность OpenGL > 1.2 автоматом.

23 окт. 2014

#43

Зачем вообще мучаться, когда всё свежее и необходимое есть на сайте http://glew.sourceforge.net

#include "GL\glew.h"
#include "GL\wglew.h"
включает в себя и gl.h, и glu.h

24 окт. 2014

Прошло более 6 месяцев
#44

Всем привет. Перечитал всё по нескольку раз, но так ничего и не понял. Отсюда сформировались вопросы. Использую MSVS (2008 и 2012) и пример из книжки Сморкалова Андрея "OpenGL. Шейдеры"
Вопросы следующие:
1. glGetString(GL_EXTENSIONS) - получает список всех доступных расширений, которые позволяет видеокарта? драйвер видеокарты? система? (Не смейтесь над формулировкой, думаю вы поняли меня)
2. Если это список расширений которые не просто позволяет видеокарта, а уже поставлены с драйвером в систему - то как их использовать, через wglGetProcAddress?
3. Что делать со структурами? В частности "GLhandleARB shader", такого типа нету без подключения "glext.h". "glext.h" - взял с http://www.opengl.org/registry/#headers
4. При подключении "glext.h" код всё-равно не компилится "error C3861: glShaderSourceARB: идентификатор не найден". Если лечить через glExtInit.h, то откуда брать (как формировать эту простынь)?
Объясните пожалуйста.
Просто даже не начать изучать шейдеры, простейшие примеры не работают.
P.S. Если знаете хорошие книги или ресурсы, буду очень рад.

Спасибо всем кто ответит

24 апр. 2015

Страницы: 1 2 3 4 Следующая »
ПрограммированиеФорумГрафика

Тема в архиве.