【问题标题】:why are my primitives see through?为什么我的图元被看穿了?
【发布时间】:2011-10-15 01:04:18
【问题描述】:

我正在通过绘制一堆三角形在 opengl 中渲染一个 3d 表面。我的一些原语被看穿了。我不仅仅意味着它们背后有颜色的混合,我的意思是我可以完全看穿它们。我不知道为什么我能够看穿这些原语并且不希望出现这种情况(除非我指定了我没有指定的 alpha 混合)。

不幸的是,我无法链接任何代码(现在有大约 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);
}

【问题讨论】:

  • 如果你不能分享任何代码,也许你可以添加更多细节。就目前而言,这个问题非常模糊。你在什么操作系统上?您使用的是什么版本的 OpenGL。你有什么样的显卡?你用的是什么窗口系统?
  • 您是否启用了背面剔除?如果是这样,则可能不会绘制某些多边形,具体取决于您定义它们的顶点的顺序。
  • 您的 z 测试或剔除很可能没有达到您的预期。包括你设置渲染状态的代码(不应该很长),即你在哪里调用glCullFaceglEnable(....)等等。
  • 如果您还没有,请考虑插入对 glGetError 的常规调用,以查看是否有任何错误。

标签: c++ opengl 3d


【解决方案1】:
glEnable(GL_BLEND | GL_DEPTH_TEST);

是错误的,因为glEnable 只需要启用一个功能,而不是位掩码。您可能有更多错误,但您想将以上内容更改为:

glEnable(GL_BLEND);
glEnable(GL_DEPTH_TEST);

【讨论】:

    猜你喜欢
    • 2012-11-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-31
    • 2013-09-30
    • 1970-01-01
    • 2016-06-20
    相关资源
    最近更新 更多