博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
cppgl:一个对现代OpenGL的C++封装
阅读量:4984 次
发布时间:2019-06-12

本文共 3069 字,大约阅读时间需要 10 分钟。

:loop:a C++ wrapper for modern OpenGL ()

最近要搞个2D的图形的玩意,可网上对OpenGL的C++封装更新到c++11的几乎没有,那就比较糟糕了,还好GL封装过程也比较简单,现代的OpenGL虽然本身是C API但是在背后也有一定的对象的概念,于是就有了这个。主要的特性是,它使用了SOIL来加载图片,如果你要port到其它平台,你可以用Libpng等改写Image和IO部分;使用glm来做数学部分的定义和计算;GL对象用shared_prt来管理,所以内存方面没什么大问题;https://github.com/iichenbf/cppgl  

:loop::

1 #include "cppgl.h" 2  3 #include 
4 #include
5 #include
6 7 8 static const char* vertexSource = 9 "#version 150\n"10 "\n"11 "in vec2 position;\n"12 "in vec2 texcoord;\n"13 "out vec2 Texcoord;\n"14 "\n"15 "\n"16 "void main()\n"17 "{\n"18 " Texcoord = vec2(texcoord.x, -texcoord.y);\n"19 " gl_Position = vec4(position.x, position.y, 0.0, 1.0);\n"20 "}\n";21 22 static const char* fragmentSource =23 "#version 150\n"24 "\n"25 "in vec2 Texcoord;\n"26 "\n"27 "out vec4 outColor;\n"28 "uniform sampler2D tex;\n"29 "\n"30 "void main()\n"31 "{\n"32 " outColor = texture(tex, Texcoord);\n"33 "}\n";34 35 void cppgl_test()36 {37 makeContext();38 auto context = Context::Create();39 SPShader vert = Shader::create(ShaderType::Vertex, vertexSource);40 SPShader freg = Shader::create(ShaderType::Fragment, fragmentSource);41 SPProgram program = Program::create(vert, freg);42 context->useProgram(program);43 44 float vertices[] = {45 -0.5f, -0.5f, 0.0f, 0.0f,46 -0.5f, 0.5f, 0.0f, 1.0f,47 0.5f, 0.5f, 1.0f, 1.0f,48 0.5f, 0.5f, 1.0f, 1.0f,49 0.5f, -0.5f, 1.0f, 0.0f,50 -0.5f, -0.5f, 0.0f, 0.0f51 };52 auto image = Image::create("shooting_arrow.png");53 image->load();54 SPTexture texture = Texture::create(image, InternalFormat::RGBA);55 texture->setWrapping(Wrapping::Repeat, Wrapping::Repeat);56 texture->setFilters(Filter::Linear, Filter::Linear);57 58 context->bindTexture(texture, 0);59 SPVertexBuffer vbo = VertexBuffer::create(vertices, sizeof(vertices), BufferUsage::StaticDraw);60 SPVertexArray vao = VertexArray::create();61 vao->bindAttribute(program->getAttribute("position"), *vbo, Type::Float, 2, 4*sizeof(float), NULL);62 vao->bindAttribute(program->getAttribute("texcoord"), *vbo, Type::Float, 2, 4*sizeof(float), 2*sizeof(float));63 std::chrono::microseconds frameInterval{(long long)(1.0f/60.0f * 1000.0f * 1000.0f)};64 65 context->clearColor({
0.5f, 0.0f, 0.0f, 1.0f});66 67 context->enable(Capability::Blend);68 context->blendFunc(BlendFactor::SRC_ALPHA, BlendFactor::ONE_MINUS_SRC_ALPHA);69 70 while (!glfwWindowShouldClose(_glfwWindow))71 {72 auto last = std::chrono::steady_clock::now();73 context->clear();74 context->drawArrays(*vao, Primitive::Triangles, 0, 6);75 glfwSwapBuffers(_glfwWindow);76 glfwPollEvents();77 78 auto now = std::chrono::steady_clock::now();79 80 std::this_thread::sleep_for(frameInterval - (now - last));81 }82 83 glfwDestroyWindow(_glfwWindow);84 glfwTerminate();85 }86 87 88

 

转载于:https://www.cnblogs.com/iichenbf/p/cppgl-a-cpp-opengl-wrapper.html

你可能感兴趣的文章
2018 Multi-University Training Contest 10 - Count
查看>>
HDU6203 ping ping ping
查看>>
Fireworks基本使用
查看>>
Java基础常见英语词汇
查看>>
UINavigationController的视图层理关系
查看>>
php PDO (转载)
查看>>
[置顶] 一名优秀的程序设计师是如何管理知识的?
查看>>
highcharts曲线图
查看>>
extjs动态改变样式
查看>>
宏定义
查看>>
LeetCode 题解之Add Digits
查看>>
hdu1502 , Regular Words, dp,高精度加法
查看>>
iOS 电话在后台运行时,我的启动图片被压缩
查看>>
js --基本语法3 函数,数组,堆棧
查看>>
【转】C#生成验证码
查看>>
Linux环境下JDK/Eclipse一键安装脚本
查看>>
HwUI,CMS管理系统模板,漂亮,简单,兼容好
查看>>
特意给我的轩写的小知识
查看>>
LibreOJ #2003. 「SDOI2017」新生舞会
查看>>
sublime text there are no packages available for installation 解决办法
查看>>