📌  相关文章
📜  计算机可以在没有显卡的情况下运行 (1)

📅  最后修改于: 2023-12-03 14:57:31.710000             🧑  作者: Mango

计算机可以在没有显卡的情况下运行

1. 什么是显卡?

显卡,即显像管控制器,是计算机主机与显示器之间的连接,将计算机主机发出的信号经过处理后传送到显示器上显示出来。简单来说,显卡就是处理计算机图形输出信号的硬件设备。

2. 计算机可以在没有显卡的情况下运行吗?

答案是肯定的。虽然显卡在计算机中扮演着相当重要的角色,但并不是所有的计算机都必须配置显卡。例如,智能手机、平板电脑、笔记本电脑都可以在没有显卡的情况下运行,因为它们自带显卡芯片。

3. 计算机在没有显卡的情况下如何输出图形?

计算机在没有显卡的情况下,会使用一些软件来模拟显卡的功能,例如:

3.1. VESA BIOS

VESA BIOS是计算机的一个标准接口,可以访问基本输入输出系统(BIOS)的硬件功能,包括显存、显卡支持的分辨率等。通过VESA BIOS,计算机可以在没有显卡的情况下显示低分辨率的图形。

可以通过调用VESA BIOS的API函数,来访问计算机的硬件基本功能。

例如,使用C语言调用VESA BIOS的API函数,可以输出一个红色的方框:
#include <dos.h>

void main() {
  // 初始化VESA BIOS
  union REGS regs;
  regs.h.ah = 0x00;
  int86(0x10, &regs, &regs);

  // 设置固定模式 12h(800x600)
  regs.h.ah = 0x00;
  regs.h.al = 0x12;
  int86(0x10, &regs, &regs);

  // 输出红色的方框
  for (int y = 100; y < 200; y++) {
    for (int x = 100; x < 200; x++) {
      unsigned char* pixel = (unsigned char*)0xA0000 + y * 800 + x;
      *pixel = 0x04;
    }
  }
}
3.2. 软件渲染器

软件渲染器是另一种在没有显卡的情况下输出图形的方式。软件渲染器一般是通过CPU计算图形并输出到屏幕上,因此速度较慢,但可以实现比VESA BIOS更高的分辨率和更丰富的图形效果。

使用软件渲染器输出一个简单的三角形:
#include <iostream>
#include <cmath>
using namespace std;

const int WIDTH = 640;
const int HEIGHT = 480;
const int BYTES_PER_PIXEL = 4;

unsigned char framebuffer[WIDTH * HEIGHT * BYTES_PER_PIXEL];

int main() {
  // 初始化framebuffer为黑色
  memset(framebuffer, 0, WIDTH * HEIGHT * BYTES_PER_PIXEL);

  // 计算三角形的三个顶点
  const float x1 = WIDTH / 4.0f;
  const float y1 = HEIGHT / 4.0f;
  const float x2 = WIDTH * 3.0f / 4.0f;
  const float y2 = HEIGHT / 4.0f;
  const float x3 = WIDTH / 2.0f;
  const float y3 = HEIGHT * 3.0f / 4.0f;

  // 遍历屏幕的每个像素,计算它是否在三角形内部
  for (int y = 0; y < HEIGHT; y++) {
    for (int x = 0; x < WIDTH; x++) {
      const float px = x + 0.5f;
      const float py = y + 0.5f;
      const float det =
          (x2 - x1) * (y3 - y1) - (x3 - x1) * (y2 - y1);
      const float lambda =
          ((py - y1) * (x3 - x1) - (px - x1) * (y3 - y1)) / det;
      const float mu =
          ((px - x1) * (y2 - y1) - (py - y1) * (x2 - x1)) / det;
      if (lambda >= 0.0f && lambda <= 1.0f &&
          mu >= 0.0f && mu <= 1.0f &&
          lambda + mu <= 1.0f) {
        const int index = (y * WIDTH + x) * BYTES_PER_PIXEL;
        framebuffer[index + 0] = 255;  // R
        framebuffer[index + 1] = 255;  // G
        framebuffer[index + 2] = 255;  // B
        framebuffer[index + 3] = 255;  // A
      }
    }
  }

  // 将framebuffer输出到屏幕上
  // ...
}
4. 结论

虽然计算机可以在没有显卡的情况下运行,但很多应用程序和游戏需要显卡提供的硬件加速功能才能流畅运行。因此,对于需要高性能图形输出的场景,显卡仍然是必须的硬件设备。