Example #1
0
bool InitResourceOpenGL(void)
{

    // 投影矩陣
    g_proj_matrix = GutMatrixOrthoRH_OpenGL(g_fOrthoWidth, g_fOrthoHeight, 0.1f, 100.0f);
    //g_proj_matrix = GutMatrixPerspectiveRH_OpenGL(60.0f, 1.0f, 0.1f, 100.0f);
    glMatrixMode(GL_PROJECTION);
    glLoadMatrixf( (float *) &g_proj_matrix);

    Vector4 a(0.0f, 0.0f, -0.1f, 1.0f);
    Vector4 b(0.0f, 0.0f, -100.0f, 1.0f);

    Vector4 ta = a * g_proj_matrix;
    Vector4 tb = b * g_proj_matrix;

    // 載入貼圖
    g_Texture0_ID = GutLoadTexture_OpenGL("../../textures/brickwall.tga");
    // 套用Trilinear Filter
    glBindTexture(GL_TEXTURE_2D, g_Texture0_ID);
    glTexParameteri( GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER, GL_LINEAR );
    glTexParameteri( GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR );
    // 載入貼圖
    g_Texture1_ID = GutLoadTexture_OpenGL("../../textures/spotlight_effect.tga");
    // 套用Trilinear Filter
    glBindTexture(GL_TEXTURE_2D, g_Texture1_ID);
    glTexParameteri( GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER, GL_LINEAR );
    glTexParameteri( GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR );

    glBindTexture(GL_TEXTURE_2D, g_Texture1_ID);

    // 把正向跟反向的面都畫出來
    glDisable(GL_CULL_FACE);
    // 啟動2D貼圖功能
    glEnable(GL_TEXTURE_2D);
    // 啟動zbuffer隱藏面測試
    glEnable(GL_DEPTH_TEST);

    return true;
}
Example #2
0
bool InitResourceOpenGL(void)
{
	// 計算出一個可以轉換到鏡頭座標系的矩陣
	g_view_matrix = GutMatrixLookAtRH(g_eye, g_lookat, g_up);
	// 設定投影矩陣
	Matrix4x4 projection_matrix = GutMatrixPerspectiveRH_OpenGL(g_fFovW, 1.0f, 0.1f, 100.0f);
	glMatrixMode(GL_PROJECTION);
	glLoadMatrixf( (float *) &projection_matrix);
	g_TextureID = GutLoadTexture_OpenGL("../../textures/lena.dds");
	// 設定顯示貼圖時使用線性內插
	glTexParameteri( GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER, GL_LINEAR );
	// 設定顯示貼圖時使用線性外插
	glTexParameteri( GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER, GL_LINEAR );
	// 使用2D貼圖功能
	glEnable(GL_TEXTURE_2D);

	return true;
}
bool CGutFontOpenGL::LoadTexture(const char *filename)
{
	m_FontTexture = GutLoadTexture_OpenGL(filename);
	return m_FontTexture ? true : false;
}
Example #4
0
bool CGutModel_OpenGL::ConvertToOpenGLModel(CGutModel *pModel)
{
	if ( pModel->m_iNumMeshes==0 )
		return false;
	int i,j,k;

	m_iNumMaterials = pModel->m_iNumMaterials;
	char szTextureName[256];

	if ( m_iNumMaterials )
	{
		m_pMaterialArray = new sModelMaterial_OpenGL[m_iNumMaterials];

		sModelMaterial_OpenGL *target = m_pMaterialArray;
		sModelMaterial *source = pModel->m_pMaterialArray;

		for ( i=0; i<m_iNumMaterials; i++, target++, source++ )
		{

			target->m_bCullFace = source->m_bCullFace;

			target->m_Emissive = source->m_Emissive;
			target->m_Ambient = source->m_Ambient;
			target->m_Diffuse = source->m_Diffuse;
			target->m_Specular = source->m_Specular;
			target->m_fShininess = source->m_fShininess;

			if ( !strcmp(source->m_szBlendMode, "replace") )
			{
				target->m_bBlend = false;
			}
			else
			{
				target->m_bBlend = true;
				
				if ( !strcmp(source->m_szBlendMode, "blend") )
				{
					target->m_SrcBlend = GL_SRC_ALPHA;
					target->m_DestBlend = GL_ONE_MINUS_SRC_ALPHA;
				}
				else if ( !strcmp(source->m_szBlendMode, "subtrace") )
				{
					target->m_SrcBlend = GL_ONE;
					target->m_DestBlend = GL_ONE;
				}
				else if ( !strcmp(source->m_szBlendMode, "add") )
				{
					target->m_SrcBlend = GL_ONE;
					target->m_DestBlend = GL_ONE;
				}
				else
				{
					target->m_SrcBlend = GL_ONE;
					target->m_DestBlend = GL_ZERO;
					target->m_bBlend = false;
				}
			}

			for ( j=0; j<MAX_NUM_TEXTURES; j++ )
			{
				if ( source->m_szTexture[j][0] )
				{
					sprintf(szTextureName, "%s%s", CGutModel::GetTexturePath(), source->m_szTexture[j]);
					target->m_Textures[j] = GutLoadTexture_OpenGL(szTextureName);
				}
				else
				{
					target->m_Textures[j] = 0;
				}
				target->m_MapChannel[j] = source->m_MapChannel[j];
			}

		}
	}

	m_iNumMeshes = pModel->m_iNumMeshes;
	m_pMeshArray = new sModelMesh_OpenGL[m_iNumMeshes];
	

	void *vbuffer_pointer, *ibuffer_pointer;

	for ( i=0; i<m_iNumMeshes; i++ )
	{
		sModelMesh *pMeshSource = pModel->m_pMeshArray + i;
		sModelMesh_OpenGL *pMesh = m_pMeshArray + i;

		pMesh->m_iNumVertexChunks = pMeshSource->m_iNumVertexChunks;
		pMesh->m_pVertexChunk = new sModelVertexChunk_OpenGL[pMesh->m_iNumVertexChunks];

		for ( j=0; j<pMesh->m_iNumVertexChunks; j++ )
		{
			sModelVertexChunk *pVertexChunkTarget = &pMeshSource->m_pVertexChunks[j];
			sModelVertexChunk_OpenGL *pVertexChunk = pMesh->m_pVertexChunk + j;
			pVertexChunk->m_VertexDecl = pVertexChunkTarget->m_VertexDecl;

			pVertexChunk->m_iNumVertices = pVertexChunkTarget->m_iNumVertices;
			int vbuffer_size = pVertexChunk->m_iNumVertices * pVertexChunk->m_VertexDecl.m_iVertexSize;
			// allocate opengl vertex buffer object
			glGenBuffers(1, &pVertexChunk->m_VertexBufferID);
			glBindBuffer(GL_ARRAY_BUFFER, pVertexChunk->m_VertexBufferID);
			glBufferData(GL_ARRAY_BUFFER, vbuffer_size, NULL, GL_STATIC_COPY);
			vbuffer_pointer = glMapBuffer(GL_ARRAY_BUFFER, GL_WRITE_ONLY);
			pVertexChunkTarget->OutputVertexBuffer(vbuffer_pointer);
			glUnmapBuffer(GL_ARRAY_BUFFER);

			pVertexChunk->m_iNumIndices = pVertexChunkTarget->m_iNumIndices;
			int ibuffer_size = pVertexChunk->m_iNumIndices * 2;
			// allocate opengl index buffer object
			glGenBuffers(1, &pVertexChunk->m_IndexBufferID);
			glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, pVertexChunk->m_IndexBufferID);
			glBufferData(GL_ELEMENT_ARRAY_BUFFER, ibuffer_size, NULL, GL_STATIC_COPY);
			ibuffer_pointer = glMapBuffer(GL_ELEMENT_ARRAY_BUFFER, GL_WRITE_ONLY);
			memcpy(ibuffer_pointer, pVertexChunkTarget->m_pIndexArray, ibuffer_size);
			glUnmapBuffer(GL_ELEMENT_ARRAY_BUFFER);

			pVertexChunk->m_iNumBatches = pVertexChunkTarget->m_iNumBatches;
			if ( pVertexChunk->m_iNumBatches )
			{
				pVertexChunk->m_pBatchArray = new sModelBatch[pVertexChunk->m_iNumBatches];
				memcpy(pVertexChunk->m_pBatchArray, pVertexChunkTarget->m_pBatchArray, 
					sizeof(sModelBatch) * pVertexChunk->m_iNumBatches);
			}
		}
	}

	glBindBuffer(GL_ARRAY_BUFFER, 0);
	glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);
}