前一篇随笔我写了Opengl的窗口创建,这一篇随笔我要写OpenGL glew库的使用。首先需要引入头文件h,库文件Lib和动态链接库DLL,

百度搜索OpenGL glew库找到这个纯英文网站,尽量不要去下别人提供的文件一是版本跟不上,也有可能会缺些东西,还是去官方提供的好。

点击glew在开头找到LIBRARY然后GLEW再是Download下的Glew Web Site,点进去之后下面会有一排下载链接从上到下版本越低,建议用最新的。

一是可能你在网上找别人的代码Ctrl C+V结果有些函数不能用,就有可能是你的glew版本低了。

下载下来是一个zip压缩包解压,不管其他东西找到里面的glew. h. glew. lib和glew. dll这三个文件。

然后找到你编译器头文件目录把h文件拖进include文件夹里,lib文件放入Lib文件夹,dll文件拖入C:\Windows\System32\文件夹下。

然后#include头文件就可以使用glew库了。(记得加#pragma comment(lib, "glew32.lib"))

OpenGL的特有类型:

typedef unsigned int GLenum;
typedef unsigned int GLbitfield;
typedef unsigned int GLuint;
typedef int GLint;
typedef int GLsizei;
typedef unsigned char GLboolean;
typedef signed char GLbyte;
typedef short GLshort;
typedef unsigned char GLubyte;
typedef unsigned short GLushort;
typedef unsigned long GLulong;
typedef float GLfloat;
typedef float GLclampf;
typedef double GLdouble;
typedef double GLclampd;
typedef void GLvoid;

然后是一些介绍一些glew库的常用函数和用法。

glewInit() glew库初始化(一定要初始化)

用于GLShader编程

glCreateProgram() 创建一个Program

glCreateShader() 创建一个着色器

glShaderSource() 用于把Shader代码和着色器关联

glCompileShader() 编译着色器源代码

glGetShader..() 获取Shader编译信息

glGetShaderInfoLog() 获取编译Log

glAttachShader() 把着色器和Program关联

glLinkProgram() 链接项目

glGetProgram..() 获取Program信息

glGetProgramInfoLog() 获取Program链接Log

glUseProgram() 使用由下标代表的Program

用于创建顶点,指定顶点数据

glGenVertexArrays()

glBindVertexArray()

glGenBuffers()

glBindBuffer()

glBufferData()

glBufferSubData()

glVertexAttribPointer()

用于创建纹理和纹理图片

glGenTextures()

glBindTexture()

glTexParameter..()

glTexImage2D()

glUniform..()

接下来是我的Demo测试,大家可以放到VS上玩一玩。#include "stdafx.h"没有可以删去,加上#include <Windows.h> 和 #include <gl/glew.h>。

#include "stdafx.h"

