OpenGL学习——(3)库函数

2023-11-09

1.定义视口

void ChangeSize(int w,int h){
glViewport(0,0,w,h);//代表窗口中视口的左下角坐标是(0,0)(通常都是0,0),w和h用像素表示
}

在窗口改变大小时接收新的宽和高。glViewport主要完成修改从目的坐标系到屏幕坐标系上的映射。OpenGL可以在这个区域中进行绘图(也称为渲染区域)。

2.背景设置

glClearColor(GLclampf red,GLclampf green,GLclampf  blue,GLclampf alpha);
glClearColor(0.0f,0.0f,1.0f,1.0f);//设置在颜色缓冲区被清除时使用的颜色(参数范围在0.0~1.0之间),alpha参数表示允许光线穿过的程度,值越大透明度越大

3.简单着色器的设置
没有着色器,在OpenGl核心框架中就无法进行任何渲染。

GLShaderManager shaderManager;//需要在***源文件的开头部分声明***一个着色器管理器的实例
//声明后需要在OpenGL初始化时调用InitializeStockShaders方法
shaderManager.InitializeStockShaders();

4.按键控制
注册SpecialKeys回调函数用来控制特殊按键

glutSpecialFunc(SpecialKeys);
//操作完之后需要进行窗口更新
glutPostRedisplay();
//默认调用RenderScene函数更新窗口

5.关于图元的函数

/***********点**********/
void glPointSize(GLfloat size);//设置默认点的大小

GLfloat sizes[2];//存储支持的点大小范围(包含最小值和最大值)
GLfloat step;//存储支持的点大小增量(俩相邻点大小值间的最小步长)
//获取支持的点大小范围和步长(增量)
glGetFloatv(GL_POINT_SIZE_RANGE,sizes);
glGetFloatv(GL_POINT_SIZE_GRANULARITY,&step);

//通过使用程序点大小模式来设置点大小
glEnable(GL_PROGRAM_POINT_SIZE);//在这种模式下可以通过顶点着色器来设置点大小
gl_PointSize=5.0;//大小可以根据自己的需要进行设置

/***********线段********/
//设置线段宽度
void glLineWidth(GLfloat whidth);
//默认逆时针旋转得到的图形是原图的正面,可以通过如下函数改变成顺时针方向旋转得到的是正面
glFrontFace(GL_CW);//恢复的参数是GL_CCW

6.如何使用一个简单的批处理容器

//GLTools库中包含一个简单的容器类——GBatch,可以对图元进行简单批处理的容器使用

//初始化
void GLBatch::Begin(GLenum primitive,GLuint nVerts,GLuint nTextureUnits=0);//声明处理的哪类图元,定点数,一组或俩组纹理坐标(可选)
void GLBatch::CopyVertexData3f(GLfloat *vVerts);//至少要复制一个由3个分量(x,y,z)
void GLBatch::CopyNormalData4f(GLfloat *vNormal);//复制表面法向量
void GLBatch::CopyColorData4f(GLfloat *vColors);//复制颜色
void GLBatch::CopyTexCoordData2f(GLfloat *vTexCoords,GLuint uiTextureLayer);//复制纹理坐标

void GLBatch::End(void);//表明已经完成数据复制工作,并设置内部标记,以通知这个类包含哪些属性

关于批处理容器的一个例子——创建一个三角形

GLBatch triangleBatch;//创建一个容器实例
//设置一个三角形
GLfloat vVerts[]={
-0.5f,0.0f,0.0f,
 0.5f,0.0f,0.0f,
 0.0f,0.5f,0.0f
};
triangleBatch.Begin(GL_TRIANGLES,3);
triangleBatch.CopyVertexData3f(vVerts);
triangelBatch.End();

//调用着色器并绘画
GLfloat vRed[]={1.0f,0.0f,0.0f,1.0f};
shaderManager.UseStockShader(GLT_SHADER_IDENTITY,vRed);
triangelBatch.Draw();

7.剔除

//开启剔除
glEnable(GL_CULL_FACE);
//关闭
glDisable(GL_CULL_FACE);
//剔除(GL_FRONT\GL_BACK\GL_FRONT_AND_BACK)
glCullFace(GL_BACK);//剔除不透明物体的内部几何图形

