C++ 场景/视口之外的对象(OpenGL)

C++ 场景/视口之外的对象(OpenGL),c++,opengl,shader,viewport,cut,C++,Opengl,Shader,Viewport,Cut,请帮助我了解绘制2D场景(正交)的好方法。我正在使用OpenGL和着色器 例如,如果我有一个800x600大小的视口并绘制四边形。有些四边形在视口中,有些不在视口中 OpenGL和着色器是否处理视口外的四边形? 如果是,是否需要从绘图功能中删除它们? 对于这种情况,是否有标准的决策(glEnable(?)),或者我需要自己做一个 抽签: MVP: 顶点着色器: layout(location = 0) in vec3 vertexPosition; layout(location = 1) in

请帮助我了解绘制2D场景(正交)的好方法。我正在使用OpenGL和着色器

例如,如果我有一个800x600大小的视口并绘制四边形。有些四边形在视口中,有些不在视口中

OpenGL和着色器是否处理视口外的四边形? 如果是,是否需要从绘图功能中删除它们? 对于这种情况,是否有标准的决策(
glEnable(?)
),或者我需要自己做一个

抽签:

MVP:

顶点着色器:

layout(location = 0) in vec3 vertexPosition;
layout(location = 1) in vec4 vertexColor;
layout(location = 2) in vec2 vertexOffset;

uniform mat4 MVP;
out vec4 Color;

void main()
{
  gl_Position =  MVP * vec4(vertexPosition + vec3(vertexOffset.xy,0), 1);
  Color = vertexColor;
}
带问题的图像:

使用glDraw…提交的所有顶点都由顶点着色器处理(如果使用几何体和/或细分着色器,则使用几何体和/或细分着色器)。只有在顶点处理阶段(顶点、镶嵌和几何体着色器)之后,才能应用剪裁。剪裁后,仅处理掉在视口和剪刀矩形中并通过像素所有权测试的片段。

如果您的问题是:我必须自己处理可见区域以外的对象吗,那么答案是否

OpenGL会自动剪辑所有基本体,并确保即使它们部分可见,也能正确显示所有基本体。从技术上讲,这是在调用片段着色器之前直接完成的。这样做的原因是,前面的着色器阶段可以变换基本体,因此只有在所有这些阶段之后才能做出决定。然后在标准化的设备坐标中进行剪裁(因此在3D中,也针对近平面和远平面)


查看有关渲染管道的更多信息。

是否有好的剪裁方法?如果场景移动和四边形保持是准备带有顶点缓冲区的“区域”的好决定,并且当场景外的一些“区域”没有绘制该“区域”?@一些编码人员有相当标准的方法。该过程通常称为“视锥剔除”,可以使用BSP树或八叉树等数据结构。这是否值得,实际上取决于您总共有多少对象,以及在任何给定时间视图中有多少对象。@Reto Koradi非常有趣。谢谢。正如你们所说,在调用绘图函数之前,我必须从所有顶点中只剪切那个些在场景中完全或部分可见的创建四边形的顶点。不,我并没有这么说。我说:不要担心屏幕外的四边形,因为它们被OpenGL剪掉了。(除非你因为表现太差而不得不优化你的游戏)现在我是uderstand。谢谢
CameraPosition = glm::vec3(0,0,1);
CameraDirection = glm::vec3(0,0,0);
Projection = glm::ortho(0.0f, 800.0f, 0.0f, 600.0f, -1.0f, 1.0f);
Model = glm::mat4(1.0f);
View = glm::lookAt(CameraPosition, CameraDirection, glm::vec3(0,1,0));
MVP = Projection * View * Model;
layout(location = 0) in vec3 vertexPosition;
layout(location = 1) in vec4 vertexColor;
layout(location = 2) in vec2 vertexOffset;

uniform mat4 MVP;
out vec4 Color;

void main()
{
  gl_Position =  MVP * vec4(vertexPosition + vec3(vertexOffset.xy,0), 1);
  Color = vertexColor;
}