Opengl ES Glew库 ----- By YDD的铁皮锅
前一篇随笔我写了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的铁皮锅的更多相关文章
- Opengl 之 窗口初体验 ------ By YDD的铁皮锅
大二的时候开始想着做游戏,因为学校的课程实在是无聊就想着做些有意义的事情.毕竟学了编程这一行就得做些实事,于是就在网上搜了一下图形编程,偶然的了解到了Opengl (同时还有Windows上的Dire ...
- mac下使用glew库,方法
mac下使用glew库,方法 分类: OpenGL2015-01-15 15:52 210人阅读 评论(0) 收藏 举报 目录(?)[+] 主要参考http://www.cnblogs.com ...
- 一篇通俗易懂的讲解OpenGL ES的文章
电脑或者手机上做图像处理有很多方式,但是目前为止最高效的方法是有效地使用图形处理单元,或者叫 GPU.你的手机包含两个不同的处理单元,CPU 和 GPU.CPU 是个多面手,并且不得不处理所有的事情, ...
- [OpenGL ES 03]3D变换:模型,视图,投影与Viewport
[OpenGL ES 03]3D变换:模型,视图,投影与Viewport 罗朝辉 (http://blog.csdn.net/kesalin) 本文遵循“署名-非商业用途-保持一致”创作公用协议 系列 ...
- iOS 平台开发OpenGL ES程序注意事项
本人最近从Android平台的OpenGL ES开发转到iOS平台的OpenGL ES开发,由于平台不同,所以开发中会有一些区别,再次列出需要注意的几点. 1.首先需要了解iOS主要开发框架,再次仅介 ...
- 最新首发Eclipse+CDT+android-ndk写纯c++安卓应用(附openGL Es)
首先下载eclipse和cdt.我的版本依次是:Version: Indigo Service Release 2和Version: 1.0.0.201202111925,再下载windows的ndk ...
- 利用JNI技术在Android中调用C++形式的OpenGL ES 2.0函数
1. 打开Eclipse,File-->New-->Project…-->Android-->AndroidApplication Projec ...
- 【Qt for Android】OpenGL ES 绘制彩色立方体
Qt 内置对OpenGL ES的支持.选用Qt进行OpenGL ES的开发是很方便的,很多辅助类都已经具备.从Qt 5.0開始添加了一个QWindow类,该类既能够使用OpenGL绘制3D图形,也能够 ...
- EGL接口介绍-----Android OpenGL ES底层开发
引自:http://www.cnitblog.com/zouzheng/archive/2011/05/30/74326.html EGL 是 OpenGL ES 和底层 Native 平台视窗系统之 ...
随机推荐
- 【刷题笔记】686. Repeated String Match
题意 题目大意是,给两个字符串 A 和 B,问 B 是否能成为 A+A+A+...+A 的子字符串,如果能的话,那么最少需要多少个 A? 暴力解法 直接 A+A+...,到哪次 A 包含 B 了,就返 ...
- python 装饰器 第九步:使用类来作为装饰器
#第九步:使用类来作为装饰器 class kuozhan: #接收装饰器的参数(函数outer) def __init__(self,arg): print(self,arg)#arg就是la sel ...
- tensorflow|tf.train.slice_input_producer|tf.train.Coordinator|tf.train.start_queue_runners
#### ''' tf.train.slice_input_producer :定义样本放入文件名队列的方式[迭代次数,是否乱序],但此时文件名队列还没有真正写入数据 slice_input_prod ...
- java反射(一)--认识反射机制
一.认识java反射机制 在java语言中,之所以会有如此众多的开源技术支撑,很大的一部分来源于java最大特征--反射机制.能够灵活的去使用反射机制进行项目的开发与设计,才能够真正接触到java的精 ...
- this.$router.push相关的vue-router的导航方法
this.$router.push相关的vue-router的导航方法:https://blog.csdn.net/zeroyulong/article/details/80312750
- 组件化框架设计之阿里巴巴开源路由框架——ARouter原理分析(一)
阿里P7移动互联网架构师进阶视频(每日更新中)免费学习请点击:https://space.bilibili.com/474380680 背景 当项目的业务越来越复杂,业务线越来越多的时候,就需要按照业 ...
- python杂货
三.字典的基本操作 1.如何访问字典中的值? adict[key] 形式返回键key对应的值value,如果key不在字典中会引发一个KeyError. adict.get(key, default ...
- columns样式属性使用
columns样式属性使用 columns:用于设置元素的列宽和列数.它是column-width和column-count的简写属性. 语法: columns: <'column-width' ...
- docker 部署vsftpd服务、验证及java ftp操作工具类
docker部署vsftpd服务 新建ftp文件存储目录/home/ftp cd /home mkdir ftp 创建一个组,用于存放ftp用户 groupadd ftpgroups 创建ftp用户, ...
- go语言从例子开始之Example12.func函数
函数 是 Go 的中心.我们将通过一些不同的例子来进行学习. Example: package main import "fmt" //定义一个函数使用关键字func //函数名名 ...