【问题标题】:OpenGL - Smooth rendering doesn't workOpenGL - 平滑渲染不起作用
【发布时间】:2013-12-25 16:03:21
【问题描述】:

这是我的 Setup() 函数:

void Setup()  // TOUCH IT !! 
{ 
    glEnable(GL_LIGHTING);
    glEnable(GL_DEPTH_TEST);
    glEnable(GL_COLOR_MATERIAL);

    //Parameter handling
    glShadeModel (GL_SMOOTH);
    //glEnable(GL_NORMALIZE); 

    glDepthFunc(GL_LEQUAL);  //renders a fragment if its z value is less or equal of the stored value
    glClearDepth(1);

    //Set up light source
    GLfloat light_position[] = { 20.0, 0.0, 0.0, 0.0 };
    GLfloat ambientLight[] = { 0.3, 0.3, 0.3, 1.0 };
    GLfloat diffuseLight[] = { 0.8f, 0.8f, 0.8f, 1.0 };

    glLightfv( GL_LIGHT0, GL_POSITION, light_position);
    glLightfv( GL_LIGHT0, GL_AMBIENT, ambientLight );
    glLightfv( GL_LIGHT0, GL_DIFFUSE, diffuseLight );


    glEnable(GL_LIGHT0);

    // polygon rendering mode
    glPolygonMode(GL_FRONT_AND_BACK,GL_FILL);

    glEnable(GL_CULL_FACE);
    glFrontFace(GL_CCW);

    glColorMaterial( GL_FRONT, GL_EMISSION );
    // material identities
    float specReflection[] = { 1.0f, 1.0f, 1.0f, 1.0f };
    float ambReflection[] = { 1.0f, 1.0f, 1.0f, 1.0f };
    float diffReflection[] = { 1.0f, 1.0f, 1.0f, 1.0f };
    glMaterialfv(GL_FRONT, GL_SPECULAR, specReflection);
    glMaterialfv(GL_FRONT, GL_AMBIENT, ambReflection);
    glMaterialfv(GL_FRONT, GL_DIFFUSE, diffReflection);
    glMateriali(GL_FRONT,GL_SHININESS,20);


    //// about texture
    //glEnable(GL_TEXTURE_2D);
    glEnable(GL_BLEND);
    glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA);   

    // Black background
    glClearColor(0.0f,0.0f,0.0f,1.0f);

}

这是我的CalcNormal() 函数,正在计算法线。 v1 和 v2 是三角形的两个向量:

Point CalcNormal(Point v1, Point v2)
{
    Point normal;

    normal.x = v1.y*v2.z - v1.z*v2.y;       
    normal.y = -v1.x*v2.z + v2.x*v1.z;
    normal.z = v1.x*v2.y - v2.x*v1.y;

    float dist1 = sqrt( pow(v1.x,2) + pow(v1.y,2) + pow(v1.z,2));
    float dist2 = sqrt( pow(v2.x,2) + pow(v2.y,2) + pow(v2.z,2));
    float dist = dist1*dist2;

    normal.x = normal.x/dist;
    normal.y = normal.y/dist;
    normal.z = normal.z/dist;

    return normal;

}

这是我发送给 CalcNormal() 的向量:

Point n;
Point a1, a2;
a1.x=triangles.at(i).p2.x-triangles.at(i).p1.x; a1.y=triangles.at(i).p2.y-triangles.at(i).p1.y; a1.z=triangles.at(i).p2.z-triangles.at(i).p1.z;
a2.x=triangles.at(i).p3.x-triangles.at(i).p1.x; a2.y=triangles.at(i).p3.y-triangles.at(i).p1.y; a2.z=triangles.at(i).p3.z-triangles.at(i).p1.z;
n = CalcNormal(a1, a2);

结果是这样的:

rendering result

【问题讨论】:

  • 我放了这些颜色,以便我们可以定义 glShadeModel(GL_SMOOTH) 有效。正常计算有问题吗?

标签: opengl render smooth normals


【解决方案1】:

为了使平滑着色有效,您还需要平滑法线 - 每个顶点。到目前为止,您发布的代码仅显示了每个三角形的正常计算。在这种情况下,结果看起来仍然很平坦。

获得平滑法线的最简单方法是,在计算出每个三角形的法线后,对每个顶点的相邻三角形的所有法线进行平均。更复杂的方案使用基于三角形面积的某些函数的加权平均值。还有一些试探法试图保留硬边,但试探法总是如此,总会有一些极端情况。理想情况下,法线是在模型创建并存储在文件中时创建的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-03-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-21
    • 2011-09-06
    相关资源
    最近更新 更多