Opengl 为摄影机创建着色器程序是否正确?

Opengl 为摄影机创建着色器程序是否正确?,opengl,opengl-es,3d,webgl,model-view,Opengl,Opengl Es,3d,Webgl,Model View,我想在我的3D应用程序中为camera对象创建一个单独的类/原型 据我所知,有一个模型视图矩阵,开发人员使用该矩阵对添加到场景中的任何3D对象进行平移/旋转/使用其他仿射变换 但是,我的相机不像网格Camera不需要颜色,因此不需要片段着色器(当然,如果您不想将摄影机可视化为行,并在不同的摄影机之间切换,例如),那么摄影机真正需要什么 三维矢量中的位置(x,y,z) mat4矩阵,它描述了位置和一些额外的向量组件,我将在顶点着色器中使用,并将用于摄影机的位置平移 一些用于移动相机的控件(我不想

我想在我的3D应用程序中为camera对象创建一个单独的类/原型

据我所知,有一个
模型视图
矩阵,开发人员使用该矩阵对添加到场景中的任何3D对象进行平移/旋转/使用其他仿射变换

但是,我的相机不像网格
Camera
不需要颜色,因此不需要片段着色器(当然,如果您不想将摄影机可视化为
行,并在不同的摄影机之间切换,例如),那么摄影机真正需要什么

  • 三维矢量中的位置(x,y,z)
  • mat4矩阵,它描述了位置和一些额外的向量组件,我将在顶点着色器中使用,并将用于摄影机的位置平移
  • 一些用于移动相机的控件(我不想详细描述它,但举个例子,假设我们只使用键盘键来移动和旋转它)
所以,我的问题是。。。如果我们的3D场景的视口由
模型视图
矩阵表示,任何对象都在该矩阵上通过某种仿射变换进行处理。为摄影机对象创建特定的着色器程序正确吗?或者为场景对象定义这样的着色器程序更正确,只是在一些
draw
method/function中将摄影机位置转换为
Model View
矩阵,该矩阵保存在
scene
对象的属性中

我在我的项目中使用WebGL库,但我认为一些
OpenGL
开发人员可能也会回答这样一个问题,因为这两个库中的内容类似

为摄影机对象创建特定着色器程序是否正确

没有,因为OpenGL中没有摄像头。事实上,OpenGL中甚至没有场景。OpenGL是一个非常简单的绘图API。OpenGL所做的只是将点、线或三角形绘制到像素帧缓冲区,一次绘制一个点、线或三角形,一旦绘制完成,OpenGL就已经忘记了这一点

着色器是控制点、线或三角形如何在屏幕上转化为像素的小程序。着色器不“控制”场景对象。为什么?因为OpenGL中没有场景,也没有场景对象

没有照相机。你能想到的相机(但不是)是modelview中的一些子变换,它以某种方式移动屏幕上的几何体,就好像它是移动相机的结果一样


请注意,这同样适用于WebGL和OpenGL ES。

所有这些听起来都不是内置glTranslate和glRotate所不能做到的。有没有什么特别的原因让你想在着色器中而不是在程序中使用相机(不熟悉webgl,是java还是javascript?@newObjektJavaScript@newObjektWebGL中没有任何类似旋转或平移的仿射数学函数,谁在使用WebGL/JavaScript?请使用mat4库或手动实现这些数学函数。但这和问题无关。例如,我可以使用C++和OpenGL,而不是用JavaScript的WebGL。正如我记得OpenGL不提供一个相机对象没有额外的库(如果你使用平原API没有任何额外的东西),所以如果你使用这种方式,你必须定义一个类的相机对象在C++中,我想。我说的对吗?哦,我不知道。那么,一个好方法就是在顶点着色器中放置2个均匀的向量。一个用于外观向量,另一个用于世界空间坐标,并将它们应用于modelviewprojection。这与glRotate/GLTRANSTATE的结果基本相同。一个GLSL程序,不。通常在使用的每个GLSL程序中应用相机变换。因此,顶点着色器在所有情况下看起来都很相似。通常,我强烈建议您使用统一缓冲区对象来简化这些顶点着色器的设计(例如,绑定摄影机矩阵一次,并在每个着色器中使用它们),但您使用的是WebGL,因此这是不可能的。