请帮助我了解绘制2D场景(ortho)的好方法是什么。我正在使用带有着色器的OpenGL。
例如,如果我有一个大小为800x600的视口并绘制四边形。有些四边形在视口中,有些则不在。
OpenGL和着色器会截取视口外的四边形吗?
如果是,我是否需要从绘图功能中剪切它们?
是否有针对这种情况的标准决定(glEnable(???)
),还是我需要自己制作一个?
绘制:
void Draw()
{
glUseProgram(ProgramId);
glUniformMatrix4fv(MVPId, 1, GL_FALSE, (float*)pMVP);
glEnableVertexAttribArray(0);
glEnableVertexAttribArray(1);
glEnableVertexAttribArray(2);
glBindBuffer(GL_ARRAY_BUFFER, BaseQuadBufferId);
glVertexAttribPointer(0, 2, GL_FLOAT, GL_FALSE, 0, 0);
glBindBuffer(GL_ARRAY_BUFFER, BaseColorBufferId);
glVertexAttribPointer(1, 4, GL_FLOAT, GL_FALSE, 0, 0);
glBindBuffer(GL_ARRAY_BUFFER, OffsetQuadBufferId);
glVertexAttribPointer(2, 2, GL_FLOAT, GL_FALSE, 0, 0);
glVertexAttribDivisor(0, 0); //basic size
glVertexAttribDivisor(1, 0); //basic color
glVertexAttribDivisor(2, 1); //offset
glDrawArraysInstanced(GL_QUADS, 0, 4, QuadCount);
glDisableVertexAttribArray(0);
glDisableVertexAttribArray(1);
glDisableVertexAttribArray(2);
}
MVP:
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;
}
有问题的图片: http://imgur.com/VckmghQ
答案 0 :(得分:1)
使用glDraw ...提交的所有顶点由顶点着色器(以及几何和/或镶嵌着色器,如果使用几何和/或镶嵌着色器)处理。只有在顶点处理阶段(顶点,镶嵌和几何着色器)裁剪后才能应用。仅剪切落入视口中的片段。正在处理剪刀矩形并通过像素所有权测试。
答案 1 :(得分:1)
当你的问题是:我是否必须自己处理可见区域以外的物体时,答案是否定的。
OpenGL会自动剪辑所有基元,并确保即使它们部分可见也能正确显示所有基元。从技术上讲,这是在调用片段着色器之前直接完成的。这样做的原因是,previouse着色器阶段可以转换原语,因此只能在所有这些阶段之后做出决定。然后在标准化的设备坐标中完成剪切(因此在3D中,也在近距离和远距离平面上)。
有关渲染管道的更多信息,请查看this。