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[2] = { 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[][4] = {
        //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[][4] = {
        { 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 = 0;
    GLint news;
    program = glCreateProgram();

    shader = glCreateShader(GL_VERTEX_SHADER);
    glShaderSource(shader, 1, (const GLchar **)&vShader, NULL);
    glCompileShader(shader);
    glGetShaderiv(shader, GL_COMPILE_STATUS, &news);
    glAttachShader(program, shader);

    shader = glCreateShader(GL_FRAGMENT_SHADER);
    glShaderSource(shader, 1, (const GLchar **)&fShader, NULL);
    glCompileShader(shader);
    glGetShaderiv(shader, GL_COMPILE_STATUS, &news);
    glAttachShader(program, shader);
    glLinkProgram(program);
    glUseProgram(program);

    glGenVertexArrays(1, &glarray);
    glBindVertexArray(glarray);

    glGenBuffers(1, &render);
    glBindBuffer(GL_ARRAY_BUFFER, render);
    glBufferData(GL_ARRAY_BUFFER, sizeof(position) + sizeof(color), NULL, GL_STATIC_DRAW);

    glBufferSubData(GL_ARRAY_BUFFER, 0, sizeof(position), position);
    glBufferSubData(GL_ARRAY_BUFFER, sizeof(position), sizeof(color), color);

    glVertexAttribPointer(0, 4, GL_FLOAT, GL_FALSE, 0, NULL);
    glVertexAttribPointer(1, 4, GL_FLOAT, GL_FALSE, 0, (const GLvoid*)sizeof(position));

    glEnableVertexAttribArray(0);
    glEnableVertexAttribArray(1);

    glUniformMatrix4fv(glGetUniformLocation(program, "mat"), 1, GL_FALSE, MoveMat);
}

LRESULT CALLBACK WndProc(HWND hWnd, UINT message,
    WPARAM wParam, LPARAM lParam)
{

    switch (message)
    {
    case WM_CREATE:
        return 0;
    case WM_CLOSE:
        PostQuitMessage(0);
        return 0;

    case WM_DESTROY:
        return 0;

    case WM_KEYDOWN:
        switch (wParam)
        {
        case VK_ESCAPE:
        {
            PostQuitMessage(0);
            return 0;
        }
        case VK_UP:
        {
            arr[1] += 0.1f;
            break;
        }
        case VK_DOWN:
        {
            arr[1] -= 0.1f;
            break;
        }
        case VK_LEFT:
        {
            arr[0] -= 0.1f;
            break;
        }
        case VK_RIGHT:
        {
            arr[0] += 0.1f;
            break;
        }
        default:
            break;
        }
        return 0;

    case WM_CHAR:
    {
        if (wParam == ‘a‘) {
            angle += 0.5f;
            MoveMat[0] = 1.0f*cos(angle);
            MoveMat[2] = 1.0f*sin(angle);
            MoveMat[8] = -1.0f*sin(angle);
            MoveMat[10] = 1.0f*cos(angle);
        }
        else if (wParam == ‘d‘) {
            angle -= 0.5f;
            MoveMat[0] = 1.0f*cos(angle);
            MoveMat[2] = 1.0f*sin(angle);
            MoveMat[8] = -1.0f*sin(angle);
            MoveMat[10] = 1.0f*cos(angle);
        }
        return 0;
    }

    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 = 0;
    wc.cbWndExtra = 0;
    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, 600, 150, 600, 600, NULL, NULL, hInstance, NULL);
    if (hWnd == NULL) return -1;

    HDC hDC = GetDC(hWnd);
    PIXELFORMATDESCRIPTOR pfd;

    ZeroMemory(&pfd, sizeof(pfd));
    pfd.nSize = sizeof(pfd);
    pfd.nVersion = 1;
    pfd.dwFlags = PFD_DRAW_TO_WINDOW | PFD_SUPPORT_OPENGL | PFD_DOUBLEBUFFER;
    pfd.iPixelType = PFD_TYPE_RGBA;
    pfd.cColorBits = 24;
    pfd.cDepthBits = 16;
    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, 0, 0, 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"), 1, arr);
            glUniformMatrix4fv(glGetUniformLocation(program, "mat"), 1, GL_FALSE, MoveMat);

            glDrawArrays(GL_TRIANGLES, 0, 36);

            SwapBuffers(hDC);

            Sleep(10);
        }
    }

    wglMakeCurrent(NULL, NULL);
    wglDeleteContext(hRC);
    ReleaseDC(hWnd, hDC);
    DestroyWindow(hWnd);

    return msg.wParam;
}

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

这一篇还是有很多东西没有写清楚,可能是自己文笔不好吧。然后这些函数的用法效果也要单独来写;Opengl着色器,OpenGL渲染过程这些东西的理解对于使用glew库也十分重要。

下一篇从OpenGL渲染过程和着色器理论从头写起,在结合Demo来实践加强理解。

原文地址:https://www.cnblogs.com/yddsblog/p/11286077.html

时间: 2024-10-18 02:40:33

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

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

