OpenGL必知必会——问题清单
Posted itzyjr
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了OpenGL必知必会——问题清单相关的知识,希望对你有一定的参考价值。
✠OpenGL-2-图像管线
- glfwSwapBuffers的工作原理?
- 为什么glfwSwapInterval函数参数是1而不是0?
- GLSL代码载入管线的流程?
- 顶点着色器的特点是怎样的?顶点着色器执行成百上千次会阻塞吗?
- 在代码层面,创建一个程序对象,需要调用依次调用哪6个函数?
- 对于顶点数据,当准备将数据集发送给管线时,是以什么形式发送的?这些数据最后都被存入到什么对象中?
- 对VAO的操作,是调用哪两个函数完成的?
- 使用程序对象并绘制操作是调用的哪两个函数完成的?
- 对光栅化的理解?对于默认的填充三角形,如果要变成线框模型绘制三角形,只需要在哪个位置调用哪个函数?
- 对于隐藏面消除是OpenGL精巧地协调哪2个缓冲区完成的?这2个缓冲区有什么特点?它们是如何协调的?
- 隐藏面消除原理是用的哪3个步骤?
- OpenGL中的深度值范围是怎样的(相对于近/远裁剪平面)?调用glClear(GL_DEPTH_BUFFER_BIT)是用什么值填充深度缓冲区?作用是什么?为什么说调用glClear函数会把每个像素的颜色缓冲区和深度缓冲区都更新?
- glEnable(GL_DEPTH_TEST); glDepthFunc(GL_LESS); 如果不加这两个函数,会产生什么效果?
- 默写Z-Buffer算法?
- glGetError()、glGetShaderInfoLog()、glGetProgramInfoLog()分别是捕获什么错误?它们要放在什么位置以完成功能?
- 内置变量gl_VertexID的意义?if(gl_VertexID == 0)其中0用来判断是第0条数据还是第0个顶点?
- 一些机器上的值可以通过哪类函数获取?比如查询GL_POINT_SIZE_RANGE、GL_MAX_TEXTURE_IMAGE_UNITS。
✠OpenGL-3-数学基础
- 默写[平移]点的变换矩阵?
- 从vec4(X,Y,Z,1)这个齐次坐标点平移变换到vec4(X+Tx,Y+Ty,Z+Tz,1),要求vec4(X,Y,Z,1)左乘还是右乘变换矩阵?为什么?
- 默写[缩放]点的变换矩阵?
- 默写绕X、Y、Z轴[旋转]点的变换矩阵?
- 透视矩阵,用哪4个参数来构建视体?
- 虽有glm::perspective(arg1,arg2,arg3,arg4)用来创建一个透视矩阵,现在手动编写实现,默写透视变换矩阵?
- 说说正射投影矩阵的性质和用途?构建正射矩阵需要哪些参数,并默写正射投影变换矩阵?
- LookAt矩阵在哪些地方用它?需要哪3个参数就可以构建LookAt矩阵,并默写这个变换矩阵?glm::lookAt(eye,center,up)解释3个参数的含义?
- 模型矩阵M的定义是什么?它是在世界空间中还是局部空间中?
- 同一个点在两个不同坐标系下A、B下分别表示为PA和PB,可能存在有且仅需一个变换矩阵R,完成坐标系的切换吗?即使得PA=RPB吗,为什么?
- 观察3D世界需要哪4个步骤?
- OpenGL相机默认位置与方向是怎样的?
- 物体从“世界坐标系中的三维物体”到“屏幕坐标系中的图形显示”,中间要经过哪4个步骤?
- 将世界坐标系中的点Pw转换到相机空间中的点PC,需要怎样的平移和旋转、有缩放操作吗?
- 已知矩阵T和R,请推导出视图变换矩阵V,使得PC=V *Pw?视图变换矩阵V的物理意义是什么?
- 已知矩阵M和V,请推导出模型-视图矩阵MV,使得PC=MV*PM?模型-视图矩阵MV的物理意义是什么?
- 已知cameraX=0.0f; cameraY=2.0f; cameraZ=10.0f; objLocX=0.0f; objLocY=0.0f; objLocZ=-1.0f; 请用代码构建模型矩阵、视图矩阵及模型-视图矩阵?
- 为什么是[负]相机位置/旋转角?请从位置和旋转角分别作说明。
- 理解组合矩阵变换:Vclip=Mprojection•Mview•Mmodel•Mlocal
- 归一化处理:透视除法的执行,它如何将4D变到2D裁剪空间?它的执行是在哪个着色器的哪个期间完成?是自动执行吗?
- 视口变换的作用机理是怎样的?glViewport(0, 0, 800, 600);的确切物理含义是什么?
✠OpenGL-4-图形数据
- glUniformMatrix2×4中的矩阵是一个几行几列的矩阵?glUniformMatrix3()中数字3表示什么意思?
- 绘制一个简单图形的动画场景,在init()中要完成哪2个步骤?在display()中要完成哪4个步骤?每个步骤分别调用哪个函数?
- 写出生成两个VBO的代码?
- 如何在顶点着色器中接收模型的顶点?
- GLSL中layout修饰符中的参数要发挥作用,必须与C++/OpenGL代码中哪2个函数的参数保持一致?
- 矩阵运算是在C++/OpenGL中还是在GLSL中是最有效的?
- 统一变量在GLSL中的声明,它在C++/OpenGL中的使用运用到哪两个函数?GLSL与C++/OpenGL代码是怎么关联起来的?
- 光栅着色器是在哪个阶段?它是可编程单元吗?它的工作原理是怎样的(从哪接收值,将什么值发送到下一管线)?
- 在glDrawArrays()函数中指定GL_TRIANGLES时,光栅化是怎么完成的?
- 假设模型是动画的,相机也是可移动的,那么模型矩阵、视图矩阵、透视矩阵,它们放到init()中还是display()中?为什么?
- 通过将模型和视图矩阵发送到顶点着色器之前要预先进行一步什么操作?目的是什么?
- glDepthFunc(GL_LEQUAL);的作用机理是什么?
- display()重复被调用,调用它的速率被称为什么?
- 如果在渲染帧之前不清除深度缓冲区,会有什么影响?
- glm::mat对象怎么打印?
- 为什么取Znear=0.1, Zfar=1000, FOV角=60°?
- 近剪裁平面那么小,有什么不对吗?
- OpenGL工作在一个叫NDC(Normalized Device Coordinates)的坐标系统下,这个坐标系统有什么特点?对显示有什么影响?顶点坐标在哪个阶段后处于NDC?
- 注释掉glEnable(GL_DEPTH_TEST);请描述运行效果?
- 注释掉glClear(GL_COLOR_BUFFER_BIT);请描述运行效果?
- cameraZ的取值对视野有什么影响,比如从2变为10?
- 实例化有什么好处?内置变量gl_InstanceID是什么作用?
- 默写与glDrawArraysInstanced具有相同效果的(伪)代码?
- 用统一变量传递一个标量,用哪个系列的函数?
- 在同一个场景中渲染多个模型,有哪些代码是必须得重复写的?
- 为什么在init()中已经glBindBuffer()了,在display()中要用相应buffer时仍要glBindBuffer()?这是OpenGL的一种什么机制?
- 渲染多个物体时,为什么渲染第一个物体调用glEnableVertexAttribArray(0);即启用#0顶点属性,渲染第二个物体同样调用glEnableVertexAttribArray(0);即也是启用#0顶点属性,这不起冲突吗?
- 矩阵堆栈是为了解决什么问题?如果要完成太阳自转,地球自转并绕太阳公转,月球自转并绕地球公转,需要怎样操作?
- “Z冲突”伪影的产生原因及解决方法(三种建议)?
- 三角形图元:GL_TRIANGLES/GL_TRIANGLE_STRIP/GL_TRIANGLE_FAN/GL_TRIANGLES_ADJACENCY/GL_TRIANGLE_STRIP_ADJACENCY,线图元:GL_LINES/GL_LINE_STRIP/GL_LINE_LOOP/GL_LINES_ADJACENCY/GL_LINE_STRIP_ADJACENCY,点图元:GL_POINTS,补丁图元:GL_PATCH。理解这三大类每一个参数的含义?
- 启用背面剔除与启用深度测试的核心区别是什么?
- 对于性能优先的编程方法,要注意哪3点?
以上是关于OpenGL必知必会——问题清单的主要内容,如果未能解决你的问题,请参考以下文章