почему мои примитивы просвечивают? - PullRequest
2 голосов
/ 14 октября 2011

Я отрисовываю трехмерную поверхность в 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 && val<g && val<b && val<al || val<a && val>g && val>b && 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 Ответ

5 голосов
/ 14 октября 2011
glEnable(GL_BLEND | GL_DEPTH_TEST);

неверно, поскольку glEnable включает только одну возможность, а не битовую маску.У вас может быть больше ошибок, но вы хотите изменить вышеуказанное на:

glEnable(GL_BLEND);
glEnable(GL_DEPTH_TEST);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...