OpenGL的Draw函数

本文介绍了OpenGL中的Draw函数,包括DrawArrays和DrawElements及其变种,如Instanced、BaseVertex和Indirect等,讨论了图元类型和strip的特点,重点阐述了如何在不同场景下选择合适的Draw函数。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

OpenGL的Draw函数

前言


初学OpenGL时会发现各种各样的Draw*函数,每种Draw*的功能和适合使用场景是什么,在这里做一下整理。对于老式的Draw(OpengGL1,2的glBegin)不做讨论,其实理解OpenGL3,4的方法就够了。

1.图元类型


Draw是用于画图元的,这些图元包括的类型有:

基本图元 包含类型
Point Point list
Line Line list, Line strip, Line loop
triangle Triangle list, Triangle strip, Triangle fan

假设Draw输入了N个点结合它们的拓扑结构看,这些图元类型特点很好理解:
这里写图片描述

  • list:独立的图元
    取每k个点作为一个单独的图元(point,k=1;line k=2;triangle k=3),每个图元没有公共顶点,如N=8时,能画出8个point,4条line;N=9时,画出3个triangle。
  • strip:相连着的图元,line和triangle才有。
    1)对于line,前面2个顶点组成一条线后,后面的每个顶点都与其前一个顶点组成一条线,因此共N-1条线;
    2)对于triangle,前面3个顶点组成一个三角形后,后面的每个顶点与其前两个顶点组成一个三角形,因此共N-2个三角形
  • Line loop:类似Line strip,但首尾两个顶点也构成一条线。
  • Triangle fan:有一个公共顶点,前面三个顶点组成一个三角形后,后面的顶点于前一个顶点及公共顶点组成新的三角形。

谈谈strip的特点

  • 当模型由许多相连的三角形构成时,使用strip较于list可以显著减少带宽。
  • triangle strip或line strip相邻两个图元会有重合的顶点或线,但渲染时不会重复画像素。
  • triangle strip的所有三角形的绕向都是一致,这样保证了整个strip都被cull或都不被cull。
  • 当渲染模式为flat shading时,一个三角形内部所有像素将被渲染成同一种颜色,颜色默认来自三角形的最后一个顶点(也可通过glProvokingVertex选择第一个顶点)。因此结合上一个特点,可知strip中每个三角形分别为:(0,1,2),(2,1,3),(2,3,4),(4,3,5),(4,5,6)……flat shading的颜色分别来自顶点2,3,4,5,6……通过一个实验验证,定义6个顶点,其颜色分别为红,绿,蓝,红,绿,蓝。

    void init()
    {
        glViewport(0,0,128,128);
    
        glGenVertexArrays(NumVAOs, VAOs);//生成VAO
        glBindVertexArray(VAOs[Triangles]);//绑定VAO
        GLfloat positions[NumVertex][2]={//6个顶点的位置坐标
            {0.0f, 32.0f},
            {16.0f, 0.0f},
            {32.0f, 32.0f},
            {48.0f, 0.0f},
            {64.0f,  32.0f},
            {80.85f, 0.0f}
        };
        GLfloat colors[NumVertex][4]={//6个顶点的Color
            {1.0f, 0.0f, 0.0f, 1.0f},
            {0.0f, 1.0f, 0.0f, 1.0f},
            {0.0f, 0.0f, 1.0f, 1.0f},
            {1.0
你遇到的错误是由于 `glm::ortho` 和 `glm::value_ptr` 无法找到,这通常意味着 **GLM(OpenGL Mathematics)库未正确包含或使用方式有误**。 --- ## ✅ 错误分析: ### 报错内容: ``` C3861: 找不到标识符 "value_ptr" C3861: 找不到标识符 "ortho" E0135: namespace "glm" 没有成员 "value_ptr" E0135: namespace "glm" 没有成员 "ortho" ``` ### 原因: - `glm::ortho()` 是用于创建正交投影矩阵的函数。 - `glm::value_ptr()` 是用于将 GLM 向量/矩阵转换为指针以便传给 OpenGL函数。 - 这两个函数在现代 GLM 版本中被移到了不同的头文件中(不再是默认包含的)。 --- ## ✅ 解决方案: 你需要显式地包含以下两个头文件: ```cpp #include <glm/glm.hpp> #include <glm/gtc/matrix_transform.hpp> // 包含 ortho #include <glm/gtc/type_ptr.hpp> // 包含 value_ptr ``` ### 修改后的代码片段如下: ```cpp // 在文件开头添加这些包含项 #include <glm/glm.hpp> #include <glm/gtc/matrix_transform.hpp> // glm::ortho #include <glm/gtc/type_ptr.hpp> // glm::value_ptr ``` 然后你的以下代码就可正常编译运行: ```cpp glm::mat4 projection = glm::ortho(0.0f, 800.0f, 600.0f, 0.0f); glUniformMatrix4fv(glGetUniformLocation(shaderProgram, "projection"), 1, GL_FALSE, glm::value_ptr(projection)); ``` --- ## ✅ 补充建议 如果你使用的是较老版本的 GLM(比如 v0.9.5 或更早),可能不需要额外包含 `type_ptr` 或 `matrix_transform`。但为了兼容性和未来开发考虑,推荐始终显式包含所需模块。 --- ## ✅ 安装 GLM 如果你还没有安装 GLM,请从 [https://github.com/g-truc/glm](https://github.com/g-truc/glm) 下载源码,并将其解压到项目目录中,或者通过包管理器安装: ```bash vcpkg install glm ``` ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值