OpenGL(2)

笔记总结:

一、贴图原理:几何坐标->纹理坐标(x和y轴上0到1之间的范围)->像素坐标

纹理映射:用纹理坐标制定模型顶点与纹理图像的对应关系  
片段插值:计算非顶点位置的纹理坐标
纹理采样:使用纹理坐标获取纹理颜色

纹理环绕方式(纹理坐标设置为范围以外):OpenGL默认重复(GL_REPEAT)
GL_MIRRORED_REPEAET:镜像重复
GL_CLAMP_TO_EDGE:超出的部分重复纹理坐标的边缘
GL_CLAMP_TO_BORDER:超出的部分是用户指定的边缘的颜色
(float borderColor[] = { 1.0f, 1.0f, 0.0f, 1.0f }; glTexParameterfv(GL_TEXTURE_2D, GL_TEXTURE_BORDER_COLOR, borderColor);)
使用glTexParameter 单独设置每个坐标轴s、t(3D纹理还有一个r)<即xyz> <第一个参数指定纹理目标,第二个参数为哪个纹理轴>
eg.  glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S(T), GL_MIRRORED_REPEAT);

纹理过滤(纹理像素映射到纹理坐标):
GL_NEAREST(邻近过滤):OpenGL默认方式,选择中心点最接近纹理坐标的那个像素。<马赛克/颗粒状样式,能清晰看到组成纹理的像素>
GL_LINEAR(线性过滤):基于纹理坐标附近的纹理像素计算出一个插值,近似出颜色。<更真实/平滑的输出,但边界不清晰导致模糊>
可为放大和缩小设置不同的选项:缩小时使用邻近过滤,放大时使用线性过滤。
eg.  glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN(MAG)_FILTER, GL_NEAREST(GL_LINEAR));

多级渐远纹理(多细节层次):一系列纹理图像,后一个是前一个的二分之一。(glGenerateMipmaps实现/创建)
切换多级渐远纹理级别会产生不真实的生硬边界,所以在两个不同级别之间使用NEAREST和LINEAR过滤。
过滤方式:<参数前面是普通过滤器,后面是多细节过滤器>
GL_LINEAR_MIPMAP_NEAREST 使用最邻近的多级渐远纹理级别来匹配像素大小,并使用线性插值进行纹理采样
GL_NEAREST_MIPMAP_LINEAR 在两个最匹配像素大小的多级渐远纹理之间进行线性插值,并使用邻近插值进行纹理采样
注意:常见产生一个 GL_INVALID_ENUM错误:为多级渐远纹理过滤选项设置放大过滤。这样没有任何效果,因为多级渐远纹理主要使用在纹理被缩。

二、加载和创建纹理
添加SOIL.lib到链接器选项,并在你代码文件的开头加上#include <SOIL.h>

必须使用纹理坐标更新顶点数据:但由于添加了一个额外的顶点属性,必须告诉OpenGL新的顶点格式:
glVertexAttribPointer(2, 2, GL_FLOAT,GL_FALSE, 8 * sizeof(GLfloat), (GLvoid*)(6 * sizeof(GLfloat)));
glEnableVertexAttribArray(2);

并调整前面两个顶点属性的步长参数为8 * sizeof(GLfloat)


纹理单元:纹理的位置值。默认是0,是默认的激活纹理单元。目的是在着色器中可以使用多于一个的纹理。通过把纹理单元赋值给采样器,可以一次绑定多个纹理,只要首先激活对应的纹理单元。(glActiveTexture:传入我们需要使用的纹理单元)

OpenGL至少保证有16个纹理单元可使用,从GL_TEXTURE0到GL_TEXTRUE15,都是按顺序定义。
mix函数:接受两个值作为参数,并对它们根据第三个参数进行线性插值。0.2会返回80%的第一个输入颜色和20%的第二个输入颜色,即混合色。
glUniform1i函数:设置uniform采样器的位置值,保证每个对应着正确的纹理单元。

纹理上下颠倒:OpenGL要求y轴0.0坐标是在图片的底部的,但是图片的y轴0.0坐标通常在顶部。
修复方法:
改变顶点数据的纹理坐标,翻转y值(用1减去y坐标)。
编辑顶点着色器自动翻转y坐标,替换TexCoord的值为TexCoord = vec2(texCoord.x, 1.0f - texCoord.y);。


编程总结:

链接着色器程序时遇到了一些麻烦:

1、链接失败:这是由于粗心导致的,放到项目根目录下的shader.vert和shader.frag都是空的,修改后不再输出错误日志。


2、输出纯色矩形:和预期中的木箱矩形不同,调试了很久才发现...还是因为粗心,把新顶点的格式设置放在了绑定VAO/VBO之前。修改位置后就得到正确结果。


其他步骤都很顺利,有需要源代码的可以在底下留言。


实现效果:

一、木箱矩形


二、顶点颜色和纹理颜色的混合矩形


三、混合纹理矩形







  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
引用:在学习OpenGL 2D方面,有一个可以参考的工程是使用Qt实现的一个将2D纹理贴到球面的项目。该项目还包括混合光和采用了OpenGL ES 3.0。初学者可以通过学习这个项目来了解OpenGL 2D的应用和实现方法。 如果你对OpenGL 2D的学习感兴趣,你可以尝试以下几个步骤来深入学习: 1. 理解OpenGL的基本概念和原理。OpenGL是一个跨平台的图形库,用于渲染2D和3D图形。了解OpenGL的基本概念和工作原理是学习OpenGL 2D的重要基础。可以通过阅读相关的教程或书籍来学习这些概念。 2. 学习OpenGL的绘图函数和API。OpenGL提供了一系列的函数和API,用于绘制2D和3D图形。学习这些函数和API的使用方法,可以帮助你实现各种2D效果。可以通过阅读OpenGL的官方文档或者参考一些教程来学习这些函数和API的使用方法。 3. 熟悉OpenGL的着色器语言。OpenGL使用着色器语言来编写图形的渲染代码。了解如何编写着色器代码可以帮助你实现各种自定义的渲染效果。可以通过阅读相关的教程或者参考一些示例代码来学习这个语言。 4. 参考一些开源项目或者示例代码。通过参考一些已经实现的项目或者示例代码,可以帮助你更好地理解OpenGL 2D的实现方法和技巧。可以尝试去理解这些项目的代码,并且根据自己的需求进行修改和扩展。 总之,学习OpenGL 2D需要一定的基础知识和实践经验。通过阅读教程、参考文档、学习示例代码和实践项目,你可以逐步提升自己的OpenGL 2D编程能力。祝你学习顺利!<span class="em">1</span><span class="em">2</span> #### 引用[.reference_title] - *1* [qt opengl 2d纹理到球面](https://download.csdn.net/download/wanghualin033/10698789)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* [基于OpenGL的计算机图形学实验NURBS曲线算法](https://download.csdn.net/download/weixin_53249260/88236784)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值