Программирование игр, создание игрового движка, OpenGL, DirectX, физика, форум
GameDev.ru / Программирование / Форум / Где скачать последнюю версию OpenGL? (комментарии) (3 стр)

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

Страницы: 1 2 3 4 Следующая »
cNoNimУчастникwww30 мар. 201215:47#30
gkv311
> Это был ответ на оба вопроса
у тебя был не ответ а вопрос )))
19thПостоялецwww30 мар. 201217:58#31
cNoNim, можешь поподробней про всю эту систему взаимодействий (в винде) драйвер, opengl32.dll, opengl32.lib, gl.h, компилятор, линкер?

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

19thПостоялецwww30 мар. 201217:59#32
cNoNim
> gkv311
> > Это был ответ на оба вопроса
> у тебя был не ответ а вопрос )))
верное замечание!!!
19thПостоялецwww30 мар. 201218:51#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 ?

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

ExecutorУдалёнwww30 мар. 201220:54#34
19th
> То есть получается, что файл GL.H вообще не нужен компилятору если вместо констант числа писать?

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

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

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

innuendoПостоялецwww30 мар. 201223:00#35
eugene2kПостоялецwww30 мар. 201223:16#36
libGL.so либо идет в составе проприетарных дров, либо в случае опенсорсных дров в составе Mesa/DRM стека. В последнем случае можно собрать и libGL.a
San4esПостоялецwww21 окт. 201418:14#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)

ValorinПостоялецwww21 окт. 201420:11#38
San4es
> Для того чтобы использовать новый функционал OpenGL
San4es
> OpenGL 1.3

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

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

DenadanПостоялецwww21 окт. 201420:17#39
P.S. И да, лопату этому человеку!

мне что-то подсказывает, что у него есть своя
San4esПостоялецwww22 окт. 201413:16#40
Valorin
OpenGL 1.3 и выше. Это и есть новый функционал
ValorinПостоялецwww22 окт. 201414:08#41
San4es
ну смотря с какого года смотреть)
nonamezeroxПостоялецwww23 окт. 20147:29#42
А еще для совсем-совсем ленивых, которым впадлу ручками набирать простыню импорта функций есть библиотека GLEW, которая грузит расширения и core-функциональность OpenGL > 1.2 автоматом.
Iron ManПостоялецwww24 окт. 201414:14#43
Зачем вообще мучаться, когда всё свежее и необходимое есть на сайте http://glew.sourceforge.net
#include "GL\glew.h"
#include "GL\wglew.h"
включает в себя и gl.h, и glu.h
KokosSPbПостоялецwww24 апр. 201510:30#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. Если знаете хорошие книги или ресурсы, буду очень рад.

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

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

/ Форум / Программирование игр / Графика

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

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