Ste*_*nko 0 c++ opengl render vector opengl-compat
如何在没有着色器的情况下绘制三角形?我有这样的功能:
void GLRenderSystem::renderTriangleSoup(const std::vector<Vertex>& vertices)
{
/????
}
Run Code Online (Sandbox Code Playgroud)
如果您不想使用着色器,那么您必须创建一个兼容性配置文件OpenGL Context。通过兼容性配置文件,您可以使用立即模式glBegin/glEnd序列。您必须使用 OpenGL三角形基元类型之一。例如:
struct Vertex
{
float x, y, z;
};
Run Code Online (Sandbox Code Playgroud)
glBegin(GL_TRIANGLES);
for (auto &vertex : vertices)
{
glVertex3f(vertex.x, vertex.y, vertex.z);
}
glEnd();
Run Code Online (Sandbox Code Playgroud)
或者,您可以使用固定函数属性并定义顶点数据数组。在这种情况下,您必须通过 绘制三角形glDrawArrays。例如:
glVertexPointer(3, GL_FLOAT, 0, vertices.data());
glEnableClientState(GL_VERTEX_ARRAY);
glDrawArrays(GL_TRIANGLES, 0, vertices.size());
glDisableClientState(GL_VERTEX_ARRAY);
Run Code Online (Sandbox Code Playgroud)
无论如何,您必须指定正确的投影和模型视图矩阵。看glMatrixMode。矩阵取决于顶点坐标的比例。当前矩阵由单位矩阵初始化。因此,如果您不设置矩阵,则顶点坐标必须位于标准化设备空间中。NDC 是一个独特的立方体,从左、下、近 (-1, -1, -1) 到右、上、远 (1, 1, 1)。NDC 坐标系是左手坐标系。在视口上的投影中,x 轴指向右侧,y 轴指向上方,z 轴指向视图,因此深度由 z 定义。