前一篇随笔我写了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. DomainObjectUtility

    using System; using System.Collections; using System.Collections.Generic; using System.Collections.S ...

  2. laravel 简单应用 redis

    1.连接配置 database.php 中 测试用 都没做修改 2.创建测试路由及控制器 //添加路由 Route::get('testRedis','RedisController@testRedi ...

  3. token是什么?和session什么区别,怎么用

    对于初学者来说,对Token和Session的使用难免会限于困境,开发过程中知道有这个东西,但却不知道为什么要用他?更不知道其原理,今天我就带大家一起分析分析这东西. 一.我们先解释一下他的含义: 1 ...

  4. 华为要卖5G技术,虽然我和华为没有一点关系,但是我也很呵呵

    http://www.sohu.com/a/340555529_166680 老任头,竟然说出了这样的话,要卖5G技术给西方,然后塑造对手. 按照老任头的脾气,老任头应该不至于胡说八道这样的话,但是呢 ...

  5. ubuntu16.04安装docker11.09

    1.    安装Docker 操作系统 ubuntu16.04 1.1.   配置源文件 $sudo apt-get update #允许 apt 命令 HTTPS 访问 Docker 源 $sudo ...

  6. ubuntu16.04安装jdk1.8(java1.8)

    使用ppa方式安装 1.添加ppa $sudo add-apt-repository ppa:webupd8team/java $sudo apt-get update 2.安装oracle-java ...

  7. NoWarningNoError(第八组)----Krad项目报告

    Alpha阶段展示及总结 Github地址:https://github.com/NiceKingWei/krad 项目地址:119.29.32.204/krad.html 一.项目概况 本组的项目为 ...

  8. 2018-12-25-win2d-图片水印

    title author date CreateTime categories win2d 图片水印 lindexi 2018-12-25 10:37:52 +0800 2018-03-19 08:3 ...

  9. android中返回数据给上一个活动,可以用来回显数据

    (一)who简介:没错,就是startActivityForResult()方法,这个方法用来在活动被销毁的时候返回数据给上一个方法.参数说明: startActivityForResult(inte ...

  10. 三、Redis的配置文件和多数据库用途

    1.使用文件 # 使用配置文件启动 redis-server ./redis.conf # 带配置文件启动 且指定某几个配置 配置名称前加 -- redis-server ./redis.conf - ...