8.缓冲区的设置
在使用glut设置OpenGL窗口时应该请求一一些缓冲区,设置颜色和深度缓冲区如下:

glutInitDisplayMode(GLUT_DOUBLE|CLUT_RGBA|GLUT_DEPTH);
glEnable(GL_DEPTH_TEST);//启用深度测试

9.多边形模式
可以通过glPolygonMode将多边形渲染成实体、轮廓或只有点

void glPolygonMode(GLenum face,GLenum mode);//face的参数有(GL_FRONT、GL_BACK或GL_FRONT_AND_BACK),mode的参数有(GL_FILL默认、GL_LINE或GL_POINT)

glPolygonMode(GL_FRONT_AND_BACK,GL_LINK);//将多边形正面和背面设置为线框模式
glPolygonMode(GL_FRONT_AND_BACK,GL_POINT);//将多边形正面和背面设置为点云模式

10.调节片段深度值

//可以是深度值产生偏移而并不实际改变3D空间中的物理位置
void glPolygonOffset(GLfloat factor,GLfloat units);//负值将使z值距离我们更近,正值会使移动更远,具体值需要进行试验

11.裁剪
OpenGL允许我们将要进行渲染的窗口制定在一个裁剪框

glEnable(GL_SCISSOR_TEST);//开启裁剪测试
glDisable(GL_SCISSOR_TEST);//关闭裁剪测试

//指定裁剪窗口
void glScissor(GLint x,GLint y,GLsizei width,GLsizei height);//x和y指定裁剪框左下角坐标,width和height为裁剪框的相应尺寸


//一个小例子,对屏幕进行三次清除,叠加出一块重叠的彩色区域

void RenderScene(void){
    //清除一块蓝色区域
    glClearColor(0.0f,01.0f,0.0f);
    glClear(GL_COLOR_BUFFER_BIT);
    //清除一块红色区域并进行裁剪
    glClearColor(1.0f,0.0f,0.0f);
 glScissor(100,100,600,400);
 glEnable(GL_SCISSOR_TEST);
 glClear(GL_BUFFER_BIT);

    //清除一块绿色区域
    glClearColor(0.0f,0.0f,1.0f);
    glScissor(200,200,400,200);
    glClear(GL_BUFFER_BIT);
    //提交裁剪并进行下一步读取
    glDisable(GL_SCISSOR_TEST);
glutSwapBuffers();
}

效果图:
这里写图片描述

12.混合功能
打开混合功能后,新的颜色会与已经存在的颜色值在颜色缓冲区中进行组合。这些颜色的组合方式不同会导致很多不同的特殊效果。

glEnable(GL_BLEND);//打开混合功能

//影响最终颜色的公式
//Cf=(Cs*S)*(Cd*D)
//Cf为最终产生的颜色,Cs是源颜色,Cd是目标颜色,S和D分别是源和目标的混合因子,其设置使用如下函数
glBlendFunc(GLenum S,GLenum D);//S和D都是枚举值

glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA);//混合函数的使用,具体参数可以参考混合参数表

void glBlendFuncSeparate(GLenum srcRGB,GLenum dstRGB,Glenum srcAlpha,GLenum dstAlpha);//为RGB和alpha单独指定混合函数

void glBlendColor(GLclampf red,GLclampf green,GLclampf blue,GLclampf alpha);//修改常量混合颜色初始颜色

这里写图片描述

可以使用的混合方程式如下图:
这里写图片描述

13.抗锯齿
抗锯齿是混合功能中处理的一方面。由于像素是一种近似正方形的,通常可以相当清楚地看到俩种颜色的分界,这些分界就是锯齿。(影响图形的真实性)

//开启混合功能,选择合适的混合方程式
glEnable(GL_BLEND);
glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA);
//对图元进行抗锯齿处理
glEnable(GL_POINT_SMOOTH);//对点进行抗锯齿处理
glEnable(GL_LINE_SMOOTH);//对线进行抗锯齿处理
glEnable(GL_POLYGON_SMOOTH);//对多边形进行抗锯齿处理

14.多重采样
被开启时,点、线段和多边形的平滑特征都将被忽略。其主要用于实心几何图形的处理。

