一、OpenGL 简单开始 --- 介绍 与 项目配置

下一篇:二、OpenGL 简单开始 --- 从“规范”到“调用”

1. 简介

OpenGL(Open Graphics Library)是一个跨编程语言、跨平台的编程图形程序接口,它将计算机的资源抽象称为一个个OpenGL的对象,对这些资源的操作抽象为一个个的OpenGL指令。

OpenGL ES(OpenGL for Embedded Systems)是 OpenGL 三维图形 API 的子集,针对手机、PDA和游戏主机等嵌入式设备而设计,去除了许多不必要和性能较低的API接口。

总体来说,它是一种规范:为更好的使用图形编程,提供了一系列 API 作为书写规范、流程规范等。

2. 谁实现了规范内的代码?

OpenGL只提供规范,GPU 硬件厂商(AMD、Nvidia 等)适配这些规范,提供了规范内书写的 API。
所以,OpenGL 是规范不是代码,它没有开源选项,且硬件厂商也不开源他们的驱动代码。

3. 游戏引擎相关

实际的游戏引擎开发,需要多个图形 API 规范进行配合,特别是跨平台的时候,一个 OpenGL 往往不够,还需要其他如 DX 11等。大型引擎开发,往往是向 DX 系列靠近,就算使用 OpenGL,也是编写一个 DX 型包装器,即 API 调用更贴合 DX,而框架底层是按 OpenGL 书写。

4. 实践项目配置

4.1 GLFW

  • 使用 GLFW 创建窗口,原因如下(跨平台、提供基本的窗口和 OpenGL 上下文、主要是学习使用 OpenGL,此类工作可以省):

image

image

  • 如果是 Win 平台 或者 mac 平台,可直接下载编译好的 32/64位版本。

image

4.2 Visual Studio

  • 打开VS,创建新项目。

image

  • 创建 cpp 文件,导入 GLFW 包,书写如下代码:
#include <GLFW/glfw3.h>

int main(void)
{
    GLFWwindow* window;

    /* Initialize the library */
    if (!glfwInit())
        return -1;

    /* Create a windowed mode window and its OpenGL context */
    window = glfwCreateWindow(640, 480, "Hello World", NULL, NULL);
    if (!window)
    {
        glfwTerminate();
        return -1;
    }

    /* Make the window's context current */
    glfwMakeContextCurrent(window);

    /* Loop until the user closes the window */
    while (!glfwWindowShouldClose(window))
    {
        /* Render here */
        glClear(GL_COLOR_BUFFER_BIT);

        /* Swap front and back buffers */
        glfwSwapBuffers(window);

        /* Poll for and process events */
        glfwPollEvents();
    }

    glfwTerminate();
    return 0;
}
  • 选择自己版本 VS 对应的 和 include 文件,导入项目依赖文件夹

image

  • 根据自己导入的位置,设置项目依赖

image
image
image

  • 简单画一个 三角形 测试一下(循环体内添加)
/* Loop until the user closes the window */
while (!glfwWindowShouldClose(window))
{
    /* Render here */
    glClear(GL_COLOR_BUFFER_BIT);
    
    /* Draw A Triangle For Testing */
    glBegin(GL_TRIANGLES);
    glVertex2f(-0.5f, -0.5f);
    glVertex2f(0.0f, 0.5f);
    glVertex2f(0.5f, -0.5f);
    glEnd();

    /* Swap front and back buffers */
    glfwSwapBuffers(window);

    /* Poll for and process events */
    glfwPollEvents();
}

image

posted @ 2024-05-08 09:53  bok_tech  阅读(42)  评论(0)    收藏  举报