void CWireSphere::RenderWithGouraudShading(vec4 vLightPos, color4 vLightI) { // Method 1 : 對每一個 Vertex 都計算顏色 for (int i = 0; i < m_iStacks; i++ ) { for( int j = 0 ; j < 2*(m_iSlices+1) ; j++ ) { m_pColors[i*2*(m_iSlices+1)+j] = PhongReflectionModel(m_pPoints[i*2*(m_iSlices+1)+j], m_pNormals[i*2*(m_iSlices+1)+j], vLightPos, vLightI); } } // Method 2 : 重疊的 Vertex 使用前一次計算的顏色 // 先計算第一個 Stack 的顏色 //for( int j = 0 ; j < 2*(m_iSlices+1) ; j++ ) { // m_pColors[j] = PhongLightingModel(m_pPoints[j], m_pNormals[j], vLightPos, vViewPoint, vLightI); //} //// 後續 Stack 的 vertex 顏色,編號偶數(含 0) 使用前一個 stack 編號+1的 顏色 //// 編號奇數就必須計算顏色 //// 每一個 Slices 最後兩個 vertex 於開頭前兩個 vertex 重疊,所以使用該兩個 vertex 的顏色 //for (int i = 1; i < m_iStacks; i++ ) { // for( int j = 0 ; j < 2*(m_iSlices+1) - 2 ; j++ ) { // if( j%2 ) m_pColors[i*2*(m_iSlices+1)+j] = PhongLightingModel(m_pPoints[i*2*(m_iSlices+1)+j], m_pNormals[i*2*(m_iSlices+1)+j], vLightPos, vViewPoint, vLightI); // else m_pColors[i*2*(m_iSlices+1)+j] = m_pColors[(i-1)*2*(m_iSlices+1)+j+1]; // } // m_pColors[(i+1)*2*(m_iSlices+1)-2] = m_pColors[i*2*(m_iSlices+1)]; // m_pColors[(i+1)*2*(m_iSlices+1)-1] = m_pColors[i*2*(m_iSlices+1)+1]; //} glBindBuffer( GL_ARRAY_BUFFER, m_uiBuffer ); glBufferSubData( GL_ARRAY_BUFFER, sizeof(vec4)*m_iNumVtx+sizeof(vec3)*m_iNumVtx, sizeof(vec4)*m_iNumVtx, m_pColors ); // vertcies' Color }
void CQuadMT::RenderWithGouraudShading(const LightSource &lights) { // 以 vertex 為單位,根據該點的位置與其法向量,利用 Phong lighting model 計算相對應的顏色 // 將該顏色儲存回該頂點 // 第六個點頂構成的兩個三角形 // 計算 0 1 2 5 四個頂點的顏色即可,0 與 3、2 與 4 的顏色相同 m_pColors[0] = m_pColors[3] = PhongReflectionModel(m_pPoints[0], m_pNormals[0], lights); m_pColors[2] = m_pColors[4] = PhongReflectionModel(m_pPoints[2], m_pNormals[2], lights); m_pColors[1] = PhongReflectionModel(m_pPoints[1], m_pNormals[1], lights); m_pColors[5] = PhongReflectionModel(m_pPoints[5], m_pNormals[5], lights); glBindBuffer( GL_ARRAY_BUFFER, m_uiBuffer ); glBufferSubData( GL_ARRAY_BUFFER, sizeof(vec4)*m_iNumVtx+sizeof(vec3)*m_iNumVtx, sizeof(vec4)*m_iNumVtx, m_pColors ); // vertcies' Color }
void CQuad::RenderWithFlatShading(const LightSource &lights) { // 以每一個面的三個頂點計算其重心,以該重心作為顏色計算的點頂 // 根據 Phong lighting model 計算相對應的顏色,並將顏色儲存到此三個點頂 // 因為每一個平面的頂點的 Normal 都相同,所以此處並沒有計算此三個頂點的平均 Normal vec4 vCentroidP; for (int i = 0; i < m_iNumVtx; i += 3) { // 計算三角形的重心 vCentroidP = (m_pPoints[i] + m_pPoints[i + 1] + m_pPoints[i + 2]) / 3.0f; m_pColors[i] = m_pColors[i + 1] = m_pColors[i + 2] = PhongReflectionModel(vCentroidP, m_pNormals[i], lights); } glBindBuffer(GL_ARRAY_BUFFER, m_uiBuffer); glBufferSubData(GL_ARRAY_BUFFER, sizeof(vec4)*m_iNumVtx + sizeof(vec3)*m_iNumVtx, sizeof(vec4)*m_iNumVtx, m_pColors); // vertcies' Color }