- Visual C++源码
- Visual Basic源码
- C++ Builder源码
- Java源码
- Delphi源码
- C/C++源码
- PHP源码
- Perl源码
- Python源码
- Asm源码
- Pascal源码
- Borland C++源码
- Others源码
- SQL源码
- VBScript源码
- JavaScript源码
- ASP/ASPX源码
- C#源码
- Flash/ActionScript源码
- matlab源码
- PowerBuilder源码
- LabView源码
- Flex源码
- MathCAD源码
- VBA源码
- IDL源码
- Lisp/Scheme源码
- VHDL源码
- Objective-C源码
- Fortran源码
- tcl/tk源码
- QT源码
render_opengl.cpp
资源名称:chap03.rar [点击查看]
上传用户:gzqinmao
上传日期:2022-07-13
资源大小:472k
文件大小:3k
源码类别:
OpenGL
开发平台:
Visual C++
- #include <windows.h>
- // OpenGL extensions header
- #include "glew.h"
- #include "wglew.h"
- // Standard OpenGL header
- #include <GL/gl.h>
- #include "Gut.h"
- #include "render_data.h"
- static Matrix4x4 g_proj_matrix;
- static GLuint g_VertexProgramID = 0;
- static GLuint g_FragmentProgramID = 0;
- bool InitResourceOpenGL(void)
- {
- g_VertexProgramID = GutLoadVertexProgramOpenGL_ASM("../../shaders/vertex_color.glvp");
- if ( g_VertexProgramID==0 )
- return false;
- g_FragmentProgramID = GutLoadFragmentProgramOpenGL_ASM("../../shaders/vertex_color.glpp");
- if ( g_FragmentProgramID==0 )
- return false;
- // 投影矩阵
- g_proj_matrix = GutMatrixPerspectiveRH_OpenGL(90.0f, 1.0f, 0.1f, 100.0f);
- glEnable(GL_CULL_FACE);
- return true;
- }
- bool ReleaseResourceOpenGL(void)
- {
- if ( g_VertexProgramID )
- {
- GutReleaseVertexProgramOpenGL(g_VertexProgramID);
- g_VertexProgramID = 0;
- }
- if ( g_FragmentProgramID )
- {
- GutReleaseVertexProgramOpenGL(g_FragmentProgramID);
- g_FragmentProgramID = 0;
- }
- return true;
- }
- // callback function. 窗口大小改变时会被调用, 并传入新的窗口大小.
- void ResizeWindowOpenGL(int width, int height)
- {
- // 使用新的窗口大小做为新的绘图分辨率
- glViewport(0, 0, width, height);
- // 投影矩阵, 重设水平和垂直方向的视角.
- float aspect = (float) height / (float) width;
- g_proj_matrix = GutMatrixPerspectiveRH_OpenGL(60.0f, aspect, 0.1f, 100.0f);
- }
- // `使用OpenGL来绘图`
- void RenderFrameOpenGL(void)
- {
- // `清除画面`
- glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
- glEnable(GL_DEPTH_TEST);
- // `指定要使用Shader可程序化流程`
- glEnable(GL_VERTEX_PROGRAM_ARB);
- glEnable(GL_FRAGMENT_PROGRAM_ARB);
- // `设置使用哪个Vertex/Fragment Program`
- glBindProgramARB(GL_VERTEX_PROGRAM_ARB, g_VertexProgramID);
- glBindProgramARB(GL_FRAGMENT_PROGRAM_ARB, g_FragmentProgramID);
- // `设置要用数组的方式传入顶点位置和颜色`
- glEnableClientState(GL_VERTEX_ARRAY);
- glEnableClientState(GL_COLOR_ARRAY);
- // `计算转换矩阵`
- Matrix4x4 view_matrix = GutMatrixLookAtRH(g_eye, g_lookat, g_up);
- Matrix4x4 view_proj_matrix = view_matrix * g_proj_matrix;
- Matrix4x4 world_view_proj_matrix;
- // `太阳`
- world_view_proj_matrix = g_sun_matrix * view_proj_matrix;
- glProgramLocalParameters4fvEXT(GL_VERTEX_PROGRAM_ARB, 0, 4, (float *) &world_view_proj_matrix);
- glVertexPointer(3, GL_FLOAT, sizeof(Vertex_VC), g_pSunVertices);
- glColorPointer(4, GL_UNSIGNED_BYTE, sizeof(Vertex_VC), g_pSunVertices[0].m_RGBA);
- glDrawElements(GL_TRIANGLES, g_iNumSphereIndices, GL_UNSIGNED_SHORT, g_pSphereIndices);
- // `地球`
- world_view_proj_matrix = g_earth_matrix * view_proj_matrix;
- glProgramLocalParameters4fvEXT(GL_VERTEX_PROGRAM_ARB, 0, 4, (float *) &world_view_proj_matrix);
- glVertexPointer(3, GL_FLOAT, sizeof(Vertex_VC), g_pEarthVertices);
- glColorPointer(4, GL_UNSIGNED_BYTE, sizeof(Vertex_VC), g_pEarthVertices[0].m_RGBA);
- glDrawElements(GL_TRIANGLES, g_iNumSphereIndices, GL_UNSIGNED_SHORT, g_pSphereIndices);
- // `月球`
- world_view_proj_matrix = g_moon_matrix * view_proj_matrix;
- glProgramLocalParameters4fvEXT(GL_VERTEX_PROGRAM_ARB, 0, 4, (float *) &world_view_proj_matrix);
- glVertexPointer(3, GL_FLOAT, sizeof(Vertex_VC), g_pMoonVertices);
- glColorPointer(4, GL_UNSIGNED_BYTE, sizeof(Vertex_VC), g_pMoonVertices[0].m_RGBA);
- glDrawElements(GL_TRIANGLES, g_iNumSphereIndices, GL_UNSIGNED_SHORT, g_pSphereIndices);
- // `显示出背景backbuffer`
- GutSwapBuffersOpenGL();
- }