前一篇随笔我写了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. 【Python—字典的用法】找到多个字典的公共键

    有 a,b,c,d,e,f 6名球员,他们在三轮比赛中的进球数用 s1,s2,s3 3个字典表示,找到每轮都有进球的球员? 创建 s1,s2,s3 3个字典素材 from random import ...

  2. leetcode.双指针.524通过删除字母匹配到字典里最长单词-Java

    1. 具体题目 给定一个字符串和一个字符串字典,找到字典里面最长的字符串,该字符串可以通过删除给定字符串的某些字符来得到.如果答案不止一个,返回长度最长且字典顺序最小的字符串.如果答案不存在,则返回空 ...

  3. exsi 回收虚拟机磁盘

    用客户端登陆服务端,用下面命令停止虚拟机机器 esxcli vm process list    用如下命令关闭一台虚拟机: esxcli vm process kill --type=[soft,h ...

  4. 使用vue配合组件--转载

    1.由饿了么 UED (知乎专栏)设计的桌面端组件库已经开源,文档:Element,仓库: GitHub - ElemeFE/element: Desktop UI elements for Vue. ...

  5. springCloud的使用06-----分布式配置

    1 分布式配置中心的搭建 1.1 在git仓库中创建配置文件 1.2 创建springboot项目引入相应jar依赖 <project xmlns="http://maven.apac ...

  6. MVC:页面提交JQ动态生成的输入框的值得解决方案:

    一,动态生成JS写法 <script type="text/javascript"> , , , ); function Additional() { var num ...

  7. 使用api获取数据————小程序

    使用api获取数据----小程序 onLoad: function (options) { //打开页面即执行. let that = this; wx.request({ //建立链接 url: ' ...

  8. Java 编程技巧之数据结构

    前言: 介绍几种常见的java数据结构及应用. 使用HashSet判断主键是否存在 HashSet 实现 Set 接口,由哈希表(实际上是 HashMap )实现,但不保证 set  的迭代顺序,并允 ...

  9. eclipse远程调试Tomcat方法(转)

    转自:http://blog.csdn.net/afgasdg/article/details/9236877 1.Linux中配置tomcat在catalina.sh中添加如下CATALINA_OP ...

  10. jQuery效果-隐藏与显示 小方块的移除

    html <!DOCTYPE html> <html> <head> <meta charset="utf-8" /> <ti ...