问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

LearnOpenGL 入门篇 纹理

发布网友 发布时间:2024-10-22 11:55

我来回答

1个回答

热心网友 时间:2024-10-24 14:10

在 LearnOpenGL 教程中,使用 stb_image.h 加载图片时,通常会将其包含在 main.cpp 的顶部。但教程对此描述不够清晰。实际上,通常只需在 main.cpp 中包含这两行命令,而不必将其放入单独的 .cpp 文件中,随后像 glad.c 那样将此文件添加至项目工程中。具体原因尚不明确,为何将其置于 main.cpp 中会导致错误,而创建一个空白的 .cpp 文件则可以正常工作。关键在于,stb_image.h 只需包含一次,因为 stb.cpp 文件中已经包含了它,所以不必在 main.cpp 中重复包含。

引入头文件后,使用以下命令加载图片:

unsigned char* data = stbi_load("E:/VSFile/LearnOpenGL/tex/container.jpg", &width, &height, &nrChannels, 0);

在尝试加载图片时,可能会遇到一些小问题。这可能源于代码与教程的不完全同步,导致内存溢出错误。最初,作者以为是图片读取失败,或未正确包含 stb_image.h。但在尝试在空白的 .cpp 文件中单独加载图片后,发现图片被正确读取,从而确认了 stb_image.h 的正确性及其使用方法。

研究后发现,问题可能出在教程中使用了索引缓冲对象 EBO,而未注意到这一点,导致使用了错误的绘制命令,如 glDrawArrays(GL_TRIANGLES, 0, 6),四个顶点绘制六个顶点,从而引发了内存错误。将绘制方法更改为使用索引绘制(如 glDrawElements)即可解决问题。

总结而言,遇到大段代码时,先创建一个空白的 .cpp 文件来测试新函数或工具,以确保其功能无误。同时,仔细阅读代码是避免错误的关键。

在学习 OpenGL 时,需要处理纹理。生成纹理对象的方式类似于创建顶点数组对象(VAO)和顶点缓冲对象(VBO)。首先,创建一个无符号整数变量,如 basecolor,并将其绑定到一个纹理对象上,如下所示:

unsigned int basecolor;
glGenTextures(1, &basecolor);
glBindTexture(GL_TEXTURE_2D, basecolor);

接下来,使用 stbi_load() 函数加载图片,并将数据通过 glTexImage2D() 函数传递给 GPU 的内存中。同时,生成 mipmaps 以提高纹理质量。此过程确保纹理存在于 GPU 的内存中。

为了在片段着色器中使用纹理,需要创建一个采样器(Sampler)类型的统一变量。使用此采样器从 GPU 的纹理内存中获取数据。然而,创建采样器变量并不需要设置其值,因为 OpenGL 知道从哪个纹理内存中获取数据。每个采样器通过激活对应的纹理单元来识别不同的纹理。例如,激活纹理单元 0 并绑定纹理 basecolor,然后激活纹理单元 1 并绑定另一个纹理,如 specularity map。这样,片段着色器可以访问多个纹理。

片段着色器通过采样器访问纹理,如下所示:

uniform sampler2D basecolor;
uniform sampler2D specularMap;

然后,使用以下代码设置采样器位置:

glUniform1i(glGetUniformLocation(ourShader.ID, "basecolor"), 0);
glUniform1i(glGetUniformLocation(ourShader.ID, "specularMap"), 1);

最后,片段着色器可以轻松地访问和处理这些纹理数据。在实际应用中,纹理单元的数量(最多 16 个)通常由图形 API 和硬件*决定。

以上内容详细介绍了如何在 OpenGL 中加载和使用纹理,从加载图片到在着色器中使用纹理,涵盖了从基础到高级的各个阶段。
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
...换手机号显示你以设置拒收微信登陆.换绑.注册短信怎么解决? 伊拉克战争是哪些国家发动的?请快回答,我有急用! 二零零三年三月谁发动了对伊拉克的战争 西门子、美的、容声三个门的冰箱那个牌子又省电又实用? 海尔冰箱BCD-206 SCFM 放3档工作多长时间 ,停多长时间正常 海尔BCD-206SCFM基本参数 6年级上册数学练习册百分数50到53页答案 小学数学六年级(上):帮你学数学口算练习册2008年印刷版信息 小学数学六年级(上):帮你学数学口算练习册2010年印刷版信息 小学六年级数学上册百分数练习册《课堂作业本》答案64面第2题 openGL纹理,我给disingenuous上放置的物体贴纹理,为什么贴到地形上去... OpenGL自学笔记(五)(纹理映射) Vulkan & OpenGL 纹理共享与同步 OpenGL 2D纹理单元&纹理翻转解决策略 opengl的纹理怎么弄成反的 17岁女生 毛孔大~ 要用那个牌子的爽肤水比较收缩毛孔~· 现在什么牌子的爽肤水好用呢?我16岁用那个爽肤水好呢? 敏感肌肤如何修复好 内调外养的护肤小技巧有哪些? 敏感肌必知的夏季护肤知识内调外养!! 皮肤的内调和外养如何同步进行呢? 老婆能带她去世奶奶的护身符吗? 网络用语cpu都给我烧了是什么梗-cpu都给我烧了梗意思及出处分享 在武林外传,如何使用真气石 武林外传中生命石、真气石、抗虚弱石、抗缓慢石有什么实际意义? cad如何处彩图 关于国庆节带孩子玩心情说说 刘任洋主要经历 春秋学社社团简介 ...但是客服说没有发票,这种类型的消费不能开发票吗? MipmapOpenGL中的Mipmap纹理贴图 50-60岁每周游泳几次最佳 北京市人民政府关于废止《北京市人民政府关于加强农村村民建房用地管 ... ...房地产中介服务管理规定住房和城乡建设部关于废止《规定》的决定 左肺tb是什么意思? 下葬墓前放什么东西辟邪 急!请教一下,我的外公去世了,他的护身符能不能随骨灰箱一起下葬? 游泳健身有副作用吗 想知道长期去游泳池游泳怎么样,游泳水不干净会不会吸进身体对身体不好... 游泳如何避免感染疾病 什么样的洗液效果最好呢 小倩同学知识比较渊博,同学们私下都称他为小博士,同学们的这种行为... 我们班级39人 特等 一等 二等 三等各有多少人啊?各有多少钱啊谢谢 我也... 班级有39名同学只来了4名同学请问到访率是多少? ...个班级的人数分别是39人40人38人40人42人三年级大约有多少人... 五一班有39人,其中八人是班级干部,班级干部的人数占全班人数的几分之... 要求排名在班级前35%,班里一共39人,那第几名算前35% ...当时和他一块的还有一个女的,但看样子不像两口子,而且那个女的嫌弃房... 准备工训赛浪费时间吗 谁有《我的青春岁月》黄军 徐静的那个:发邮箱pi_aomiao521@126.com... 经常游泳会对身体好,但会同时产生副作用吗?