#include "stdafx.h"
#include "GLRender.h"
//创建临时窗口用
static LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
return DefWindowProc(hWnd, message, wParam, lParam);
}
CGLRenderer::CGLRenderer(void)
{
}
CGLRenderer:: ~CGLRenderer(void)
{
}
bool CGLRenderer::GetPixelFormat(CREATESTRUCT& cs)
{
// 1. 创建临时窗口
CString m_ClassName("TempView");
WNDCLASS wnd;
wnd.cbClsExtra = 0;
wnd.cbWndExtra = 0;
wnd.hCursor = LoadCursor(0, IDC_ARROW);
wnd.hIcon = LoadIcon(0, IDI_WINLOGO);
wnd.lpszMenuName = 0;
wnd.style = 0;
wnd.hbrBackground = 0;
wnd.lpfnWndProc = WndProc;
wnd.hInstance = cs.hInstance;
wnd.lpszClassName = m_ClassName;
//Register window class
RegisterClass(&wnd);
HWND hwnd = CreateWindowEx(NULL, m_ClassName, m_ClassName,
WS_OVERLAPPEDWINDOW, 0, 0, 20, 20, NULL, NULL, cs.hInstance, NULL);
::ShowWindow(hwnd, SW_HIDE); // Don't show the window.
HDC tempHdc = GetDC(hwnd);
// 2.获得临时窗口的pixelformat
pfd =
{
sizeof(PIXELFORMATDESCRIPTOR),
1,
PFD_DRAW_TO_WINDOW | // support window
PFD_SUPPORT_OPENGL | // support OpenGL
PFD_DOUBLEBUFFER, // double buffered
PFD_TYPE_RGBA, // RGBA type
32, // 32-bit color depth
0, 0, 0, 0, 0, 0, // color bits ignored
0, // no alpha buffer
0, // shift bit ignored
0, // no accumulation buffer
0, 0, 0, 0, // accum bits ignored
24, // 24-bit z-buffer
0, // no stencil buffer
0, // no auxiliary buffer
PFD_MAIN_PLANE, // main layer
0, // reserved
0, 0, 0 // layer masks ignored
};
int nPixelFormat = ChoosePixelFormat(tempHdc, &pfd);
if (nPixelFormat == 0)
{
return false;
}
BOOL bResult = SetPixelFormat(tempHdc, nPixelFormat, &pfd);
if (!bResult)
{
return false;
}
HGLRC tempContext = wglCreateContext(tempHdc);
wglMakeCurrent(tempHdc, tempContext);
//3. 有了临时RC之后才能初始化GLEW
glewExperimental = GL_TRUE;
GLenum err = glewInit();
if (GLEW_OK != err)
{
AfxMessageBox(_T("GLEW is not initialized!"));
}
// 清空临时RC和临时窗口
wglMakeCurrent(NULL, NULL);
wglDeleteContext(tempContext);
::DestroyWindow(hwnd);
return true;
}
bool CGLRenderer::CreateGLContext(CDC* pDC)
{
//4. 设定 pixelformat
int nPixCount = 0;
float fPixAttribs[] = { 0, 0 };
int iPixAttribs[] =
{
WGL_DRAW_TO_WINDOW_ARB, GL_TRUE,
WGL_SUPPORT_OPENGL_ARB, GL_TRUE,
WGL_DOUBLE_BUFFER_ARB, GL_TRUE,
WGL_PIXEL_TYPE_ARB, WGL_TYPE_RGBA_ARB,
WGL_COLOR_BITS_ARB, 32,
WGL_DEPTH_BITS_ARB, 24,
WGL_STENCIL_BITS_ARB, 8,
WGL_ACCELERATION_ARB, WGL_FULL_ACCELERATION_ARB,
WGL_SAMPLE_BUFFERS_ARB, GL_TRUE, // MSAA on,开启多重采样
WGL_SAMPLES_ARB, 4, // 4x MSAA ,多重采样样本数量为4
0
};
//新的查询像素格式的函数
wglChoosePixelFormatARB(pDC->GetSafeHdc(), iPixAttribs, fPixAttribs, 1, &nPixelFormat, (UINT*)&nPixCount);
//多重采样时,如果硬件不支持就使用下面的代码关闭多重采样
if (nPixelFormat == -1)
{
iPixAttribs[18] = 1;
wglChoosePixelFormatARB(pDC->GetSafeHdc(), iPixAttribs, fPixAttribs, 1, &nPixelFormat, (UINT*)&nPixCount);
}
SetPixelFormat(pDC->GetSafeHdc(), nPixelFormat, &pfd);
int attribs[] =
{
WGL_CONTEXT_MAJOR_VERSION_ARB, 3,
WGL_CONTEXT_MINOR_VERSION_ARB, 2,
//要求返回兼容模式环境,如果不指定或指定为WGL_CONTEXT_CORE_PROFILE_BIT_ARB会返回只包含核心功能的环境
WGL_CONTEXT_PROFILE_MASK_ARB,WGL_CONTEXT_CORE_PROFILE_BIT_ARB,
0
};
if (wglewIsSupported("WGL_ARB_create_context") == 1)
{
m_hrc = wglCreateContextAttribsARB(pDC->GetSafeHdc(), 0, attribs);
wglMakeCurrent(NULL, NULL);
wglMakeCurrent(pDC->m_hDC, m_hrc);
}
if (!m_hrc) return false;
return true;
}
void CGLRenderer::OutputError(const char* funcName)
{
#ifdef _DEBUG
GLenum error = glGetError();//Context删除之后geterror信息无效
switch (error)
{
case GL_INVALID_ENUM:
TRACE("\n\n警告!运行到 %s 有错误,错误函数为GL_INVALID_ENUM,错误提示:%s\n\n", funcName, glewGetErrorString(error)); break;
case GL_INVALID_VALUE:
TRACE("\n\n警告!运行到 %s 有错误,错误函数为GL_INVALID_VALUE,错误提示:%s\n\n", funcName, glewGetErrorString(error)); break;
case GL_INVALID_OPERATION:
TRACE("\n\n警告!运行到 %s 有错误,错误函数为GL_INVALID_OPERATION,错误提示:%s\n\n", funcName, glewGetErrorString(error)); break;
case GL_STACK_OVERFLOW:
TRACE("\n\n警告!运行到 %s 有错误,错误函数为GL_STACK_OVERFLOW,错误提示:%s\n\n", funcName, glewGetErrorString(error)); break;
case GL_STACK_UNDERFLOW:
TRACE("\n\n警告!运行到 %s 有错误,错误函数为GL_STACK_UNDERFLOW,错误提示:%s\n\n", funcName, glewGetErrorString(error)); break;
case GL_OUT_OF_MEMORY:
TRACE("\n\n警告!运行到 %s 有错误,错误函数为GL_OUT_OF_MEMORY,错误提示:%s\n\n", funcName, glewGetErrorString(error)); break;
default:
break;
}
#endif
}
void CGLRenderer::PrepareScene(void)
{
m_pProgram = new CGLProgram();
m_pVertSh = new CGLShader(GL_VERTEX_SHADER);
m_pFragSh = new CGLShader(GL_FRAGMENT_SHADER);
m_pVertSh->Load(_T("minimal.vert"));
m_pFragSh->Load(_T("minimal.frag"));
m_pVertSh->Compile();
m_pFragSh->Compile();
m_pProgram->AttachShader(m_pVertSh);
m_pProgram->AttachShader(m_pFragSh);
m_pProgram->BindAttribLocation(0, "in_Position");
m_pProgram->BindAttribLocation(1, "in_Color");
m_pProgram->Link();
m_pProgram->Use();
SetData();
}
void CGLRenderer::SetData()
{
// First simple object
float* vert = new float[9]; // vertex array
float* col = new float[9]; // color array
vert[0] = -0.3f; vert[1] = 0.5f; vert[2] = -1.0f;
vert[3] = -0.8f; vert[4] = -0.5f; vert[5] = -1.0f;
vert[6] = 0.2f; vert[7] = -0.5f; vert[8] = -1.0f;
col[0] = 1.0f; col[1] = 0.0f; col[2] = 0.0f;
col[3] = 0.0f; col[4] = 1.0f; col[5] = 0.0f;
col[6] = 0.0f; col[7] = 0.0f; col[8] = 1.0f;
// Second simple object
float* vert2 = new float[9]; // vertex array
vert2[0] = -0.2f; vert2[1] = 0.5f; vert2[2] = -1.0f;
vert2[3] = 0.3f; vert2[4] = -0.5f; vert2[5] = -1.0f;
vert2[6] = 0.8f; vert2[7] = 0.5f; vert2[8] = -1.0f;
// Two VAOs allocation
glGenVertexArrays(2, &m_vaoID[0]);
// First VAO setup
glBindVertexArray(m_vaoID[0]);
glGenBuffers(2, m_vboID);
glBindBuffer(GL_ARRAY_BUFFER, m_vboID[0]);
glBufferData(GL_ARRAY_BUFFER, 9 * sizeof(GLfloat), vert, GL_STATIC_DRAW);
glVertexAttribPointer((GLuint)0, 3, GL_FLOAT, GL_FALSE, 0, 0);
glEnableVertexAttribArray(0);
glBindBuffer(GL_ARRAY_BUFFER, m_vboID[1]);
glBufferData(GL_ARRAY_BUFFER, 9 * sizeof(GLfloat), col, GL_STATIC_DRAW);
glVertexAttribPointer((GLuint)1, 3, GL_FLOAT, GL_FALSE, 0, 0);
glEnableVertexAttribArray(1);
// Second VAO setup
glBindVertexArray(m_vaoID[1]);
glGenBuffers(1, &m_vboID[2]);
glBindBuffer(GL_ARRAY_BUFFER, m_vboID[2]);
glBufferData(GL_ARRAY_BUFFER, 9 * sizeof(GLfloat), vert2, GL_STATIC_DRAW);
glVertexAttribPointer((GLuint)0, 3, GL_FLOAT, GL_FALSE, 0, 0);
glEnableVertexAttribArray(0);
glBindVertexArray(0);
delete[] vert;
delete[] vert2;
delete[] col;
}
void CGLRenderer::Reshape(int w, int h)
{
glViewport(0, 0, w, h);
}
void CGLRenderer::DrawScene(CDC *pDC)
{
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glBindVertexArray(m_vaoID[0]); // select first VAO
glDrawArrays(GL_TRIANGLES, 0, 3); // draw first object
glBindVertexArray(m_vaoID[1]); // select second VAO
glVertexAttrib3f((GLuint)1, 1.0, 0.0, 0.0); // set constant color attribute
glDrawArrays(GL_TRIANGLES, 0, 3); // draw second o
OpenGL学习主要代码类
需积分: 6 184 浏览量
2016-07-03
20:20:42
上传
评论 1
收藏 7KB ZIP 举报
洗洗睡去
- 粉丝: 270
- 资源: 23
最新资源
- 51单片机C开发实例带讲解视频8-8点阵静止显示
- 51单片机C开发实例带讲解视频16-16点阵例程包
- 电子通信设计资料PWM调试LED灯显示
- SGBM(Semi-Global Block Matching)是一种用于计算双目视觉中视差(disparity)的半全局匹配算
- SMA-GPR基于黏菌算法优化高斯过程回归的数据回归预测(Matlab完整源码和数据)
- settings.xml文件
- 计算机专业精品毕业设计&课程设计-基于SSM++jsp的精品酒销售管理系统
- 电子通信设计资料单片机之红外发射接受
- 基于SSM VUE和遗传算法的中药药对挖掘系统项目(免费提供全套java开源项目源码+论文)
- 电子通信设计资料可编程继电器模块应用程序
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