我目前正尝试在使用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
}
答案 0 :(得分:0)
这在很大程度上取决于你对它的使用。它是平面(例如圆柱底)还是弯曲形状(例如圆柱面)
对于第一种情况,您可以计算条带中每个三角形的法线,并使用多边形的所有三角形的平均值。
对于第二种情况,您需要将三角形条分成三角形并逐个处理/渲染它们。如果你想保持光滑着色和三角形条带,那么你需要计算和使用每顶点法线(这是使用这个顶点的所有三角形法线的平均值)