OpenGL笔记(四)

笔记

2019.2.26

1. Mac里的Xcode添加个着色器文件都那么麻烦, 具体配置方式参考
https://www.youtube.com/watch?v=aA112viAx7c&list=PLRtjMdoYXLf6zUMDJVRZYV-6g6n62vet8&index=14

2. windows下和Linux下的抛出异常用法并不相同,记住这一点。

3. glGenBuffers和glCreateBuffers有什么区别?

2019.2.27

4. 刚买MacBook Pro没几天,想从Windows转到Mac学习OpenGL,反复试图搭建Mac的OpenGL环境,都失败了。

在这里插入图片描述
最开始编译完了之后,报错:
ERROR: Setting <GLFWContentView: 0x103d17410> as the first responder for window <GLFWWindow: 0x100644220>, but it is in a different window ((null))! This would eventually crash when the view is freed. The first responder will be set to nil.

5. 基本光源有三种,平行光源、点光源和聚光(类似于手电筒的光源),三种光源有什么区别;

2019.2.28
6. 如何使代码可重用性高,可拓展,易修改?

7. 指针函数和函数指针?

8. OpenGL的初始设置里面,用到了#define GLEW_STATIC,有什么用?

2019.3.1
9. 重构的时候,需要创建shader类和camera类,关于camera类的作用是什么来着?

2019.3.4
10. 还记得法向量矩阵吗,它有什么用?

11. 图形程序和游戏里面通常有时间差(Delta Time)的概念,是用来做什么的?

12. OpenGL如何隐藏鼠标的游标?

13. 回调函数的理解?

2019.3.5
14. glm::LookAt函数用法有误。

2019.3.6
15. 在移动camera时,注意根据up,和forwar的方向可以叉乘出其水平方向的分量,要注意叉乘的先后顺序,注意右手坐标系的朝向。

16. C++的头文件不可相互包含,有#pragma once 也不行,如下是错误的:

//文件A.h中的代码 
#pragma once 
#include "B.h" 
  class A 
   { 
    public: 
        B b; 
   };  
 //文件B.h中的代码
#pragma once 
#include "A.h" 
class B 
 {  
   public: 
        A a; 
  };  

17. 回顾一下,设置Texture2D的时候需要设置哪些参数?

18. 关于贴图texture报错的可能情况。

19. unity的欧拉角的坐标系x、y、z的顺序?

笔记答案

3. OpenGL 后来的版本引入了新函数glCreateBuffers(),其签名与glGenBuffers相同。

Given we are using OpenGL 4.5 or have support for the GL_ARB_direct_state_access extension, we have the new function glCreateBuffers.

This function specifies:
returns n previously unused buffer names in buffers, each representing a new buffer object initialized as if it had been bound to an unspecified target

glGenBuffers has the following specification:

Buffer object names returned by a call to glGenBuffers are not returned by subsequent calls, unless they are first deleted with glDeleteBuffers.
So any buffer name returned by glCreateBuffers will never be used again by itself, but could be used by glGenBuffers.

所以好像上新函数glCreateBuffers一直会创建新缓冲对象,但是如果之前没有删除过的缓冲区,glGenBuffers才会创建新的缓冲区。

4.
查阅资料说是glfw版本问题,不应该用glfw3.2.1,然后又重新使用了glfw3.3,发现
又出现了新的问题:使用glfwCreateWindow不能创建窗口;

可能是和我刚更新到macOS MoJave 10.14.3有关,总之怎么弄都出错,直到我看到了这个:
在这里插入图片描述

买之前信誓旦旦说,打死不装Windows的,好了,我乖乖去给刚买的Mac安装双系统了。。。。。
在这里插入图片描述

5.
平行光: 不需要光源的位置,需要一个矢量表示光的方向,没有衰减。
点光源: 类似现实生活中的灯泡,需要光源的位置,有一个球形的光照作用范围,并且随着半径的增加,光照强度逐步衰减,不需要光的方向。
聚光源: 类似于手电筒,既需要光源位置也需要光照方向。

