OpenGL
文章平均质量分 78
家家的快乐空间
这个作者很懒,什么都没留下…
展开
-
OpenGL(QT平台)学习与实战(十五)
这里写目录标题创建一个光照场景框架搭建绘制背景颜色添加着色器创建一个光照场景框架搭建新建项目设置窗口名称设置窗口icon选择图片即可设置样式添加相应的action拖动到工具栏处添加openglwidget设置openglwidget填充整个窗口接着要重载QopenGLWidget中的一些函数,因此我们新建一个子类去继承它:修改相关代码将OpenGJWidget提升为自定义类至此,通用的框架已经搭建完毕。绘制背景颜色void ZJJOpen原创 2021-10-31 16:53:23 · 492 阅读 · 0 评论 -
OpenGL(QT平台)学习与实战(十四)
调整摄像机位置观测空间摄像机/观察空间当我们讨论摄像机/观察空间(Camera/View Space)的时候,是在讨论以摄像机的视角作为场景原点时场景中所有的顶点坐标:观察矩阵把所有的世界坐标变换为相对于摄像机位置与方向的观察坐标。要定义一个摄像机,我们需要它在世界空间中的位置、观察的方向、一个指向它右测的向量以及一个指向它上方的向量。摄像机位置摄像机位置简单来说就是世界空间中一个指向摄像机位置的向量:QVector3D cameraPos = QVector3D(0.0f, 0.0f, 3.0原创 2021-10-21 15:09:27 · 830 阅读 · 3 评论 -
OpenGL(QT平台)学习与实战(十三)
坐标系统将坐标变换为标准化设备坐标,接着再转化为屏幕坐标的过程通常是分步进行的,也就是类似于流水线那样子。在流水线中,物体的顶点在最终转化为屏幕坐标之前还会被变换到多个坐标系统(Coordinate System)。将物体的坐标变换到几个过渡坐标系(Intermediate Coordinate System)的优点在于,在这些特定的坐标系统中,一些操作或运算更加方便和容易,这一点很快就会变得很明显。对我们来说比较重要的总共有5个不同的坐标系统:局部空间(Local Space)世界空间(World原创 2021-10-20 15:17:09 · 340 阅读 · 0 评论 -
OpenGL(QT平台)学习与实战(十二)
向量、矩阵及线性变换的代码实现OpenGL没有自带任何的矩阵和向量知识,所以我们必须定义自己的数学类和函数。所幸的是,QT为我们封装了相关的线性代数的库,我们可以方便地进行线性代数计算。下面我们直接演示一个例子。首先修改顶点着色器的代码,对顶点进行旋转:#version 330 corelayout (location = 0) in vec3 aPos;layout (location = 1) in vec3 aColor;layout (location = 2) in vec2 aTex原创 2021-10-18 17:17:58 · 252 阅读 · 0 评论 -
OpenGL(QT平台)学习与实战(十一)
纹理过滤纹理坐标不依赖于分辨率(Resolution),它可以是任意浮点值,所以OpenGL需要知道怎样将纹理像素映射到纹理坐标。当你有一个很大的物体但是纹理的分辨率很低的时候这就变得很重要了。OpenGL也有对于纹理过滤(Texture Filtering)的选项。纹理过滤有很多个选项,但是现在我们只讨论最重要的两种:GL_NEAREST和GL_LINEAR。Texture Pixel也叫Texel,你可以想象你打开一张.jpg格式图片,不断放大你会发现它是由无数像素点组成的,这个点就是纹理像素;注原创 2021-10-18 16:09:07 · 895 阅读 · 0 评论 -
OpenGL(QT平台)学习与实战(十)
纹理环绕方式纹理坐标的范围通常是从(0, 0)到(1, 1),那如果我们把纹理坐标设置在范围之外会发生什么?float vertices[] = {// ---- 位置 ---- ---- 颜色 ---- - 纹理坐标 - 0.9f, 0.9f, 0.0f, 1.0f, 0.0f, 0.0f, 2.0f, 2.0f, // 右上 0.9f, -0.9f, 0.0f, 0.0f, 1.0f, 0.0f, 2.0f, -1.0f,原创 2021-10-18 11:38:49 · 235 阅读 · 0 评论 -
OpenGL(QT平台)学习与实战(九)
纹理单元我们可以给纹理采样器分配一个位置值,这样的话我们能够在一个片段着色器中设置多个纹理。一个纹理的位置值通常称为一个纹理单元(Texture Unit)。一个纹理的默认纹理单元是0,它是默认的激活纹理单元,所以教程前面部分我们没有分配一个位置值。纹理单元的主要目的是让我们在着色器中可以使用多于一个的纹理。通过把纹理单元赋值给采样器,我们可以一次绑定多个纹理,只要我们首先激活对应的纹理单元。OpenGL至少保证有16个纹理单元供你使用,也就是说你可以激活从GL_TEXTURE0到GL_TEXTRUE原创 2021-10-18 09:34:23 · 246 阅读 · 0 评论 -
OpenGL(QT平台)学习与实战(八)
加载纹理当我们需要给图形赋予复杂的颜色的时候,不大可能使用前面的方法,为每一个顶点指定第一个颜色。通常我们会采用纹理贴图。每个顶点关联一个纹理坐标。之后在图形的其他片段上进行片段插值。我们的工作:告诉OpenGL该怎样对纹理采样。纹理坐标在x和y轴上,范围为0到1之间(注意我们使用的是2D纹理图像)。使用纹理坐标获取纹理颜色叫做采样(Sampling)。纹理坐标起始于(0, 0),也就是纹理图片的左下角,终始于(1, 1),即纹理图片的右上角。我们为三角形指定了3个纹理坐标点。我们希望三角形的原创 2021-10-17 23:01:03 · 298 阅读 · 0 评论 -
OpenGL(QT平台)学习与实战(七)
着色器编程原创 2021-10-17 16:09:12 · 491 阅读 · 0 评论 -
OpenGL(QT平台)学习与实战(五)
使用多个三角形拼成矩形索引缓冲对象在渲染顶点这一话题上我们还有最后一个需要讨论的东西——索引缓冲对象(Element Buffer Object,EBO,也叫Index Buffer Object,IBO)。要解释索引缓冲对象的工作方式最好还是举个例子:假设我们不再绘制一个三角形而是绘制一个矩形。我们可以绘制两个三角形来组成一个矩形(OpenGL主要处理三角形)。这会生成下面的顶点的集合:float vertices[] = { // 第一个三角形 0.5f, 0.5f, 0.0f,原创 2021-10-16 10:13:05 · 284 阅读 · 0 评论 -
OpenGL(QT平台)学习与实战(六)
QT交互通过QT的控件动作进行交互,可以实现用户控制绘制、清空和切换模式。如果需要从painGL()以外的位置触发重新绘制(典型示例是使用计时器设置场景动画),则应调用widget的update()函数来安排更新。调用paintGL()、resizeGL()或initializeGL()时,widget的OpenGL呈现上下文将变为当前。如果需要从其他位置(例如,在widget的构造函数或自己的绘制函数中)调用标准OpenGL API函数,则必须首先调用makeCurrent()。定义绘图状态原创 2021-10-16 16:11:53 · 634 阅读 · 0 评论 -
OpenGL(QT平台)学习与实战(四)
编译链接着色器顶点着色器顶点着色器(Vertex Shader)是几个可编程着色器中的一个。如果我们打算做渲染的话,现代OpenGL需要我们至少设置一个顶点和一个片段着色器。我们会简要介绍一下着色器以及配置两个非常简单的着色器来绘制我们第一个三角形。我们需要做的第一件事是用着色器语言GLSL(OpenGL Shading Language)编写顶点着色器,然后编译这个着色器,这样我们就可以在程序中使用它了。下面你会看到一个非常基础的GLSL顶点着色器的源代码:#version 330 corela原创 2021-10-15 15:54:30 · 288 阅读 · 0 评论 -
OpenGL(QT平台)学习与实战(三)
绘制一个三角形图形渲染管线(Pipeline)在OpenGL中,任何事物都在3D空间中,而屏幕和窗口却是2D像素数组,这导致OpenGL的大部分工作都是关于把3D坐标转变为适应你屏幕的2D像素。3D坐标转为2D坐标的处理过程是由OpenGL的图形渲染管线(Graphics Pipeline,大多译为管线,实际上指的是一堆原始图形数据途经一个输送管道,期间经过各种变化处理最终出现在屏幕的过程)管理的。图形渲染管线可以被划分为两个主要部分:第一部分把你的3D坐标转换为2D坐标,第二部分是把2D坐标转变为实原创 2021-10-15 12:08:20 · 588 阅读 · 0 评论 -
OpenGL(QT平台)学习与实战(二)
创建窗口任务要求:使用QT创建一个窗口。普通的QT窗口:用于OpenGL绘图的窗口QOpenGLWidget代替GLFWQOpenGLWidget提供了三个便捷的虚函数,可以重载,用来重新实现典型的OpenGL任务:panintGL:渲染OpenGL场景。widget需要更新时调用。resizeGL:设置OpenGL视口、投影等。widget调整大小(或首次显示)时调用initializeGL:设置OpenGL资源和状态。第一次调用resizeGL()/paintGL()之前原创 2021-10-14 16:09:04 · 632 阅读 · 0 评论 -
OpenGL(QT平台)学习与实战(一)
参考资料:LearnOpenGL CN《现代OpenGL:1入门篇,2021 Qt实现版》OpenGL我们先了解一下OpenGL到底是什么。一般它被认为是一个API(Application Programming Interface, 应用程序编程接口),包含了一系列可以操作图形、图像的函数。然而,OpenGL本身并不是一个API,它仅仅是一个由Khronos组织制定并维护的规范(Specification)。OpenGL规范严格规定了每个函数该如何执行,以及它们的输出值。至于内部具体每个函数是原创 2021-10-14 13:46:27 · 1108 阅读 · 0 评论