Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[18.116.118.198] |
|
Сообщ.
#1
,
|
|
|
Делаю полупрозрачный объект, используя
glEnable(GL_BLEND); glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); При вращении объекта получаются артефакты. Прикреплённая картинка
Что нужно сделать чтобы не было таких полосок при "перекладывании" из одного положения в другое ? |
Сообщ.
#2
,
|
|
|
Сообщ.
#3
,
|
|
|
Сообщ.
#4
,
|
|
|
Выглядит как Z-fighting, как будто что-то напутано в матрице проекции и при некоторых направлениях zNear/zFar стремится к нулю.
|
Сообщ.
#5
,
|
|
|
При вращении непрозрачного объекта
glDisable(GL_BLEND); все отлично, изображение не искажается Что-то всязано именно с функцией glBlendFunc() |
Сообщ.
#6
,
|
|
|
Z-fighting может влиять на порядок отрисовки, а при выключенном блендинге порядок не важен.
А как ты рисуешь обратные стороны? Просто отключи куллинг, или в два прохода, сначала с cull_cw, потом с cull_ccw? Что с настройками Z-буфера? |
Сообщ.
#7
,
|
|
|
void ThreedviewInitialize() { glShadeModel(GL_SMOOTH); glClearColor(1.0f, 1.0f, 1.0f, 0.0f); glClearDepth(1.0f); glEnable(GL_DEPTH_TEST); glDepthFunc(GL_LEQUAL); glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST); } void ThreedviewPaint(HWND hwnd) { PAINTSTRUCT ps; BeginPaint(hwnd, &ps); EndPaint(hwnd, &ps); glMatrixMode(GL_MODELVIEW); glLoadIdentity(); glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glEnable(GL_COLOR_MATERIAL); // float light_ambient[] = { 0.0, 0.0, 0.0, 1.0 }; float light_diffuse[] = { 1.0, 1.0, 1.0, 1.0 }; float light_specular[] = { 1.0, 1.0, 1.0, 1.0 }; float light_position[] = { -1.0, 1.0, 1.0, 0.0 }; // float mat1_dif[]={0.0f,0.0f,0.0f}; float mat1_amb[]= {0.2f,0.2f,0.2f}; float mat1_spec[]={0.6f,0.6f,0.6f}; float mat1_shininess=10.0; //float mat1_dif[]={0.8f,0.8f,0.0f}; //float mat1_amb[]= {0.2f,0.2f,0.2f}; //float mat1_spec[]={0.6f,0.6f,0.6f}; //float mat1_shininess=0.5f*128; // glEnable (GL_LIGHTING); glEnable (GL_LIGHT0); glEnable(GL_NORMALIZE); // glLightModelf(GL_LIGHT_MODEL_TWO_SIDE, GL_TRUE); glEnable(GL_BLEND); glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); // glLoadMatrixf(e::threedviewpaintmatrix[1]); // ThreedviewPaintCoordinateSystem(); ThreedviewPaintElement(); // glMaterialfv (GL_FRONT,GL_AMBIENT,mat1_amb); glMaterialfv (GL_FRONT,GL_DIFFUSE,mat1_dif); glMaterialfv (GL_FRONT,GL_SPECULAR,mat1_spec); glMaterialf (GL_FRONT,GL_SHININESS,mat1_shininess); // glLightfv (GL_LIGHT0, GL_AMBIENT, light_ambient); glLightfv (GL_LIGHT0, GL_DIFFUSE, light_diffuse); glLightfv (GL_LIGHT0, GL_SPECULAR, light_specular); glLoadIdentity(); glLightfv (GL_LIGHT0, GL_POSITION, light_position); // glDisable(GL_COLOR_MATERIAL); glDisable(GL_LIGHTING); glDisable(GL_LIGHT0); glDisable(GL_NORMALIZE); glDisable(GL_BLEND); } void ThreedviewPaintElement() { int i; for (i=0; i<e::threedviewelementubound; i++) { switch ((int)e::threedviewelement[i][0]) { case 2: ThreedviewPaintElementShaft(i); break; } } } void ThreedviewPaintElementShaft(GLint param) { int i, sec; float x1, y1, z1, d1, d2, d3, d4, h1; GLUquadricObj *q; glPushMatrix(); q = gluNewQuadric(); glColor4f(0.5f, 0.5f, 0.5f, 0.8f); //glColor4f(0.3f, 0.3f, 1.0f, 0.8f); // x1 = e::threedviewelement[param][1]; y1 = e::threedviewelement[param][2]; z1 = e::threedviewelement[param][3]; sec = (int) e::threedviewelement[param][7]; glTranslatef(x1, y1, z1); for (i=0; i<sec; i++) { if (i == 0) { d1 = e::threedviewelement[param][7+i*3+1]; d2 = e::threedviewelement[param][7+i*3+2]; h1 = e::threedviewelement[param][7+i*3+3]; gluDisk(q, d1, d2, 100, 100); gluCylinder(q, d1, d1, h1, 100, 100); gluCylinder(q, d2, d2, h1, 100, 100); glTranslatef(0.0f, 0.0f, h1); if (sec == 1) { gluDisk(q, d1, d2, 100, 100); } } else { d1 = e::threedviewelement[param][7+(i-1)*3+1]; d2 = e::threedviewelement[param][7+(i-1)*3+2]; d3 = e::threedviewelement[param][7+i*3+1]; d4 = e::threedviewelement[param][7+i*3+2]; h1 = e::threedviewelement[param][7+i*3+3]; gluDisk(q, d1, d3, 100, 100); gluDisk(q, d2, d4, 100, 100); gluCylinder(q, d3, d3, h1, 100, 100); gluCylinder(q, d4, d4, h1, 100, 100); glTranslatef(0.0f, 0.0f, h1); if (i == (sec-1)) { gluDisk(q, d3, d4, 100, 100); } } } gluDeleteQuadric(q); glPopMatrix(); } Добавлено Здесь ThreedviewPaintElementShaft() это рисование ступенчатого вала |
Сообщ.
#8
,
|
|
|
Сообщ.
#9
,
|
|
|
Вот такая последовательность действий решила проблему
glEnable(GL_CULL_FACE); //... glCullFace(GL_BACK); ThreedviewPaintElement(); glCullFace(GL_FRONT); ThreedviewPaintElement(); //... glDisable(GL_CULL_FACE); Mikle Спасибо за подсказку |
Сообщ.
#10
,
|
|
|
У меня, кстати, там опечатка была:
Цитата Mikle @ Просто отключи куллинг Должно было быть "отключив" , это же вопросительное предложение. Вижу, два прохода с разным куллингом действительно решили проблему. |