#pragma comment(lib ,"opengl32.lib")
#pragma comment(lib , "glew32.lib") GLuint render, glarray, program;
float arr[] = { 0.0f, 0.0f }, angle = 0.0f; GLfloat MoveMat[] = {
1.0f*cos(angle), 0.0f, 1.0f*sin(angle), 0.0f,
0.0f, 1.0f, 0.0f, 0.0f,
-1.0f*sin(angle), 0.0f, 1.0f*cos(angle), 0.0f,
0.0f, 0.0f, 0.0f, 1.0f
}; const GLchar *vShader = "#version 330 core\n"
"layout (location = 0) in vec4 vPosition;"
"layout (location = 1) in vec4 vColor;"
"uniform vec2 vector;"
"uniform mat4 mat;"
"varying vec4 out_tex;"
"void main()"
"{"
" gl_Position = vPosition * mat + vector;"
" out_tex = vColor;"
"}"; const GLchar *fShader = "#version 330 core\n"
"varying vec4 out_tex;"
"void main()"
"{"
"gl_FragColor = out_tex;"
"}"; void init() { const GLfloat position[][] = {
//under
{ 0.25, -0.25, 0.25, 1.0 },
{ -0.25, -0.25, 0.25, 1.0 },
{ -0.25, -0.25, 0.5, 1.0 }, { 0.25, -0.25, 0.25, 1.0 },
{ -0.25, -0.25, 0.5, 1.0 },
{ 0.25, -0.25, 0.5, 1.0 },
//right
{ 0.25, -0.25, 0.5, 1.0 },
{ 0.25, -0.25, 0.25, 1.0 },
{ 0.25, 0.25, 0.25, 1.0 }, { 0.25, -0.25, 0.5, 1.0 },
{ 0.25, 0.25, 0.25, 1.0 },
{ 0.25, 0.25, 0.5, 1.0 },
//left
{ -0.25, -0.25, 0.5, 1.0 },
{ -0.25, -0.25, 0.25, 1.0 },
{ -0.25, 0.25, 0.25, 1.0 }, { -0.25, -0.25, 0.5, 1.0 },
{ -0.25, 0.25, 0.25, 1.0 },
{ -0.25, 0.25, 0.5, 1.0 },
//back
{ -0.25, -0.25, 0.25, 1.0 },
{ 0.25, -0.25, 0.25, 1.0 },
{ 0.25, 0.25, 0.25, 1.0 }, { -0.25, -0.25, 0.25, 1.0 },
{ 0.25, 0.25, 0.25, 1.0 },
{ -0.25, 0.25, 0.25, 1.0 },
//front
{ -0.25, -0.25, 0.5, 1.0 },
{ 0.25, -0.25, 0.5, 1.0 },
{ 0.25, 0.25, 0.5, 1.0 }, { -0.25, -0.25, 0.5, 1.0 },
{ 0.25, 0.25, 0.5, 1.0 },
{ -0.25, 0.25, 0.5, 1.0 },
//up
{ 0.25, 0.25, 0.5, 1.0 },
{ 0.25, 0.25, 0.25, 1.0 },
{ -0.25, 0.25, 0.25, 1.0 }, { -0.25, 0.25, 0.5, 1.0 },
{ 0.25, 0.25, 0.5, 1.0 },
{ -0.25, 0.25, 0.25, 1.0 }, }; const GLfloat color[][] = {
{ 1.0, 0.0, 0.0, 1.0 },
{ 1.0, 0.0, 0.0, 1.0 },
{ 1.0, 0.0, 0.0, 1.0 },
{ 1.0, 0.0, 0.0, 1.0 },
{ 1.0, 0.0, 0.0, 1.0 },
{ 1.0, 0.0, 0.0, 1.0 }, { 0.0, 1.0, 0.0, 1.0 },
{ 0.0, 1.0, 0.0, 1.0 },
{ 0.0, 1.0, 0.0, 1.0 },
{ 0.0, 1.0, 0.0, 1.0 },
{ 0.0, 1.0, 0.0, 1.0 },
{ 0.0, 1.0, 0.0, 1.0 }, { 0.0, 0.0, 1.0, 1.0 },
{ 0.0, 0.0, 1.0, 1.0 },
{ 0.0, 0.0, 1.0, 1.0 },
{ 0.0, 0.0, 1.0, 1.0 },
{ 0.0, 0.0, 1.0, 1.0 },
{ 0.0, 0.0, 1.0, 1.0 }, { 1.0, 1.0, 0.0, 1.0 },
{ 1.0, 1.0, 0.0, 1.0 },
{ 1.0, 1.0, 0.0, 1.0 },
{ 1.0, 1.0, 0.0, 1.0 },
{ 1.0, 1.0, 0.0, 1.0 },
{ 1.0, 1.0, 0.0, 1.0 }, { 1.0, 0.0, 1.0, 1.0 },
{ 1.0, 0.0, 1.0, 1.0 },
{ 1.0, 0.0, 1.0, 1.0 },
{ 1.0, 0.0, 1.0, 1.0 },
{ 1.0, 0.0, 1.0, 1.0 },
{ 1.0, 0.0, 1.0, 1.0 }, { 0.0, 1.0, 1.0, 1.0 },
{ 0.0, 1.0, 1.0, 1.0 },
{ 0.0, 1.0, 1.0, 1.0 },
{ 0.0, 1.0, 1.0, 1.0 },
{ 0.0, 1.0, 1.0, 1.0 },
{ 0.0, 1.0, 1.0, 1.0 }, }; glewInit(); glEnable(GL_TEXTURE_2D);
glEnable(GL_DEPTH_TEST); GLuint shader = ;
GLint news;
program = glCreateProgram(); shader = glCreateShader(GL_VERTEX_SHADER);
glShaderSource(shader, , (const GLchar **)&vShader, NULL);
glCompileShader(shader);
glGetShaderiv(shader, GL_COMPILE_STATUS, &news);
glAttachShader(program, shader); shader = glCreateShader(GL_FRAGMENT_SHADER);
glShaderSource(shader, , (const GLchar **)&fShader, NULL);
glCompileShader(shader);
glGetShaderiv(shader, GL_COMPILE_STATUS, &news);
glAttachShader(program, shader);
glLinkProgram(program);
glUseProgram(program); glGenVertexArrays(, &glarray);
glBindVertexArray(glarray); glGenBuffers(, &render);
glBindBuffer(GL_ARRAY_BUFFER, render);
glBufferData(GL_ARRAY_BUFFER, sizeof(position) + sizeof(color), NULL, GL_STATIC_DRAW); glBufferSubData(GL_ARRAY_BUFFER, , sizeof(position), position);
glBufferSubData(GL_ARRAY_BUFFER, sizeof(position), sizeof(color), color); glVertexAttribPointer(, , GL_FLOAT, GL_FALSE, , NULL);
glVertexAttribPointer(, , GL_FLOAT, GL_FALSE, , (const GLvoid*)sizeof(position)); glEnableVertexAttribArray();
glEnableVertexAttribArray(); glUniformMatrix4fv(glGetUniformLocation(program, "mat"), , GL_FALSE, MoveMat);
} LRESULT CALLBACK WndProc(HWND hWnd, UINT message,
WPARAM wParam, LPARAM lParam)
{ switch (message)
{
case WM_CREATE:
return ;
case WM_CLOSE:
PostQuitMessage();
return ; case WM_DESTROY:
return ; case WM_KEYDOWN:
switch (wParam)
{
case VK_ESCAPE:
{
PostQuitMessage();
return ;
}
case VK_UP:
{
arr[] += 0.1f;
break;
}
case VK_DOWN:
{
arr[] -= 0.1f;
break;
}
case VK_LEFT:
{
arr[] -= 0.1f;
break;
}
case VK_RIGHT:
{
arr[] += 0.1f;
break;
}
default:
break;
}
return ; case WM_CHAR:
{
if (wParam == 'a') {
angle += 0.5f;
MoveMat[] = 1.0f*cos(angle);
MoveMat[] = 1.0f*sin(angle);
MoveMat[] = -1.0f*sin(angle);
MoveMat[] = 1.0f*cos(angle);
}
else if (wParam == 'd') {
angle -= 0.5f;
MoveMat[] = 1.0f*cos(angle);
MoveMat[] = 1.0f*sin(angle);
MoveMat[] = -1.0f*sin(angle);
MoveMat[] = 1.0f*cos(angle);
}
return ;
} default:
return DefWindowProc(hWnd, message, wParam, lParam);
}
} int WINAPI WinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpCmdLine,
int iCmdShow)
{
MSG msg;
BOOL bQuit = FALSE; WNDCLASS wc;
wc.style = CS_OWNDC;
wc.lpfnWndProc = WndProc;
wc.cbClsExtra = ;
wc.cbWndExtra = ;
wc.hInstance = hInstance;
wc.hIcon = LoadIcon(NULL, IDI_APPLICATION);
wc.hCursor = LoadCursor(NULL, IDC_ARROW);
wc.hbrBackground = (HBRUSH)GetStockObject(BLACK_BRUSH);
wc.lpszMenuName = NULL;
wc.lpszClassName = TEXT("GLSample");
RegisterClass(&wc); HWND hWnd = CreateWindowA("GLSample", "OpenGL Sample", WS_CAPTION | WS_POPUPWINDOW | WS_VISIBLE, , , , , NULL, NULL, hInstance, NULL);
if (hWnd == NULL) return -; HDC hDC = GetDC(hWnd);
PIXELFORMATDESCRIPTOR pfd; ZeroMemory(&pfd, sizeof(pfd));
pfd.nSize = sizeof(pfd);
pfd.nVersion = ;
pfd.dwFlags = PFD_DRAW_TO_WINDOW | PFD_SUPPORT_OPENGL | PFD_DOUBLEBUFFER;
pfd.iPixelType = PFD_TYPE_RGBA;
pfd.cColorBits = ;
pfd.cDepthBits = ;
pfd.iLayerType = PFD_MAIN_PLANE;
int iFormat = ChoosePixelFormat(hDC, &pfd);
SetPixelFormat(hDC, iFormat, &pfd); HGLRC hRC = wglCreateContext(hDC);
wglMakeCurrent(hDC, hRC); init(); while (!bQuit)
{ if (PeekMessage(&msg, NULL, , , PM_REMOVE))
{ if (msg.message == WM_QUIT)
{
bQuit = TRUE;
}
else
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
}
else
{ glClearColor(1.0f, 1.0f, 1.0f, 1.0f);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glBindVertexArray(glarray);
glUniform2fv(glGetUniformLocation(program, "vector"), , arr);
glUniformMatrix4fv(glGetUniformLocation(program, "mat"), , GL_FALSE, MoveMat); glDrawArrays(GL_TRIANGLES, , ); SwapBuffers(hDC); Sleep();
}
} wglMakeCurrent(NULL, NULL);
wglDeleteContext(hRC);
ReleaseDC(hWnd, hDC);
DestroyWindow(hWnd); return msg.wParam;
}

