OpenGL笔记(三)

笔记

1. 思考回顾一下,OpenGL中使用贴图texture的步骤。

2. texture贴图的环绕方式有哪四种?

3. OpenGL 提供了一个函数,用来关闭绘图之后出来的鼠标,这样程序执行之后鼠标就不见了,而且鼠标被锁定在窗口范围内,不得跳出,所以这是FPS类游戏惯用的东西。

4. deltatime是什么?为什么一定要用这个?

5. callback翻译过来是回调,所以什么是回调函数?

6. 想一想,FPS类游戏的摄像机,当position不变,只考虑转镜头的时候:
是怎么设置的?

7. C++中如何折叠代码?

8. 如何将string类型转换成const char*的类型?

9. Unity里的材质球,在OpenGL中有哪几个部分组成?

除夕,早上8点醒,吃年早饭,下午2点半开始学习。
10. 关于给Uniform传输数据的函数glUniform4fv、glUniform4f等有什么区别?

11. 什么是光照模型?

12. 实际生活中的光照很复杂,因为充斥着各种折射,漫反射,关于此有一个算法:global illumination algorithms (全局照明算法),但这个算法很复杂,暂且不讨论。

13. 在model data中,包括vao的栏位里面,除了xyz坐标、纹理uv坐标、颜色坐标,还有个法向量坐标,什么是法向量坐标。

笔记答案

1.
(1)建立贴图对象:glGenTextures();,并将对象绑定在当前的状态上,比如:glBindTexture(GL_TEXTURE_2D);
(2)设置贴图的参数信息,比如设置贴图环绕(wrap)的方式和纹理过滤的方式:

    //设置环绕(wrap)方式
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_MIRRORED_REPEAT);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_MIRRORED_REPEAT);
    //设置过滤(filter)方式
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);

(3)设置完信息之后,就是读取图片了,这里用到头文件stb_image.h

     int width, height, nrChannels;
     unsigned char *data = stbi_load("container.jpg", &width, &height, &nrChannels, 0); 
     //别忘了生成mimmap,由于texture已经绑定到GL_TEXTURE_2D上,所以直接对其操作即可。
     glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, width, height, 0, GL_RGB, GL_UNSIGNED_BYTE, data);
     glGenerateMipmap(GL_TEXTURE_2D);

(4)最后,别忘了在着色器中使用材质,具体的分为两个部分:传入纹理坐标和传入采样器(sampler)的uniform:
首先是传入纹理坐标,并用glVertexAttribPointer函数取得纹理坐标:

     layout(location = 0) in vec3 aPos;
     layout(location = 1) in vec2 texCoord;
     //取到之后直接传给片元着色器
     out vec2 TexPos;

然后是在片元着色器中使用uniform格式的sampler:

     uniform sampler2D TexPicture;

举个例子:

     #version 330 core      

     in vec2 TexPos;
     ut vec4 outColor;

     uniform sampler2D TexPic1;
     uniform sampler2D TexPic2;

void main()
{    
		outColor=mix(texture(TexPic1, TexPos), texture(TexPic2, TexPos), 0.4);
}

最后别忘了获取uniform的位置,传进OpenGL就行

		glUniform1i(glGetUniformLocation(shader1.programId, "TexPicture"), 0);

2.
在这里插入图片描述
第四种环绕方式,需要设置边界颜色:
在这里插入图片描述

3.
具体的窗口操作函数在glfw库中,函数如下:

glfwSetInputMode(window, GLFW_CURSOR, GLFW_CURSOR_DISABLED); 

4.
什么是deltatime:
This property provides the time between the current and previous frame.
每个机器性能不同,用的deltatime就可以根据选择不同的帧数来渲染

5.
回调函数:callback function 有人说也许叫call after function更恰当,因为如果把回调函数作为参数放入另一个函数F里,作为输入的参数,这个回调函数会等到F执行完毕后开始执行,具体链接如下:
https://stackoverflow.com/questions/824234/what-is-a-callback-function

6.
这种摄像头有三个参数,position,pitch值和yaw值。
当position不变,只考虑转镜头的时候,每一帧具体要干啥:
(1)计算从上一帧到现在的的鼠标偏移量(offset)
(2)把偏移量转换成值加入pitch和yaw值中。

7. 同样是使用类似C#的region,可以折叠模块,在代码的前面加上

#pragma region ModuleName
//被折叠的代码...
#pragma endregion

这样就能得到如下效果

点开之后才展开
在这里插入图片描述
8.
C++自己提供了string转向const char*的功能,在包含<string>头文件的情况下,用.c_str()的方法,如下。

string add_to = "hello!";
const char *cfirst = add_to.c_str();

9.
材质球由三个部分组成:
(1)对应的材质texture
(2)对应的shader program的程序部分
(3)对应的uniform部分
举个例子:
在这里插入图片描述

10.
学习的时候经常看到glUniform4f等,后面接的东西是啥意思呢?
首先是因为一开始用C写的OpenGL 所以不支持函数重载,实际上都相当于一个函数glUniform:
其中函数名中包含数字(1、2、3、4)表示接受这个数字个用于更改uniform变量的值,i表示32位整形,f表示32位浮点型,ub表示8位无符号byte,ui表示32位无符号整形,v表示接受相应的指针类型。 )
比如glUniform4f:4指的是Uniform里面需要四个参数,f指的是浮点数类型。
再比如传进去一个vec3的颜色值,就可以用:

glUniform3f(int uniformLocation,float red,float green,float blue);

更多内容参见:
https://www.cnblogs.com/Anita9002/p/4930341.html

11.
由于计算机计算能力有限,为模拟出现实世界的光照系统,OpenGL引用了方便模拟和运算的简化光照模型:Phong lighting model(冯氏光照模型)。
由以下三个部分组成:
在这里插入图片描述
Ambient lighting: even when it is dark there is usually still some light somewhere in the world (the moon, a distant light) so objects are almost never completely dark. To simulate this we use an ambient lighting constant that always gives the object some color.

Diffuse lighting simulates the directional impact a light object has on an object. This is the most visually significant component of the lighting model. The more a part of an object faces the light source, the brighter it becomes.

Specular lighting: simulates the bright spot of a light that appears on shiny objects. Specular highlights are often more inclined to the color of the light than the color of the object.

13.
法向量坐标,是计算出每一个点的法向量的三维矢量,但是一个点是不可能存在法向量的,所以这个法向量是根据周围的点组成的面,所计算出来的法向量(相当于以这个点为切点的切面的法向量)
法向量的作用:
可以用于光照的反射,比如说光照在一个点上,会造成反射,此时就需要法向量协助计算,如下图:
在这里插入图片描述

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值