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

glut и Blitz3D

Страницы: 1 2 Следующая »
#0
9:57, 7 апр. 2010

Приветсвую уважаемых и доброго времени.
поскольку проблема касается всёж таки графики, создал тему тут.
описываю проблему:
про блиц тут все знают. давно уже к нему прикрутили такую штуку как OpenGL, через файл decls.  про его возможности говорить пока не будем - есть cg от nvidia, которая явно повышает смотрибильность и вообще расширяет возможности (последний тулкит с поддержкой OpenGL3.0 если не ошибаюсь и директа 10го). суть проблемы в том, что в блице никак не получается инициировать полноэкранный режим. гугл не помог, родной сайт разраба тоже. сейчас испытываю попытку написания мелкого врапера для glut`а, т.к, через него вроде как проще, с одной стороны переключится на полный экран, с другой тсороны задачка пока не решена. есть ещё вариант с контекстами, типа:

Global hRC      ; The OpenGL RenderContext
Global hMainDC    ; render window's  Device context
Global  bbHwnd    ; Windows handle.
Global GlWinW=800
Global GlWinH=600

AppTitle title$
Graphics3D GlWinW,GlWinH,32,2

frame=CreateTimer(60)
bbHwnd=ogld_GetWindow() ;

If bbHwnd Then

  pf.ogld_PixelFormat=ogld_MakeDefaultPixelFormat()

  hMainDC = ogld_SetUp_OpenGL(bbHwnd,pf)

  If Not hMainDC Then RuntimeError "Could not initialize OpenGl"

  ResizeViewport GlWinW, GlWinH
  initGL
Else
  RuntimeError "Could not get a handle to the Blitz window"

EndIf
но в этом случае для полноэкранного режима вероятно, как я понял, нужно использовать такие функции, как ChangeDisplaySetting и подобные. но тут где то вычитал, что это старинный метод, от которого нужно отказыватся. Был ещё вариант использовать библиотеку SDL, но тут ещё хуже...
значит вот, функция glutDisplayFunc(func) я так понял, что она берёт адрес функции, в которой по сути кусок рендера или он весь. если глянуть на пример от нвидии, то там в функции display создают viewport или его подобие, применяют профили cg и прочая мелоч. собственно рисование шейдеров и "треугольников" происходит в другой функции. для того, чтобы применить полноэкранный режим, я так понял, нужно применить и эту функции glutDisplayFunc. но блиц3д ни в какую не желает передавать адреса функций, походу он вообще такое делать не умеет, сылаясь на ошибку memory access violation. может есть какой то способ, может уже решал кто-то подобную проблему, подскажите, что тут можно сделать. заранее благодарен!


#1
10:11, 7 апр. 2010

RazD0R
> нужно использовать такие функции, как ChangeDisplaySetting и подобные.

Да...

> но тут где то вычитал, что это старинный метод, от которого нужно отказыватся.

Бред...

#2
10:37, 7 апр. 2010
Да...

вот тут тоже не совсем понятно, т.к. функция эта среди параметров имеет указатель на структуру DevMode. какой функцией и как правильно заполнить эту структуру, учитыая то, что там в структуре есть лишние записи для всяких принтеров?!
т.е. вероятно, нужно заполнить структуру DevMode, а потом уже вызывать ChangeDisplaySetting, так?
Бред...

спорить не буду, может быть и так, однако среди местных "уроков" видел подобные высказывания, то это старый метод и ну его куда подальше:)
#3
11:15, 7 апр. 2010

RazD0R
> вот тут тоже не совсем понятно, т.к. функция эта среди параметров имеет
> указатель на структуру DevMode. какой функцией и как правильно заполнить эту
> структуру, учитыая то, что там в структуре есть лишние записи для всяких
> принтеров?!
> т.е. вероятно, нужно заполнить структуру DevMode, а потом уже вызывать
> ChangeDisplaySetting, так?

Очищаешь структуру нулями, потом заполняешь нужную часть, например так:

    DEVMODE dm;
    memset(&dm, 0, sizeof(dm));
    dm.dmSize = sizeof(dm);
    dm.dmPelsWidth = 1920;
    dm.dmPelsHeight = 1080;
    dm.dmBitsPerPel = 32;
    dm.dmDisplayFrequency = 60;
    dm.dmFields = DM_PELSWIDTH | DM_PELSHEIGHT | DM_BITSPERPEL | DM_DISPLAYFREQUENCY;

> однако среди местных "уроков" видел подобные высказывания, то это старый метод и ну его куда подальше:)

Конкретно где?

#4
11:41, 7 апр. 2010

>>но блиц3д ни в какую не желает передавать адреса функций, походу он вообще такое делать не умеет
Ты бы для начала почитал что такое Blitz3D и что он умеет, а главное для чего предназначен :-D

ЗЫ
Много видел извращений с блицем, но такое первый раз :)))

#5
12:15, 7 апр. 2010

Hartmann, я знаю что такое блиц и не первый день его курю. ваш стёб напрасен...
про старый метод я немного ошибся - там речь шла о создании контекста старым способом:
http://www.gamedev.ru/code/tip/opengl3context
собственно, полноэкранный режим включается, но он тут же вырубается:

BBDECL void BBCALL wrapChangeDisplaySettings(int fields, int width, int height, char bpp, int flag)

{
  DEVMODE dmScreenSettings;
  memset(&dmScreenSettings, 0, sizeof(DEVMODE));
  dmScreenSettings.dmSize      = sizeof(DEVMODE);
  dmScreenSettings.dmPelsWidth  = width;
  dmScreenSettings.dmPelsHeight  = height;
  dmScreenSettings.dmFields    = fields;
  dmScreenSettings.dmBitsPerPel  = bpp;

  ChangeDisplaySettings(&dmScreenSettings, flag);
}

и то что на блице:

Const DM_COPIES        =$00000100
Const DM_DEFAULTSOURCE    =$00000200
Const DM_PRINTQUALITY       =$00000400
Const DM_COLOR              =$00000800
Const DM_DUPLEX             =$00001000
Const DM_YRESOLUTION        =$00002000
Const DM_TTOPTION           =$00004000
Const DM_COLLATE            =$00008000
Const DM_FORMNAME           =$00010000
Const DM_LOGPIXELS          =$00020000
Const DM_BITSPERPEL         =$00040000
Const DM_PELSWIDTH          =$00080000
Const DM_PELSHEIGHT         =$00100000
Const DM_DISPLAYFLAGS       =$00200000
Const DM_DISPLAYFREQUENCY   =$00400000
Const CDS_FULLSCREEN    =$00000004

Global hRC      ; The OpenGL RenderContext
Global hMainDC    ; render window's  Device context
Global  bbHwnd    ; Windows handle.
Global GlWinW=1280
Global GlWinH=720
Global xrot#
Global yrot#
Global xspeed# ;=.1
Global yspeed# ;=.2
; CG Vars to hold info
Global CGcontext,profile,vprogram
Global light,modelviewproj,modelviewit
Global teapotList


AppTitle title$
Graphics GlWinW,GlWinH,32,2
AppTitle title$
wrapChangeDisplaySettings(DM_BITSPERPEL,GlWinW,GlWinH,32,CDS_FULLSCREEN)
frame=CreateTimer(60)
bbHwnd=ogld_GetWindow() ;

If bbHwnd Then

  pf.ogld_PixelFormat=ogld_MakeDefaultPixelFormat()

  hMainDC = ogld_SetUp_OpenGL(bbHwnd,pf)

  If Not hMainDC Then RuntimeError "Could not initialize OpenGl"

  ResizeViewport GlWinW, GlWinH
  initGL
Else
  RuntimeError "Could not get a handle to the Blitz window"

EndIf
удаление строчки с Graphics bla bla bla не помогает, т.е. результат тот же, включается на весь экран, а потом назад в окошко. подозреваю ошибку с моей стороны...

#6
14:59, 7 апр. 2010

RazD0R
про блиц тут все знают. давно уже к нему прикрутили такую штуку как OpenGL, через файл decls.  про его возможности говорить пока не будем

Я давно юзаю Blitz3D SDK для СПП и читал что к нему умельцы разные дллки цепляют для разширения функционала, но впервые слышу  про подключение ОГЛ, и главное не могу понять зачем, чтоб шейдеры использовать?!
Он написан на ДХ7 и шейдеры не поддерживаются
Кинь ссылочку на имеющуюся информацию

#7
15:13, 7 апр. 2010

RazD0R
В битсы пиши соответственно DM_PELSWIDTH | DM_PELSHEIGHT | DM_BITSPERPEL | DM_DISPLAYFREQUENCY, смотря что юзаешь...
Ты пытаешься задать высоту и ширину, а в битсах ничего не выставил кроме бпп...

#8
15:55, 7 апр. 2010

sergant, я качал архив года три примерно назад, может 4, с блиц пп ру. щас той темы там нет, как и архива, но он есть у меня. это не местный архивчик в котором есть все либы, деклсы, инклуд файлы и есть несколько примеров, как на просто ОГЛ так и с нвидиа ЦГ. последний как раз юзает шейдеры, но в качестве примера очень простой файлик с шейдером:

// define inputs from application
struct appin
{
    float4 Position     : POSITION;
    float4 Normal       : NORMAL;
};

// define outputs from vertex shader
struct vertout
{
    float4 HPosition    : POSITION;
    float4 Color0       : COLOR0;
};

vertout main(appin IN,
             uniform float4x4 ModelViewProj,
             uniform float4x4 ModelViewIT,
             uniform float4 LightVec)
{
    vertout OUT;

    // transform vertex position into homogenous clip-space
    OUT.HPosition = mul(ModelViewProj, IN.Position);

    // transform normal from model-space to view-space
    float3 normalVec = normalize(mul(ModelViewIT, IN.Normal).xyz);

    // store normalized light vector
    float3 lightVec = normalize(LightVec.xyz);

    // calculate half angle vector
    float3 eyeVec = float3(0.0, 0.0, 1.0);
    float3 halfVec = normalize(lightVec + eyeVec);

    // calculate diffuse component
    float diffuse = dot(normalVec, lightVec);

    // calculate specular component
    float specular = dot(normalVec, halfVec);

    // The lit() function is a handy function in the standard library that
    // can be used to accelerate your lighting calculations.
    //
    // This function return a vector containing these values:
    //     result.x = 1.0;
    //     result.y = max(diffuse, 0);
    //     result.z = if (result.y > 0.0) then pow(specular, 32) else 0.0
    //     result.w = 1.0;

    // Use the lit function to compute lighting vector from diffuse and
    // specular values
    float4 lighting = lit(diffuse, specular, 32);

    // blue diffuse material
    float3 diffuseMaterial = float3(1.0, 0.0, 1.0);

    // white specular material
    float3 specularMaterial = float3(1.0, 1.0, 1.0);

    // combine diffuse and specular contributions and output final vertex color
    OUT.Color0.rgb = lighting.y * diffuseMaterial + lighting.z * specularMaterial;
    OUT.Color0.a = 1.0;

    return OUT;
}
сам архив могу заатачить, но теперь уже завтра. да и сам архив дома лежит. постоянно его забываю...
однако как бы там не было, возможности блица не ограничены им самим и народ прикручивает к нему всякое всякое, например движок Xors3D и врапер физикса.
но я не хочу пользоваться ксорсом...он сырой ещё, глючный...ну его куданить...на макса я пока и в ближайшем будущем не буду переходить.
DM_PELSWIDTH | DM_PELSHEIGHT | DM_BITSPERPEL | DM_DISPLAYFREQUENCY

пробовал, всякие варианты. получасется что он вроде меняет разрешение, но всё ровно вылетает назад на рабочий стол и в окне блица крутит. если вырубить создание окна в блице, то получается другое окно, меньше размерами и пустое(((
пересоздал всё с нуля, все контексты и прочее, не помогает. вроде сдл получился отработать, но у него какие то косяки прут с геометрией объектов (все полигоны слетают, хотя без сдл всё чётко) и он перехватывает почти всё управление - например если у меня задана функция обработки кнопок и выход по клавише, то приходица переключаться на окно блица, в окне сдл не работает...
Я давно юзаю Blitz3D SDK для СПП

Блиц СДК и сам блиц на мой взгляд совершенно разные вещи. блдитц3Д это конкретный язык, движок (или на полловину движок) с модульной структурой (довешивать библиотеки и деклсы к ним). в си++ ты сидиш на самом си и можеш юзать соответственно все примущества языка, включая указание адреса функции и передача её/его в другую функцию., как пример - glutDisplayFunc (далее из файла заголовка - glutDisplayFunc(void (GLUTCALLBACK *func)(void)) ). такая конструкция на блице не проканает и я думал сделать на си врапер, но пока наткнулся на грабли - именно изза этой функции. т.е. на блице я пишу функцию обработки экрана или некая его часть и должен эту функцию (её адрес) передать во врапер, а он в глут машину. как то так...и в итоге выхватываю MAV...

#9
16:13, 7 апр. 2010

так, переключить переключил...поменял местами пару функций. однако экран тёмный и ничего не рисуется...

#10
16:18, 7 апр. 2010

А что стандартных функций у Блитца нет?

#11
18:15, 7 апр. 2010

каких функций? для режима экрана? есть обобщёная функция - Graphics (или Graphics3D но это не важно). параметры просты - ширина, высота, глубина и режим. вот собственно режим или экран или окно. в окне рисует нормально, в экране фиг. вовсяком случае, включаться щас включается на экран, но там всё чёрное((

#12
18:43, 7 апр. 2010

немного доработал функцию врапа,чтобы возвращала ответ от оригинальной ChangeDisplaySettings:

BBDECL int BBCALL wrapChangeDisplaySettings(int flags, int width, int height, char bpp, int mode, char freq)

{
  int err;
  DEVMODE dmScreenSettings;
  memset(&dmScreenSettings, 0, sizeof(DEVMODE));
  dmScreenSettings.dmSize      = sizeof(DEVMODE);
  dmScreenSettings.dmBitsPerPel  = bpp;
  dmScreenSettings.dmPelsWidth  = width;
  dmScreenSettings.dmPelsHeight  = height;
  dmScreenSettings.dmFields    = flags;
  dmScreenSettings.dmDisplayFrequency  = freq;
  

  err=ChangeDisplaySettings(&dmScreenSettings, mode);
  return err;
}

проверил по ответу - результат 0, чтосоответсвует DISP_CHANGE_SUCCESSFUL...странно это всё...

#13
12:14, 8 апр. 2010

как я и обещал - архивчик с BlitzDirect...
http://www.gamedev.ru/files/?id=53159

#14
11:57, 10 апр. 2010

теперь работает, но при этом и новая проблема есть. пример в котором крутится куб с наложенным cg щейдером, при включении фуллскрина выдаёт ошибку, что якобы у меня
"Vertex programming extensions (GL_ARB_vertex_program or GL_NV_vertex_program) Not supported".
этого же быть не может, видюха ГФ8800.. однако, стал копать. посматрел в сруктуру пиксель формат и нашол там такую запись:
pf\AlphaBits=16
так вот, пока эта запись сожержит конкретное число, не равное нулю, СГ упорно вываливает на меня ошибку при переходе на фуллскрин.
если я завожу туда 0, тогда снова чёрный экран. я даже не исключаю того момента, что и ранее чёрный экран был изза того, что во многих доках пишут, что это поле нужно ставить в 0. я так и делал.и что можно ещё теперь сделать?

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

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