按下小写字母a绕z轴顺时针旋转,字母d逆时针旋转,方向键↑向上移动,其他三个也有响应。

这一篇还是有很多东西没有写清楚,Opengl着色器,OpenGL渲染过程这些东西的理解对于使用glew库也十分重要。

Opengl ES Glew库 ----- By YDD的铁皮锅的更多相关文章

  1. Opengl 之 窗口初体验 ------ By YDD的铁皮锅

    大二的时候开始想着做游戏,因为学校的课程实在是无聊就想着做些有意义的事情.毕竟学了编程这一行就得做些实事,于是就在网上搜了一下图形编程,偶然的了解到了Opengl (同时还有Windows上的Dire ...

  2. mac下使用glew库,方法

    mac下使用glew库,方法 分类: OpenGL2015-01-15 15:52 210人阅读 评论(0) 收藏 举报   目录(?)[+]   主要参考http://www.cnblogs.com ...

  3. 一篇通俗易懂的讲解OpenGL ES的文章

    电脑或者手机上做图像处理有很多方式,但是目前为止最高效的方法是有效地使用图形处理单元,或者叫 GPU.你的手机包含两个不同的处理单元,CPU 和 GPU.CPU 是个多面手,并且不得不处理所有的事情, ...

  4. [OpenGL ES 03]3D变换:模型,视图,投影与Viewport

    [OpenGL ES 03]3D变换:模型,视图,投影与Viewport 罗朝辉 (http://blog.csdn.net/kesalin) 本文遵循“署名-非商业用途-保持一致”创作公用协议 系列 ...

  5. iOS 平台开发OpenGL ES程序注意事项

    本人最近从Android平台的OpenGL ES开发转到iOS平台的OpenGL ES开发,由于平台不同,所以开发中会有一些区别,再次列出需要注意的几点. 1.首先需要了解iOS主要开发框架,再次仅介 ...

  6. 最新首发Eclipse+CDT+android-ndk写纯c++安卓应用(附openGL Es)

    首先下载eclipse和cdt.我的版本依次是:Version: Indigo Service Release 2和Version: 1.0.0.201202111925,再下载windows的ndk ...

  7. 利用JNI技术在Android中调用C++形式的OpenGL ES 2.0函数

    1.                 打开Eclipse,File-->New-->Project…-->Android-->AndroidApplication Projec ...

  8. 【Qt for Android】OpenGL ES 绘制彩色立方体

    Qt 内置对OpenGL ES的支持.选用Qt进行OpenGL ES的开发是很方便的,很多辅助类都已经具备.从Qt 5.0開始添加了一个QWindow类,该类既能够使用OpenGL绘制3D图形,也能够 ...

  9. EGL接口介绍-----Android OpenGL ES底层开发

    引自:http://www.cnitblog.com/zouzheng/archive/2011/05/30/74326.html EGL 是 OpenGL ES 和底层 Native 平台视窗系统之 ...

随机推荐

  1. 基于windows下,node.js之npm

    1.下载node.js一路安装下去 在开始 node文件夹下,打开cmd 2.创建一个开发目录 mkdir reactQa && cd reactQa 3.初始化一个nmp的开发环境 ...

  2. setTimeout,clearTimeout,setInterval,clearInteral详解

    设置定时器,在一段时间之后执行指定的代码,setTimeout与setInterval的区别在于setTimeout函数指定的代码仅执行一次 方法一: window.setTimeout(" ...

  3. Visual Assist 10.9.2248 破解版(支持VS2017) 转载

    自己在Windows10下同时安装了VS2017和VS2013,先装的VS2017和Visual Assist,后装的VS2013,发现VS2013中没显示Visual Assist,Google了一 ...

  4. MongoDB Windows之ZIP安装

    下载.下载地址同MSI下载地址:https://www.mongodb.com/download-center/community .Package选择Zip. 下载完成后解压到对应文件夹,该文件夹就 ...

  5. 2019 牛客多校第一场 B Integration

    题目链接:https://ac.nowcoder.com/acm/contest/881/B 题目大意 给定 n 个不同的正整数 ai,求$\frac{1}{\pi}\int_{0}^{\infty} ...

  6. java虚拟机规范(se8)——class文件格式(四)

    4.7 属性 属性用于class文件格式中的ClassFile,field_info,method_info和Code_attribute结构. 所有的属性都是下面的格式: attribute_inf ...

  7. Groovy学习:第二章 Groovy语言的关键特征

    1. 断言Assertion断言:用于判断预期的条件是否为真.例子:def list = [1,2,'x']assert list.size()==32. AST转换期使用的注释AST转换的注释:Gr ...

  8. linux的CentOS、Ubuntu、Debian三个比较异同

    Linux有非常多的发行版本,从性质上划分,大体分为由商业公司维护的商业版本与由开源社区维护的免费发行版本.商业版本以Redhat为代表,开源社区版本则以debian为代表.这些版本各有不同的特点,在 ...

  9. shells - 有效登录 shell 的路径名

    描述 /etc/shells 是一个文本文件,其中包含有效登录 shell 的路径全名. chsh(1) 需要参考这个文件,并且其他程序也可以查询该文件.有些程序从这个文件判断用户是不是标准用户.比如 ...

  10. Java开发者职业生涯要看的200+本书

    作者:老刘链接:https://www.zhihu.com/question/29581524/answer/684872838来源:知乎著作权归作者所有.商业转载请联系作者获得授权,非商业转载请注明 ...