大二的时候开始想着做游戏,因为学校的课程实在是无聊就想着做些有意义的事情.毕竟学了编程这一行就得做些实事,于是就在网上搜了一下图形编程,偶然的了解到了Opengl (同时还有Windows上的Direct3D 但由于Opengl的跨平台等原因入了坑).虽然到现在也没写出什么小游戏出来,毕竟一个用一个那么底层的图像接口做一个有玩法有乐趣的游戏工作量还是很大的.然后因为最近刚开了博客想起这段学习经历,于是这几天就再看了一下我之前写过的代码,把我的理解写下来希望对别人有帮助同时也写给未来的自己. 首先

VS2015 配置opengl的一些库

opengl在windows下默认是很低的版本,需要自己更新驱动,驱动之中含有最新的函数.Opengl是一个协议,就是实现一些函数.对不同版本,在管程.渲染的方面有和你打的区别.这个要结合第一点. 1 实验环境搭配 环境搭配具体做什么?下载库,其实就是三个文件,动态库文件,静态库文件和头文件,把他们分别拷贝到某些目录下即可,再去学习怎么在代码中引用库,静态文件和#include头文件类似,VS要加#pragma comment(lib,”path”)要引用外接静态库.嗯,就是酱紫.很简单. 1.

Android OpenGL ES零基础系列(一):理解GLSurfaceView,GLSurfaceView.Render的基本用法

转载请注明出处 前言 OpenGL ES是OpenGL的一个子集,是针对手机.PDA和游戏主机等嵌入式设备而设计的.该API由Khronos集团定义推广,Khronos是一个图形软硬件行业协会,该协会主要关注图形和多媒体方面的开放标准. 因此OpenGL ES作为第三方库被应用在android中. 到目前为止,OpenGL ES已经发展有了3个版本,OpenGL ES 1.0 , OpenGL ES 2.0 , OpenGL ES 3.0.其中OpenGL ES 1.0 是以OpenGL 1.3

基于OpenGL ES 的深度学习框架编写

基于OpenGL ES的深度学习框架编写 背景与工程定位 背景 项目组基于深度学习实现了视频风格化和人像抠图的功能,但这是在PC/服务端上跑的,现在需要移植到移动端,因此需要一个移动端的深度学习的计算框架. 同类型的库 caffe-android-lib 目前应该是最便于集成使用的深度学习框架库. tensorflow和mxnet据说也有对应的android库,因时间原因暂未测试. CNNdroid,网址https://zhuanlan.zhihu.com/p/25259452,这个是用 ren

[iTyran原创]iPhone中OpenGL ES显示3DS MAX模型之一:OBJ格式分析

[iTyran原创]iPhone中OpenGL ES显示3DS MAX模型之一:OBJ文件格式分析作者:yuezang - iTyran 在iOS的3D开发中常常需要导入通过3DS MAX之类的3D设计软件生成的模型.因为OpenGL ES是不能直接读取这些文件的,所以常常需要开发人员增加接口来导入.通常的做法是在建模软件中建立3D模型之后在OpenGL ES中导入并进行控制.    3DS MAX通常的保存格式有*.max(现在生成的版本的格式),*.3ds(低版本的3ds Max生成的格式)

有关于OpenGL、OpenGL ES、WebGL的小结

转自原文 有关于OpenGL.OpenGL ES.WebGL的小结 一.   OpenGL简介 OpenGL(全写Open Graphics Library)是个定义了一个跨编程语言.跨平台的编程接口的规格,它用于三维图西象(二维的亦可).OpenGL是个专业的图形程序接口,是一个功能强大,调用方便的底层图形库. 关于其他的介绍我就不说了.这边我说一下有OpenGL的资源网站: OpenGL官网:http://www.opengl.org/resources/libraries/glut/ Ne

android graphic(14)—EGL和OpenGL ES之间的关系

OpenGL ES EGL 例子 EGL加载OpenGL ES库 涉及的库 库的加载 小结 OpenGL ES 什么是OpenGL? Open Graphics Library (OpenGL) is a cross-language, cross-platform application programming interface (API) for rendering 2D and 3D vector graphics. The API is typically used to intera

OpenGL ES Emulator比较

http://blog.csdn.net/nhsoft/article/details/6337434 http://www.klayge.org/2011/04/20/opengl-es-emulator横向比较/ http://blog.csdn.net/nhsoft/article/details/6337434 ============================================================================ 目前我手边可选的Emul

[iTyran原创]iPhone中OpenGL ES显示3DS MAX模型之二:lib3ds加载模型

[iTyran原创]iPhone中OpenGL ES显示3DS MAX模型之二:lib3ds加载模型 作者:u0u0 - iTyran 在上一节中,我们分析了OBJ格式.OBJ格式优点是文本形式,可读性好,缺点也很明显,计算机解析文本过程会比解析二进制文件慢很多.OBJ还有个问题是各种3D建模工具导出的布局格式还不太一样,face还有多边形(超过三边形),不利于在OpenGL ES里面加载. .3ds文件是OBJ的二进制形式,并且多很多信息.有一个C语言写的开源库可以用来加.3ds文件,这就是l