opengl-phrtest-cpp示例学习

示例一

内容:利用glMatrixMode函数操作矩阵,增加透视效果

函数解释:https://blog.csdn.net/caoshangpa/article/details/80266028

示例二

内容:利用顶点数组的方式绘制立方体(无VBO、句柄和定义属性)

顶点数组&顶点缓冲:http://blog.chinaunix.net/uid-24448954-id-3059555.html

1、顶点数组:

(1)OpenGL 1.1所提供的功能

(2)明显的减少函数调用次数

(3)通常所有的状态保存在服务端的,如是否启用了纹理。而指定顶点,实际上就是把顶点数据从客户端发送到服务端。是否启用顶点数组,只是控制发送顶点数据的方式而已。服务端只管接收顶点数据,而不必管顶点数据到底是用哪种方式指定的。所以,服务端不需要知道顶点数组是否开启。

(4)为了表示服务端状态和客户端状态的区别,服务端的状态用glEnable/glDisable,客户端的状态则用glEnableClientState/glDisableClientState。

(5)数据是存放在内存(客户端),可以随时修改。每次绘制的时候,需要把所有的顶点数据从客户端(内存)发送到服务端(显示设备)。对于显示列表,数据是放在显示列表(服务器端),无法取出修改,但不会重复的发送数据。

(6)顶点数据和索引数据可以混合

可以不需要着色器

2、顶点缓冲区对象:

(1)OpenGL 1.5所提供的功能

(2)数据存放在服务端,同时允许客户端修改

(3)顶点数据和索引数据在两个缓冲区

(4)数不再从指针所指的位置取数据。函数会先把指针转化为整数,假设转化后结果为k,则会从当前缓冲区的第k个字节开始取数据。

使用缓冲,从缓冲读数据到现存而不是从内存中读取数据,所以运行速度会快很多。

测速代码:

1
2
3
4
5
6
7
8
9
10
11
double lastTime = glfwGetTime();
do {
//计算1秒内的帧数从而计算一帧需要的毫秒数
double current = glfwGetTime();
nbFrames++;
if (current - lastTime >= 1.0) {
printf("%f ms/frame\n", 1000.0 / double(nbFrames));
nbFrames = 0;
lastTime += 1.0;
}
}

顶点缓冲:

image-20221226085052532

显示列表顶点数组:

image-20221226085030449

示例三

内容:自己绘制纹理,使用纹理数组选择要渲染的对象,绘制时利用封装的函数

示例四

内容:利用显示列表进行颜色渲染

glFrontFace函数:[https://blog.csdn.net/zhongjling/article/details/7528091]

示例四-1

内容:利用索引和显示列表绘制立方体(定义面的法线,省略法线数组)

示例五、六、七

内容:噪声绘制动态纹理

示例八

内容:着色器定义随时间变化的内容

示例九

内容:读取两张纹理图片绘制,通过纹理数组和纹理混和绘制重叠的背景图。

示例十

内容:创建着色器程序,利用帧缓冲分层渲染纹理

示例十一

内容:绘制点

1.glPointParameterfv(GL_POINT_DISTANCE_ATTENUATION,pointpara);

2.glEnable(GL_POINT_SMOOTH);

函数解释:https://www.codetd.com/article/1755475

启动抗锯齿:https://blog.csdn.net/tiankefeng19850520/article/details/18601709

示例十二

内容:设置深度使图形有层次

示例十三

内容:循环绘制堆叠图形

示例十四

内容:用同一组顶点,通过定义视口画出不同位置的两个图形

示例十五

内容:用纹理属性而非纹理数组绘制背景

示例十六

内容:用uniform给着色器发送颜色数据,能够覆盖着色器定义的颜色

uniforms(统一数据):可以传递给顶点着色器和片元着色器,传递的数据是不易更改的比较统一的数据,比如发生旋转的变换矩阵,进行颜色渲染的渲染矩阵。一般用于对同一组顶点组成的单个3D物体中所有顶点都相同的变量,如当前光源的位置。

示例十七

内容:不设置光照,索引绘制球体

示例十七-1

内容:绘制球体,设置环境光和漫反射光

球体绘制原理:https://www.jb51.net/article/254487.htm

补充

glScissor( 0, 0, 800, 800):剪裁测试用于限制绘制区域。我们可以指定一个矩形的剪裁窗口,当启用剪裁测试后,只有在这个窗口之内的像素才能被绘制,其它像素则会被丢弃。换句话说,无论怎么绘制,剪裁窗口以外的像素将不会被修改。

Donate
  • Copyright: Copyright is owned by the author. For commercial reprints, please contact the author for authorization. For non-commercial reprints, please indicate the source.

扫一扫,分享到微信

微信分享二维码

请我喝杯咖啡吧~

支付宝
微信