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; }
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; }
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); }