OpenGl 未找到glGenBuffers ?如何理解OpenGL中着色器

发表时间:2018-01-24 13:48:02 作者: 来源: 浏览:

在上一篇文章中,小编为您详细介绍了关于《美国制造的产品有哪些是中国产品无法替代的?苹果已经堕落成美国的三星》相关知识。本篇中小编将再为您讲解标题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盘启动》,感兴趣的同学可以点击进去看看。

资源转载网络,如有侵权联系删除。

相关资讯推荐

相关应用推荐

玩家点评

条评论

热门下载

  • 手机网游
  • 手机软件

热点资讯

  • 最新话题