OpenGL
OpenGL
六月的翅膀
人生本是无根草,醉了何必问家乡
展开
-
OpenGL:关于渲染窗口在主屏和扩展屏上纹理贴图不一致的问题
自己写了一个例子,将图像纹理贴图到窗口,并且可以设置窗口的起始位置。查看一下自己主屏和扩展屏的分辨率,果然,主屏和副屏的缩放不一致。如果您使用的是多个显示器,请确保每个显示器的分辨率都正确。当设置渲染窗口在主屏时,渲染的结果如下。但是当设置窗口显示在扩展屏时,效果如下。修改之后再测试一下。可以看出纹理没有显示完整。原创 2024-01-19 17:13:24 · 504 阅读 · 0 评论 -
OpenGL:关于纹理映射时任意四边形中的插值问题(二)
上次是使用逆双线性插值的方法解决四边形纹理映射时产生的折痕问题。具体就是,和逆双线性一样,都不能使用OpenGL自带的插值。其实也有点问题,就是双线性插值会使得纹理产生一点扭曲。想达到纹理投影的效果,可以使用透视插值。关于将变换矩阵传给着色器的问题。就需要在着色器中修改。原创 2024-01-18 12:00:59 · 596 阅读 · 2 评论 -
OpenGL:关于纹理映射时任意四边形中的插值问题
但是,我纹理贴图时的纹理顶点有四个,由两个三角形组成,当两个三角形组成矩形时,没什么问题,当其中的某个顶点移动时,就变成下图右的情况,此时就出现了问题。但是上面还有点缺点,上面这种方式相当于没有使用OpenGL内部的插值,而是自己做的插值,就是找到uv坐标,直接去纹理中取对应像素值。在计算得到uv坐标后,可以接着进行一次双线性插值,这个插值,是在纹理中取值的这个过程中做的。关于双线性插值,就是给定一个四边形的四个顶点坐标和某个uv坐标,然后通过uv计算出UV坐标对应的顶点坐标插值坐标。效果可以,符合预期。原创 2024-01-17 18:09:10 · 700 阅读 · 0 评论 -
OpenGL:关于获取渲染结果的深度信息的问题(二)
前面记录了一下存在的问题和大致的解决方法OpenGL:关于获取渲染结果的深度信息的问题_六月的翅膀的博客-CSDN博客下面就验证一下先定义一个指针变量和一个成员函数GLfloat* depth_value = NULL;//保存缓冲区里的深度信息void updateDepthValue();成员函数具体为void GlWidget::updateDepthValue(){ int WINDOW_WIDTH = (int)_width; int WIND..原创 2022-03-18 16:52:34 · 1777 阅读 · 0 评论 -
OpenGL:关于获取渲染结果的深度信息的问题
前面已经记录了从显存中获取渲染结果并保存为图像的方法OpenGL:如何从缓存中读取颜色、深度信息【转】_六月的翅膀的博客-CSDN博客并已经验证了上述方法可以完美的保存图像,但是保存深度信息部分还是出错了。 int WINDOW_WIDTH = (int)_width; int WINDOW_HEIGHT = (int)_height; int tmpPixelSize = WINDOW_WIDTH * WINDOW_HEIGHT; GLfloat* depth_va原创 2022-03-17 17:53:37 · 1355 阅读 · 4 评论 -
OpenGL:如何从缓存中读取颜色、深度信息【转】
方法一、保存为图片QImage* img=new QImage(WINDOW_WIDTH,WINDOW_HEIGHT,QImage::Format_ARGB32); uchar* tmpBIT = img->bits(); //从颜色缓冲区中读取数据 int tmpPixelSize = WINDOW_WIDTH*WINDOW_HEIGHT * 4; char* tmpPixelsBuffer = (char*)malloc(tmpPixelSize);转载 2022-03-16 16:10:17 · 2847 阅读 · 4 评论 -
OpenGL:动态修改VBO/EBO
最近做的一个Demo,需要在运行过程中,支持切换模型,就是需要更改数据自己OpenGL又没有系统的学过,水的一批,搞了好久就是不行class GlWidget : public QOpenGLWidget, protected QOpenGLFunctions_3_3_Core{ Q_OBJECTpublic: GlWidget(QWidget *parent); ~GlWidget() Q_DECL_OVERRIDE; void LoadModel();原创 2022-01-08 02:09:59 · 2841 阅读 · 4 评论 -
C++/QT:获取当前路径并通过相对路径读取文件
想读取一个txt文件std::ifstream input;input.open(这里是路径);//open接收的参数是const char*类型//不支持相对路径的读取(QT里面是不行)所以方法是先获得当前的所在路径,然后将所在路径与相对路径拼接到一起。char buffer[256]; //buffer用来保存当前所在路径,可以分配大一点没关系//----单独这一行就可以---- _getcwd(buffer, sizeof(buffer));//----下面这种有原创 2022-01-07 15:51:40 · 4321 阅读 · 0 评论 -
OpenGL画坐标轴指示图
最开始是想在左下角位置画个坐标轴后来在网上找了一个,也是别人搬运的,没有出处。学习了一下,感觉不太方便#include <iostream> using namespace std;#include<gl/glut.h> //这个N是用来计数的,为了验证两个回调函数display和reshape谁先执行//结果是reshape先执行int N = 0;GLfloat transx, transy;GLfloat scale;int primw .原创 2022-01-05 11:44:43 · 2062 阅读 · 1 评论 -
好轮子收藏:一个支持几乎所有流行格式的图像加载库stb_image.h
是在opengl教程网站上看到的,挺好用。stb_image.h一个非常流行的单头文件图像加载库,它能够加载大部分流行的文件格式,并且能够很简单得整合到你的工程之中。下载地址:stb/stb_image.h at master · nothings/stb · GitHub只有一个头文件,将它加入你的工程,并另创建一个新的C++文件,输入以下代码:#define STB_IMAGE_IMPLEMENTATION#include "stb_image.h"通过定义STB_IMAG原创 2021-12-24 17:43:38 · 1964 阅读 · 5 评论 -
OpenGL:freeglut ERROR: Function <glutCreateWindow> called without first calling ‘glutInit‘.
代码应该是没问题,搞了老半天都没有整明白,C站上也搜过了,都不行,由于代码是下载来的,可能是文件编码的问题,类似于空格之类的,将代码重新保存一下编码格式就可以了。原创 2021-12-23 16:30:27 · 1594 阅读 · 2 评论 -
OpenGL:配置glad
GLAD是一个开源的库,它能解决我们上面提到的那个繁琐的问题。GLAD的配置与大多数的开源库有些许的不同,GLAD使用了一个在线服务。在这里我们能够告诉GLAD需要定义的OpenGL版本,并且根据这个版本加载所有相关的OpenGL函数。打开GLAD的在线服务,将语言(Language)设置为C/C++,在API选项中,选择3.3以上的OpenGL(gl)版本(我们的教程中将使用3.3版本,但更新的版本也能正常工作)。之后将模式(Profile)设置为Core,并且保证生成加载器(Generate a l原创 2021-11-01 16:44:07 · 4936 阅读 · 5 评论 -
OpenGL:编译glfw并配置
第一步官网下载:Download | GLFW可以选择预编译好的glfw,但是创建窗口 - LearnOpenGL CN这里说最好自己编译,也好。从源代码编译库可以保证生成的库是兼容你的操作系统和CPU的,而预编译的二进制文件可能会出现兼容问题(甚至有时候没提供支持你系统的文件)。提供源代码所产生的一个问题在于不是每个人都用相同的IDE开发程序,因而提供的工程/解决方案文件可能和一些人的IDE不兼容。所以人们只能从.c/.cpp和.h/.hpp文件来自己建立工程/解决方案,这是一项枯..原创 2021-11-01 15:58:40 · 2855 阅读 · 0 评论 -
OpenGL:读取图片显示
由于OpenGL没有直接读取jpg、bmp、png等图像格式的函数,需借助其他工具将图像文件读取转化为内存信息。相对C++的文件读取函数,我更习惯使用简便的OpenCV图像读取#include <gl/glut.h>#include <opencv2/opencv.hpp>#include <iostream>using namespace std;using namespace cv;#define WindowWidth 400#define W转载 2021-10-09 11:31:50 · 4203 阅读 · 1 评论 -
OpenGL:纹理映射bmp图像
#include <gl/glut.h>#include <opencv2/opencv.hpp>#include <iostream>using namespace std;using namespace cv;#define WindowWidth 400#define WindowHeight 400#define WindowTitle "OpenGL纹理测试"//定义两个纹理对象编号GLuint texGround;GLuint t.转载 2021-09-30 17:30:58 · 958 阅读 · 0 评论 -
OpenGL:正方形旋转小例子
#include<GL/glut.h>#include<stdio.h>void display(void){ glClear(GL_COLOR_BUFFER_BIT); glColor4f(0.2f, 0.4f, 0.6f, 0.0f); glRectf(-0.5f, -0.5f, 0.5f, 0.5f); //glFlush(); glutSwapBuffers();}static float angle = 0.0;vo.原创 2021-09-30 15:16:53 · 608 阅读 · 0 评论 -
OpenGL:显示一些立体图形示例程序(真不错)
// GlutDemo.cpp : 定义控制台应用程序的入口点。////#include "stdafx.h"#include <stdio.h>#include <gl/glut.h>#include <math.h>//圆周率宏#define GL_PI 3.1415f//获取屏幕的宽度GLint SCREEN_WIDTH = 0;GLint SCREEN_HEIGHT = 0;//设置程序的窗口大小GLint windowWidth = 4.转载 2021-07-20 15:24:18 · 594 阅读 · 0 评论 -
OpenGL:画个水壶
#include <stdlib.h> #include <GL/glut.h> #include<iostream>using namespace std;GLfloat roate = 0.0;// set rote of roate ying yu bu hao bu zhuang le 设置旋转速率GLfloat rote = 0.0;//shezhi旋转角度GLfloat anglex = 0.0;//X 轴旋转GLfloat angley.转载 2021-07-20 14:58:40 · 941 阅读 · 0 评论 -
OpenGL:绘制太阳地球例子
#include <GL/freeglut.h>//本来OpenGL程序一般还要包含<GL/gl.h>和<GL/glu.h>//但GLUT的头文件中已经自动将这两个文件包含了,不必再次包含。#include <iostream>using namespace std;// 太阳、地球和月亮// 假设每个月都是30天// 一年12个月,共是360天static int day = 50; // day的变化:从0到359void myDis..转载 2021-07-20 14:22:00 · 766 阅读 · 0 评论 -
OpenGL:glMatrixMode()
在OpenGL中,如果想对模型进行操作,就要对这个模型的状态(当前的矩阵)乘上这个操作对应的一个矩阵.如果当前矩阵乘以变换矩阵(平移, 缩放, 旋转), 那相乘之后, 模型的位置被变换;如果当前矩阵乘以投影矩阵(将3D物体投影到2D平面), 相乘后, 模型的投影方式被设置;如果当前矩阵乘以纹理矩阵(), 模型的纹理方式被设置.而用来指定当前矩阵, 就是glMatriMode(GLenum mode);glMatrixMode有3种模式: GL_PROJECTION 投影, GL_MODELVIE转载 2021-07-20 13:50:40 · 288 阅读 · 0 评论 -
OpenGL入门-3-绘制多边形
多边形(1)多边形的两面以及绘制方式。虽然我们目前还没有真正的使用三维坐标来画图,但是建立一些三维的概念还是必要的。从三维的角度来看,一个多边形具有两个面。每一个面都可以设置不同的绘制方式:填充、只绘制边缘轮廓线、只绘制顶点,其中“填充”是默认的方式。可以为两个面分别设置不同的方式。glPolygonMode(GL_FRONT, GL_FILL); // 设置正面为填充方式glPolygonMode(GL_BACK, GL_LINE); // 设置反面为边缘...转载 2021-07-19 18:04:54 · 2879 阅读 · 1 评论 -
OpenGL入门-2-颜色
一、颜色void myDisplay(void){ glClear(GL_COLOR_BUFFER_BIT); glPointSize(10);//设置点大小,要放在glBegin之前 glColor3f(0.0f, 1.0f, 0.0f);//设置颜色为绿色(RGB) //只要后面不改变颜色,后面画图都是绿色 glBegin(GL_POINTS);//glBegin和glEnd之间画点/或线等 glVertex2f(0.3f, 0.3f); glVertex2f(0.3f, -0.原创 2021-07-19 16:27:26 · 1529 阅读 · 0 评论 -
OpenGL入门-1
一、画个简单的矩形框#include <GL/freeglut.h>//本来OpenGL程序一般还要包含<GL/gl.h>和<GL/glu.h>//但GLUT的头文件中已经自动将这两个文件包含了,不必再次包含。#include <iostream>#include <vector>#include <cmath>using namespace std;void myDisplay(void){ glClear.原创 2021-07-19 16:07:13 · 748 阅读 · 0 评论