1. Если вы только начинаете программировать на ассемблере и не знаете с чего начать, тогда попробуйте среду разработки ASM Visual IDE
    (c) на правах рекламы
    Скрыть объявление

Одинаковые приёмы в OpenGL и DirectX8/9. Как?

Тема в разделе "WASM.OpenGL", создана пользователем sarin, 30 сен 2010.

  1. sarin

    sarin Member

    Публикаций:
    0
    Регистрация:
    2 июн 2005
    Сообщения:
    30
    Вопрос №1: Как в OpenGL и DirectX8/9 нарисовать это:

    Картинка №7: http://i96.photobucket.com/albums/l161/mrgrotey/Forum%20Help-Outs/wireframe-pot.jpg (копия во вложении)

    Поясню - это как бы wireframe c невидимыми задними гранями.
     
  2. FatMoon

    FatMoon New Member

    Публикаций:
    0
    Регистрация:
    28 ноя 2002
    Сообщения:
    954
    Адрес:
    Russia
    есть такая библиотека - glut. Или, если микрософтовый аналог, glaux или как-то так. Чайник рисуется вызовом 1 функции RenderTeapot ;)

    Но строго говоря, glut распространяется с исходным кодом. Поэтому никто не запрещает найти в исходнике функцию RenderTeapot и использовать. В смысле, в ДиректХ. По сути, там расчитываются полигоны, которые потом выводятся. Отрендерить полигоны можно хоть с OpenGL, хоть с DirectX
     
  3. r90

    r90 New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2005
    Сообщения:
    898
    Этот чайник с незапамятных времён лежит везде. Со всеми координатами вершин и описаниями граней.
    Например здесь: http://www.sjbaker.org/wiki/index.php?title=The_History_of_The_Teapot
     
  4. Rustem

    Rustem New Member

    Публикаций:
    0
    Регистрация:
    8 мар 2004
    Сообщения:
    429
    Адрес:
    Russia
    В директ иксе этот чайник тоже есть и тоже одна функция ;)

    D3DXCreateTeapot(g_pd3dDevice, &Teapot, 0);
     
  5. sarin

    sarin Member

    Публикаций:
    0
    Регистрация:
    2 июн 2005
    Сообщения:
    30
    Я вообще-то имел в виду не сам чайник, а как нарисовать ЛЮБУЮ модель в wireframe c удалением граней. В DirectX, например, можно только либо-либо:

    1) сетка/wireframe: p_d3d8_Device->SetRenderState (D3DRS_FILLMODE, D3DFILL_WIREFRAME);

    2) сплошная/solid: p_d3d8_Device->SetRenderState (D3DRS_FILLMODE, D3DFILL_SOLID);

    приблизительно также и в OpenGL.
     
  6. FatMoon

    FatMoon New Member

    Публикаций:
    0
    Регистрация:
    28 ноя 2002
    Сообщения:
    954
    Адрес:
    Russia
    Включить depth buffer, вывести. Выключить, вывести. Сравнить результат.
     
  7. Booster

    Booster New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2004
    Сообщения:
    4.860
    Это делается в два прохода. Первый раз рисуем solid изображение, второй wireframe. Единственный нюанс - необходимо учитывать Z-fighting, когда два примитива имеют одну и туже глубину и появляются артефакты. Для их устранения можно использовать полигональное смещение, значение которое автоматически добавляется к значению буфера глубины, тем самым у примитивов уже не одно значение глубины.
    В DX это D3DRS_SLOPESCALEDEPTHBIAS, D3DRS_DEPTHBIAS. В OpenGL - glPolygonOffset.
    http://www.progz.ru/t40739/. - раздел 3.4.
    http://developer.amd.com/archive/gpusamples/DepthBias/Pages/default.aspx
     
  8. sarin

    sarin Member

    Публикаций:
    0
    Регистрация:
    2 июн 2005
    Сообщения:
    30
    С наступающим!
    А теперь вопрос:

    В Intel-овых картах (напр. 81x, 845. 865, 91x, 96x, G3x, G4x ... ) повсеместно используется редкоиспользуемое расширение EXT_cull_vertex.

    http://www.opengl.org/registry/specs/EXT/cull_vertex.txt
    http://personal.redestb.es/jmovill/opengl/openglonwin-19.html

    Есть код:
    Код (Text):
    1. void DrawScene(void)
    2. {
    3. glLoadIdentity();
    4. gluLookAt(e.x,e.y,e.z, d.x,d.y,d.z, u.x,u.y,u.z);
    5.  
    6. DrawObjects(...);
    7.  
    8. glFinish();
    9. SwapBuffers();
    10. }
    В DrawObjects(...); нормали к вертексам задействованы!
    Не могу вкурить как правильно использовать это раширение.
    Как использовать параметры glCullParameterfv ?
    Где в код вставить
    Код (Text):
    1. glCullParameterfv(?, ?);
    2. glEnable(GL_CULL_VERTEX);
    и
    Код (Text):
    1. glDisable(GL_CULL_VERTEX);
    ???
    Я вставлял glCullParameterfv() перед DrawObjects(...);
    Перебирал относительное и абсолютное положение eye position (w = 0, w = 1) - всё бестолку. Менял CULL_VERTEX_EYE_POSITION_EXT на CULL_VERTEX_OBJECT_POSITION_EXT.
    Отсечение идёт но оно некорректно. В моем примере камера движется (меняются e, d, u), так что и в glCullParameterfv() это должно быть учтено.