如何找到复杂形状(超过4个顶点)的法线并在其上应用光照?

时间:2012-03-14 06:32:59

标签: opengl

我目前正尝试在使用GL_TRIANGLE_STRIP标志绘制的复杂形状上应用光照。因为XYZ中的每个平面都可以通过3个点来定义计算法线可以很容易,但是当我使用gl_triangle_strip时会发生什么?

只是为了使下面的代码更具可读性,绘图过程如下:
(x,y) - > (x + 1,y) - > (x,y + 1) - > (x + 1,y + 1)

for(int i = 0; i < m_GraphConfig.MAXY   ; i +=2)
{
    glBegin(GL_TRIANGLE_STRIP);
    for (int j = 0; j < m_GraphConfig.MAXX  ;j+=2)
    {
        if ( (i * m_GraphConfig.MAXX + j + 2) % (m_GraphConfig.MAXX) != 0 && (i+2) % (m_GraphConfig.MAXY) != 0  && (j + 2) % (m_GraphConfig.MAXX) != 0  )
        {
            index = i * (m_GraphConfig.MAXX) + j;
            heightVal = host[index];
            glColor3b(((heightVal % 32) * 7 %255), ((heightVal % 16) * 14) %255, ((heightVal % 128) * 2)%255);
            glTexCoord2f(0.0f, 0.0f);   
            glVertex3d(xFactor * j , host[index] /m_GraphConfig.devider  , zFactor * i);

            index = i * (m_GraphConfig.MAXX) + j + 2;
            heightVal = host[index];
            glColor3b(((heightVal % 32) * 7)%255, ((heightVal % 16) * 14)%255, ((heightVal % 128) * 2)%255);
            glTexCoord2f(1.0f, 0.0f);   
            glVertex3d(xFactor * (j + 2) , host[index] / m_GraphConfig.devider, zFactor * i);

            index = i * (m_GraphConfig.MAXX) + j + (2 * m_GraphConfig.MAXX);
            heightVal = host[index];
            glColor3b(((heightVal % 32) * 7)%255, ((heightVal % 16) * 14)%255, ((heightVal % 128) * 2)%255);
            glTexCoord2f(0.0f, 1.0f);   
            glVertex3d(xFactor * j , host[index] / m_GraphConfig.devider , zFactor * (i + 2));

            index = i * (m_GraphConfig.MAXX) + j + (2 * m_GraphConfig.MAXX) + 2;
            heightVal = host[index];
            glColor3b(((heightVal % 32) * 7)%255, ((heightVal % 16) * 14)%255, ((heightVal % 128) * 2)%255);
            glTexCoord2f(1.0f, 1.0f);   
            glVertex3d(xFactor * ( j + 2) , host[index] / m_GraphConfig.devider , zFactor * (i + 2));           
        }
    }
    glEnd();
    glBindTexture( GL_TEXTURE_2D, 0 ); //clear the texture buffer
}

1 个答案:

答案 0 :(得分:0)

这在很大程度上取决于你对它的使用。它是平面(例如圆柱底)还是弯曲形状(例如圆柱面)

对于第一种情况,您可以计算条带中每个三角形的法线,并使用多边形的所有三角形的平均值。

对于第二种情况,您需要将三角形条分成三角形并逐个处理/渲染它们。如果你想保持光滑着色和三角形条带,那么你需要计算和使用每顶点法线(这是使用这个顶点的所有三角形法线的平均值)