Вопрос №1: Как в OpenGL и DirectX8/9 нарисовать это: Картинка №7: http://i96.photobucket.com/albums/l161/mrgrotey/Forum%20Help-Outs/wireframe-pot.jpg (копия во вложении) Поясню - это как бы wireframe c невидимыми задними гранями.
есть такая библиотека - glut. Или, если микрософтовый аналог, glaux или как-то так. Чайник рисуется вызовом 1 функции RenderTeapot Но строго говоря, glut распространяется с исходным кодом. Поэтому никто не запрещает найти в исходнике функцию RenderTeapot и использовать. В смысле, в ДиректХ. По сути, там расчитываются полигоны, которые потом выводятся. Отрендерить полигоны можно хоть с OpenGL, хоть с DirectX
Этот чайник с незапамятных времён лежит везде. Со всеми координатами вершин и описаниями граней. Например здесь: http://www.sjbaker.org/wiki/index.php?title=The_History_of_The_Teapot
Я вообще-то имел в виду не сам чайник, а как нарисовать ЛЮБУЮ модель в wireframe c удалением граней. В DirectX, например, можно только либо-либо: 1) сетка/wireframe: p_d3d8_Device->SetRenderState (D3DRS_FILLMODE, D3DFILL_WIREFRAME); 2) сплошная/solid: p_d3d8_Device->SetRenderState (D3DRS_FILLMODE, D3DFILL_SOLID); приблизительно также и в OpenGL.
Это делается в два прохода. Первый раз рисуем 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
С наступающим! А теперь вопрос: В 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): void DrawScene(void) { glLoadIdentity(); gluLookAt(e.x,e.y,e.z, d.x,d.y,d.z, u.x,u.y,u.z); DrawObjects(...); glFinish(); SwapBuffers(); } В DrawObjects(...); нормали к вертексам задействованы! Не могу вкурить как правильно использовать это раширение. Как использовать параметры glCullParameterfv ? Где в код вставить Код (Text): glCullParameterfv(?, ?); glEnable(GL_CULL_VERTEX); и Код (Text): 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() это должно быть учтено.