Пример #1
0
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
}
Пример #3
0
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
}