6.
让业务逻辑与界面逻辑分开,让他们之间的耦合度下降。

7.
指针函数是函数,它的返回类型是指针,比如

int * func1();

函数指针是指针,其返回类型是函数,比如:

int (*func2)();

8. 在导入glew库的时候,调用glew的静态库版本,而不是调用其动态库。

2019.3.1
9.
通过两种方式可以构建camera,一种是位置和朝向和世界坐标系UP向量,另外一个是位置和两个角度和世界坐标系Up向量。
camera类的作用有:

  • 创建view矩阵
  • 获取输入,能够动态的移动摄像机的位置和朝向。

2019.3.4
10.
一个模型的数据参数里面,往往会有其法向量参数。
当模型在x、y、z轴上不等比变化时,比如y轴上的坐标增大两倍,其他坐标不变,也就是将模型在y轴方向上拉伸两倍时,这时候的法向量会产生变化,如下图:
在这里插入图片描述
所以需要对法向量进行处理,具体的方式是用法向量矩阵改变原来的法向量。

法线矩阵被定义为「模型矩阵左上角的逆矩阵的转置矩阵」,
换过来也成立:模型矩阵左上角的转置矩阵的逆矩阵

注意所以有:

Normal = mat3(transpose(inverse(model))) * aNormal;

11.
一般程序里面这个都是写在按一帧帧循环的Loop里面的,如果只是单独在自己的机器上跑当然没什么问题。
但是不同的机器每分钟走的帧数是不一致的,也就是每一帧用的时间不一样。
结果就是,根据配置的不同,有些人可能移动很快,而有些人会移动很慢。当你发布你的程序的时候,你必须确保它在所有硬件上移动速度都一样。

之前说到每一帧用的时间在不同机器上不一样,那我们把这个不同的变量乘在DeltaTime里面,就能保证移动速度是一样的。

具体用法如下:

在这里插入图片描述
12.
用下列函数:

glfwSetInputMode(window, GLFW_CURSOR,GLFW_CURSOR_DISABLED);

或者

glfwSetInputMode(window, GLFW_CURSOR,GLFW_CURSOR_HIDDEN;

13.
回调英文名是callback意思回话
举个例子,是我去找你,给你留了电话,当你需要的时候你可以打我电话,这就是回调。
回调函数就是自己写一个函数,当系统在达到自己预定的情况下的时候,会调用该函数。
再举个更直观的定义:
A “callback” is any function that is called by another function which takes the first function as a parameter. (在一个函数中调用另外一个函数就是callback)

14.
函数定义如下:
在这里插入图片描述
所以存在的疑问是:
第二个参数到底是摄像头所指向的点,还是摄像头的方向向量?

答:是指向的点的方向,所以如果想有其方向向量cameraFront,则指向的点应该为:

view = glm::lookAt(cameraPos, cameraPos + cameraFront, cameraUp);

16.
解决方案如下:
在类B头文件中把要用的类A的类声明移过来,在类B的头文件里创建一个类的对象的指针,开始用,然后在类B的定义文件里面包含类A的头文件,这样就不会互相包含了。

详情见下:
https://blog.csdn.net/a812073479/article/details/38542515

17.

  • 设置材质环绕方式(横竖两个方向上)
  • 设置放大图像或缩小图像时候的显示方式,为线性还是插值?
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);

18.

  • 首先函数参数不可以写错了
  • 其次,要注意每一个glBindTexture必须在glActiveTexture函数之后,只有激活了才可以进行绑定操作。

19.
Unity 3D欧拉角的旋转顺序(父子关系)是y-x-z。即旋转y轴,x轴和z轴都变,旋转x轴只有z轴变化,旋转z轴其它轴不变。

猜你喜欢

转载自blog.csdn.net/alexhu2010q/article/details/89089881