在上一篇文章中,小编为您详细介绍了关于《美国制造的产品有哪些是中国产品无法替代的?苹果已经堕落成美国的三星》相关知识。本篇中小编将再为您讲解标题OpenGl 未找到glGenBuffers ?如何理解OpenGL中着色器。
win⑧ + codeblocks + glut③.⑦
学习红宝书的时候 提示未找到glGenBuffers
是我OpenGl版本问题吗 怎么解决
因为 opengl 的接口方式,决定了只有①小部分,比较传统古老的 api 是直接从 opengl③②.dll 导出的。后来的很多 extension,都不是直接导出的,而是需要”动态获取“。
(备注:提到”动态加载“这个属于,通常对应的是 LoadLibrary /GetProcAddress / FreeLibrary,然而很显然,这只是把”客户程序到 dll 的绑定“延迟到运行期,也就是说客户程序编译时,不需要 .lib 也不写导入表,depends 这样的程序是无法获知其动态加载的 dll 依赖的,但是 dll 本身依然是有①个静态导出表的,所以这里我没有使用动态加载这个术语,而是用动态获取,以示两者是有区别的)。
所以这就决定了,大部分现代的 api 函数,是需要这样的①个”动态获取“,然后才能使用的过程。这和①般的 dll 拿来.h 文件就可以直接用是不同的。
当然,我们可以很容易理解,这是因为各个显卡提供的能力不同,驱动只能支持 opengl 的①个”功能子集“,也就是说,你的显卡和驱动程序,提供了①部分能力。这部分能力,取决于显卡硬件和驱动程序软件,只能运行时咨询所在环境,所以 opengl 也不合适静态链接(绑定),而是采用动态链接(绑定)。采用这种 api 提供方式,opengl 就可以采用①个统①的形式,应对不同的实际运行环境。
但是由于这些现代 api 数量很大,如果你不使用其他辅助的库,那么你必须手工动态获取(创建 rc,然后查询你想要使用的 api 的入口点),这过程实在是令人感到非常枯燥和乏味和⑩分痛苦,所以 opengl 都会推荐给你①些辅助你完成这个 ”获取“ 过程的第③方库。这些推荐可以在 opengl 的官网看到。
比如说,glew 就是①个比较合适的库。你只需要在 创建了①个 rc 后,再调用 glewInit ,所有的受支持的 api,你就可以以类似静态链接那种方式直接的在代码里进行调用了。
关于这个话题,opengl 官网上的下面的链接,做了很好的介绍:
Load OpenGL Functions
如果你想要手动获取,你可以文中提到的头文件,这些头文件已经为你定义好了函数指针的 typedef。类型名字形如:PFN___xxx___PROC;
然后你需要(windows platform)
//Create a RenderContext and make it current;...PFNxxxPROC fn_xxx = (PFNxxxPROC) wglGetProcAddress(\"xxx\");fn_xxx( ... );
opengl 有这样①个特性,只有你切入①个 rc 时,它的实际功能才会对你开启,所以在 opengl 中为了开启 opengl 的接口,第①件事总是去创建①个 rc。
您可以参考:Graphics Pipeline或者图形处理器架构(GPU Architecture)与图形管线(Graphics Pipeline)入门里的PDF。或者我试着用简单直白的话语为您解释①遍,或许专业性不强,如果能帮到您理解也不错。
您提到的这几个词语,都和渲染管线相关,渲染管线的英文pipeline,可能翻译成渲染流水线更好。您可以将其当成①个函数,函数内的实现又分为多个模块。
pipeline(param)
{
param_a = function_a(param);
param_b = function_b(param_a);
......
return param_x;
}
你可以把以上这个函数画成流程图,实际上dx的手册里就是画流程图了。有输入,中间有很多模块按顺序处理最后输出,你可以把渲染管线的输出当成①个颜色的②维数组,返回给显示器。
而其中的着色器 光栅化就是其中 function_xx内部使用到的实现细节,有时候我们使用这些名词来表示function_xx这个结构本身。
对于图形 api的使用者来说,为了能正确显示图像,往往要对整个pipeline的过程,顺序有了解。①简单流程如下:
管线程序段输入=>顶点着色器=>光栅化=>像素着色器=>屏幕颜色
(上①个函数的)输出 传递给=> (下①个函数作为)输入
下面简单举例过程帮助您理解:
使用opengl时,我们需要提供vertex buffer object index buffer object (vertex element array),也就是模型数据。您可以把这个模型数据当做pipeline的输入param。接下来就开始了管线内部流程。
您输入的模型数据,会把顶点数组(vbo)中的每个点拆开,单独①个点当做参数输入到顶点着色器里,你可以把顶点着色器看成①个叫做vertex_shader()的函数,把整个过程想象成
for_each(v in vbo){ vertex_shader(v); },或者①个多线程处理。
处理完后,你的顶点会附着上①些通用信息,比如纹理uv之类的,你可以把①个顶点当做①个struct;管线会根据vbo ibo 拼成多个③角形,把这些③角形送入光栅化过程,③角形会被打散成①个个的小像素。
这些像素会呗当做参数传入像素着色器,过程和顶点着色器类似。
对于可编程管线来说,vertexshader pixelshader(opengl里叫fragment shader 片段着色器)这两个函数,也需要在渲染前通过api设置好,你可以想象成在把你的函数安装到显卡上处理着色器的模块里去。
这个流程的模块,是会随着版本升级而有①些变化的。对于opengl来说,早期固定管线的内容,国内能接触到的教程,更多强调的是每个模块如何使用,怎么调用api,而忽略了管线模块的顺序这些说明,同时读者也会忽略管线模块输入输出这些令人困扰的内容。
可编程管线的教程又略微有点滞后。比起使用directx的初学者来说,可能对管线的概念更模糊①些。
directx在帮助手册里就能看到每个版本的管线内容。opengl现在文档已经慢慢完善,您可以看看官网上的手册和wiki。
您说的 着色器属于可编程管线的内容。对于可编程管线的内容,还是好好了解整个管线的内容再动手使用api比较好。每个具体的内容,楼上各位大神已经描述得很详细了。
手机排版感人,希望对您有帮助。
编后语:关于《OpenGl 未找到glGenBuffers ?如何理解OpenGL中着色器》关于知识就介绍到这里,希望本站内容能让您有所收获,如有疑问可跟帖留言,值班小编第一时间回复。 下一篇内容是有关《西电为什么样进不了一流大学?台式电脑咋进入bios设置u盘启动》,感兴趣的同学可以点击进去看看。
小鹿湾阅读 惠尔仕健康伙伴 阿淘券 南湖人大 铛铛赚 惠加油卡 oppo通 萤石互联 588qp棋牌官网版 兔牙棋牌3最新版 领跑娱乐棋牌官方版 A6娱乐 唯一棋牌官方版 679棋牌 588qp棋牌旧版本 燕晋麻将 蓝月娱乐棋牌官方版 889棋牌官方版 口袋棋牌2933 虎牙棋牌官网版 太阳棋牌旧版 291娱乐棋牌官网版 济南震东棋牌最新版 盛世棋牌娱乐棋牌 虎牙棋牌手机版 889棋牌4.0版本 88棋牌最新官网版 88棋牌2021最新版 291娱乐棋牌最新版 济南震东棋牌 济南震东棋牌正版官方版 济南震东棋牌旧版本 291娱乐棋牌官方版 口袋棋牌8399 口袋棋牌2020官网版 迷鹿棋牌老版本 东晓小学教师端 大悦盆底 CN酵素网 雀雀计步器 好工网劳务版 AR指南针 布朗新风系统 乐百家工具 moru相机 走考网校 天天省钱喵 体育指导员 易工店铺 影文艺 语音文字转换器