//请求一个多重采样、完全颜色、带深度的双缓冲帧缓冲区
glutInitDisplayMode(GLUT_DOUBLE|GLUT_RGB|GLUT_DEPTH|GLUT_MULTISAMPLE);
//打开和关闭多重采样
glEnable(GL_MULTISAMPLE);
glDisplay(GL_MULTISAMPLE);

多重采样缓冲区在默认情况下使用片段的RGB值,并不包括颜色的alpha成分,我们可以调用glEnable(参数)来修改这个行为:

  • GL_SAMPLE_ALPHA_TO_COVERAGE——使用alpha值
  • GL_SAMPLE_ALPHA_TO_ON——将alpha设置为1并使用
  • GL_SAMPLE_COVERGE——使用glSampleCoverage所设置的值。需要使用如下函数进行设置
void glSampleCoverage(GLclampf value,GLboolean invert);

未完待续……

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

OpenGL学习——(3)库函数 的相关文章

  • OpenGL:仅使用一个帧缓冲区并切换目标纹理

    我是否可以只创建一个帧缓冲区对象并通过在需要时切换其目标纹理来实现相同的结果 而不是使用多个帧缓冲区对象 在所有情况下这都是一个坏主意吗 如果是 为什么 我一直在实现一个功能render SetTargetTexture 在我的程序的 AP
  • 着色器/矩阵问题 - 看不到对象

    我试图在屏幕上放置一个立方体并点亮它 我想要在立方体上添加 phong 阴影 当我运行代码时 我可以看到背景图像 但看不到立方体 我相当确定立方体本身是正确的 因为我已经设法用纯色着色器显示它 我已经设法编译着色器程序 但我根本看不到立方体
  • 将glm四元数转换为旋转矩阵并与opengl一起使用

    所以我将对象的方向存储在 glm fquat 中 我想用它来旋转我的模型 我怎么做 我试过这个 glPushMatrix glTranslatef position x position y position z glMultMatrixf
  • 对 VBO 中的特定三角形使用不同的纹理

    我有 9 个由三角形组成的四边形 如下所示 我在用着VBO存储有关它们的数据 它们的位置和纹理坐标 我的问题是 是否可以仅使用一个来使四边形 5 具有与其余四边形不同的纹理VBO and shader 绿色代表纹理 1 黄色代表纹理 2 到
  • 没有着色器的 OpenGL

    我已经阅读了一些教程来编写以下代码 唯一的区别是原始教程使用 SDL 而不是 GLEW 我不明白这段代码有什么问题 它可以编译 但我没有看到三角形 教程也没有使用着色器 include
  • 使用 openGL、SOIL 加载图像

    我尝试了很多使用 SOIL 在 openGL 中加载和显示图像的示例 运行下面的源代码时 它仅显示一个没有图像的白色四边形 我尝试打开一个名为 foto 的图像 我将图像文件放在程序的文件夹中 bool keyStates new bool
  • OpenGL 的每个组件 alpha 通道?

    是否可以使用 OpenGL 对每个组件使用一个 alpha 通道 一个用于红色 一个用于绿色 一个用于蓝色 进行混合 如果没有 有哪些可能的解决方法 这不是直接支持的东西 不过 您自己实现起来相当容易 使用 3 通道 alpha 纹理渲染三
  • OpenGL 和加载/读取 AoSoA(混合 SoA)格式的数据

    假设我有以下 AoSoA 格式的简化结构来表示顶点或点 struct VertexData float px 4 position x float py 4 position y 也就是说 每个实例VertexData存储4个顶点 我见过的
  • gluPerspective 与 gluOrtho2D

    我查看了 MSDN 上关于这两个函数的文档 但是 我不太明白这两个功能之间的区别 一个是用于设置 3D 相机视图 另一个是用于设置 2D 相机视图 如果能得到解答就太好了 预先感谢您的评论 正交投影基本上是没有透视的 3D 投影 本质上 这
  • 使用 Qt 在 xoverlay 之上绘制

    我希望在使用 Xoverlay 渲染的视频流之上绘制一些 UI 我正在使用 gstreamer 播放视频并使用 xoverlay 在 xvimagesink 上渲染它 我的小部件继承自 QGLWidget 我希望使用 QPainter 绘制
  • 使用 glDrawElements 时在 OpenGL 核心配置文件中选取三角形

    我正在使用 glDrawElements 绘制三角形网格 并且希望能够使用鼠标单击来拾取 选择三角形 三角形的网格可以很大 在固定功能 OpenGL 中 可以使用 GL SELECT http content gpwiki org inde
  • 为什么我的 FPS 相机一劳永逸地滚动?

    如果我忽略四元数代数的肮脏细节 我想我理解了旋转和平移变换背后的数学 但仍然不明白我做错了什么 为什么我的相机一劳永逸地滚动 更具体地说 我应该如何从相机的方向 旋转矩阵 计算相机视图矩阵 我正在用 Python 编写一个简约的 3d 引擎
  • 如何将点光源转换为卵形/椭圆形?

    我希望通过具有不同 x 和 y 值的 vec2 半径将当前的圆形光变成椭圆形 有没有办法根据我当前在片段着色器中的代码来做到这一点 uniform struct Light vec4 colour vec3 position vec2 ra
  • OpenGL 中连续暂停

    void keyPress unsigned char key int x int y int i switch key case f i 3 while i x pos 3 sleep 100 glutPostRedisplay 上面是在
  • 阻止 OpenGL.framework 在 Cocoa 应用程序中加载

    我的应用程序链接到这些框架 Cocoa Framework AppKit Framework CoreData Framework Foundation Framework 请注意 OpenGL Framework 是NOT已链接 但是 设
  • 使用 OpenGL 着色器进行数学计算 (C++)

    我有一个矩阵 例如 100x100 尺寸 我需要对每个元素进行计算 matrix i j tt 8 5例如 我有一个巨大的矩阵 我想使用 OpenGL 着色器来实现该算法 我想使用着色器 例如 uniform float val unifo
  • 为什么OpenGL使用float而不是double? [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 无法在 WSL2 上运行 OpenGL

    我尝试在 WSL2 上运行 OpenGL 代码 但在尝试运行可执行文件时出现以下错误 GLFW error 65543 GLX Failed to create context GLXBadFBConfig Unable to create
  • OpenGL - 两个纹理的幂

    OpenGL 使用二次幂纹理 这是因为由于 MipMapping 某些 GPU 只接受 2 的幂纹理 当绘制比实际更大的纹理时 使用这些二次方纹理会导致问题 我想到了一种方法来解决这个问题 即仅在我们使纹理小于实际大小时使用 PO2 比率
  • 在 2D 纹理上绘制的红色矩形在绘制后立即消失

    跟随我的另一个问题 https stackoverflow com questions 18477291 render an outlined red rectangle on top a 2d texture in opengl 1847

随机推荐

  • hive解析json数据

    hive 处理json数据总体来说有两个方向的路走 1 将json以字符串的方式整个入Hive表 然后通过使用UDF函数解析已经导入到hive中的数据 比如使用LATERAL VIEW json tuple的方法 获取所需要的列名 2 在导
  • 【Android之SmartImageView图片控件】

    源码地址是https github com loopj android smart image view 没有sample 本文最后会提供一个sample smartimageview提供的主要功能有 1 继承ImageView控件 在原生
  • 2014年1月2日星期四(流水线-UVN系统的实现)

    方位角A是绕 Y轴旋转的角度 与 Z轴重叠时为0度 仰角B是方向向量与地平面 X Z平面 之间的夹角 假定为右手坐标系 则 r psinB y pcosb z rcosA x rsinA 初始化UVN相机 先赋值给各个朝向 void ddr
  • 服务器异常 虚拟登陆,服务器登陆异常

    服务器登陆异常 内容精选 换一换 通过Web浏览器登录资源 会话连接断开 提示网络连接异常 连接已断开 请重试 Code T 1006 云堡垒机系统与资源服务器之间网络连接不稳定 导致连接断开 云堡垒机或资源服务器的带宽超限 导致连接断开
  • C#知识系列:GCHandleType的作用

    总结 Normal 对象被标记为完全不被GC管理的状态 但会被GC移动内存位置 需要我们手动调用Free来释放对应的GC对象 Pinned 对象被标记为完全不被GC管理的状态 不被GC回收也不被GC移动内存地址 需要我们手动调用Free来释
  • 探究Cache缓存功能---【pytest】

    前言 pytest运行完用例之后会生成一个 pytest cache的缓存文件夹 用于记录用例的ids和上一次失败的用例 1 跑自动化时经常会出现这样一个情况 一轮自动化跑完后零星出现了几个失败测试用例 无法断定失败的原因 所以可能需要重新
  • MQTT订阅和发送实战(JAVA)

    本列子使用MQTT EMQX Springboot 1 在pom xml中引入依赖
  • c语言完数并求出输出其因子,找出n之内的完全数, 并输出其因子

    定义 完全数 所有的真因子 即除了自身以外的约数 的和 恰好等于它本身 例如 第一个完全数是6 它有约数1 2 3 6 除去它本身6外 其余3个数相加 1 2 3 6 第二个完全数是28 它有约数1 2 4 7 14 28 除去它本身28外
  • 【Linux】基本指令(上)

    文章目录 前言 什么是操作系统 简单说明 文件 重要 文件之间 指令操作详解 知识点 clear 和 ls pwd cd whoami touch stat rmdir和rm rmdir rm man cp mv cat tac more
  • python应用-工资计算

    工资计算 Author 罗万财 Date 2017 6 8 salary float input 请输入工资 insurance float input 五险一金 diff salary insurance 3500 if diff lt
  • 【深度学习】计算机视觉(十)——Faster RCNN(实践篇)

    文章目录 写在最前面 step1 相关说明 step2 Prerequisites 安装要求 tensorflow gpu 1 安装和测试 2 错误提示 numpy版本 tensorflow版本 TensorRT step3 Install
  • VS code怎么终止正在运行的文件

    很简单 第一种方法 简单 快捷 Shift F5 第二种方法 1 第一步 点击最左侧运行和调试按钮后程序会开始运行 2 可以看到左侧调用堆栈 将鼠标放在下面类目 正在运行处 会出现 停止 按钮 点击即可
  • CSS3_03:各种卡券优惠券模板制作,开箱即用,学得会,用得着

    本文首发于微信公众号 布依前端 微信号 qny 1009 转载请注明出处 原创不易 觉得有用的话 多转发点赞支持 作为前端开发者 经常碰到不规则元素需求 尤其是购物类的优惠券 元素长相怪异 没有接触过就会犯懵 见多识广 会者不难 安利一波这
  • 网页在线视频下载教程(m3u8格式介绍及下载教程)

    简介 m3u8文件是苹果公司使用的HTTP Live Streaming HLS 协议格式的基础 HLS是新一代流媒体传输协议 其基本实现原理为将一个大的媒体文件进行分片 将该分片文件资源路径记录与m3u8文件 即playlist 内 其中
  • android studio Flutter开发好用的插件

    Dart 必备 Flutter 必备 Flutter Enhancement Suite Flutter代码增强提示 WidgetGenerator 自动生成Widget接口 flutter img sync 自动同步照片路径
  • Hibernate 超简单的一对多和多对一查询

    这里使用的Teacher类和Student类 假设一个Teacher对应多个学生 一个学生对应一个老师 所需jar包 开始建表 1 表名 teacher 2 表名 student 主键都为自增长 创建实体类 Teacher类 package
  • 论文阅读——Temporal Convolutional Attention-based Network For Sequence Modeling

    https arxiv org pdf 2002 12530 pdf 代码 https github com haohy TCAN 用于序列建模的基于注意力的时序卷积网络 作者提出一种时序卷积注意力网络 Temporal Convoluti
  • shell 遍历当前目录以及所有子目录下文件

    bin bash file count 0 folder count 0 function TRAVEL ALL FILE for file in do if f file then normal file echo file file c
  • 干货分享

    如今 随着诸如互联网以及物联网等技术的不断发展 越来越多的数据被生产出来 据统计 每天大约有超过2 5亿亿字节的各种各样数据产生 这些数据需要被存储起来并且能够被方便的分析和利用 随着大数据技术的不断更新和迭代 数据管理工具得到了飞速的发展
  • OpenGL学习——(3)库函数

    1 定义视口 void ChangeSize int w int h glViewport 0 0 w h 代表窗口中视口的左下角坐标是 0 0 通常都是0 0 w和h用像素表示 在窗口改变大小时接收新的宽和高 glViewport主要完成