почему мои примитивы просвечивают?

#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);