#c #opengl #3d
#c #opengl #3D
Вопрос:
я визуализирую 3D-поверхность в opengl, рисуя кучу треугольников. некоторые из моих примитивов прозрачны. я не просто имею в виду, что за ними происходит смешение цветов, я имею в виду, что я могу видеть их полностью. я понятия не имею, почему я могу видеть сквозь эти примитивы, и не хотел бы, чтобы это было так (если я не укажу альфа-смешивание, которого у меня нет).
к сожалению, я не могу связать какой-либо код (сейчас ~ 1800 строк, и я не знаю, где может быть ошибка!), Но любая помощь была бы отличной.
надеюсь, я дал достаточно информации, если нет, пожалуйста, не стесняйтесь просить меня уточнить!
РЕДАКТИРОВАТЬ: дополнительная информация …
я вызываю plotPrim(ix, iy, iz), который использует маршировку куба для построения треугольника (или нескольких) через текущий куб прямоугольной сетки.
myInit() есть …
void myInit()
{
// initialize vectors
update_vectors();
// set initial color to white
glClearColor(0.0, 0.0, 0.0, 0.0);
glEnable(GL_BLEND | GL_DEPTH_TEST);
}
plotMesh() — это то место, где я выполняю свою работу по просмотру каждого куба и построению примитивов
void plotMesh() //
{
if(plot_prop)
{
// do some stuff
}
else
{
glBegin(GL_TRIANGLES);
for(int ix = 0; ix < snx-1; ix )
{
//x = surf_x[ix];
for(int iy = 0; iy < sny-1; iy )
{
//y = surf_y[iy];
for(int iz = 0; iz < snz-1; iz )
{
//z = surf_z[iz];
// front face
a = sv(ix 0, iy 0, iz 0);
b = sv(ix 0, iy 1, iz 0);
g = sv(ix 0, iy 0, iz 1);
d = sv(ix 0, iy 1, iz 1);
// back face
al = sv(ix 1, iy 0, iz 0);
be = sv(ix 1, iy 1, iz 0);
ga = sv(ix 1, iy 0, iz 1);
de = sv(ix 1, iy 1, iz 1);
// test to see if a primitive needs to be plotted
plotPrim(ix, iy, iz);
}
}
}
glEnd();
}
}
одним из примеров примитива, отображаемого в plotPrim(), является ….
if(val>a amp;amp; val<g amp;amp; val<b amp;amp; val<al || val<a amp;amp; val>g amp;amp; val>b amp;amp; val>al) // "a" corner
{
tx = (val-a)/(al-a);
ty = (val-a)/(b-a);
tz = (val-a)/(g-a);
x1 = surf_x[ix] tx*surf.dx;
y1 = surf_y[iy];
z1 = surf_z[iz];
x2 = surf_x[ix];
y2 = surf_y[iy] ty*surf.dy;
z2 = surf_z[iz];
x3 = surf_x[ix];
y3 = surf_y[iy];
z3 = surf_z[iz] tz*surf.dz;
getColor( (1.0-tx)*sv(ix,iy,iz) tx*sv(ix 1,iy,iz) );
glVertex3f(x1,y1,z1);
getColor( (1.0-ty)*sv(ix,iy,iz) ty*sv(ix,iy 1,iz) );
glVertex3f(x2,y2,z2);
getColor( (1.0-tz)*sv(ix,iy,iz) tz*sv(ix,iy,iz 1) );
glVertex3f(x3,y3,z3);
}
Комментарии:
1. Если вы не можете поделиться каким-либо кодом, возможно, вы можете добавить больше деталей. На данный момент этот вопрос очень расплывчатый. В какой операционной системе вы работаете? Какую версию OpenGL вы используете. Какая у вас видеокарта? Какую оконную систему вы используете?
2. У вас включена отбраковка обратной стороны? Если это так, некоторые полигоны могут не отображаться, в зависимости от порядка, в котором вы определили их вершины.
3. Скорее всего, ваше z-тестирование или отбраковка не делают того, что вы ожидаете. Включите код, в котором вы настраиваете состояние рендеринга (которое не должно быть длинным), т. Е. Куда вы вызываете
glCullFace
,glEnable(....)
и так далее.4. если вы еще этого не сделали, подумайте о том, чтобы вставить регулярные вызовы glGetError, чтобы посмотреть, не сбивается ли что-нибудь с пути.
Ответ №1:
glEnable(GL_BLEND | GL_DEPTH_TEST);
неверно, поскольку glEnable
для включения требуется только одна возможность, а не битовая маска. У вас может быть больше ошибок, но вы хотите изменить приведенное выше на:
glEnable(GL_BLEND);
glEnable(GL_DEPTH_TEST);