Electronic Joint Business

Solution for E-Business

opengl

Linux 图形系统和 AMD R600 显卡编程(1) —— Linux环境下的图形系统简介

Linux/Unix 环境下最早的图形系统是 Xorg 图形系统,Xorg 图形系统通过扩展的方式以适应显卡和桌面图形发展的需要,然而随着软硬件的发展,特别是嵌入式系统的发展,Xorg 显得庞大而落后。开源社区开发开发了一些新的图形系统,比如 Wayland 图形系统。

由于图形系统、3D 图形本身的复杂性以及历史原因,Linux 图形系统相关的源码庞大而且复杂,而且缺少学习的资料(所有源代码分析或者驱动编程的书籍都很少介绍显卡驱动)。在后续一系列文章中,笔者将从对 AMD 硬件编程的角度出发对部分问题做一个简单的介绍,当然,这种介绍是很初级的,旨在希望能够对初学着有所帮助。

内核 DRM、Xorg 以及 Mesa 三部分加起来的代码和整个 Linux 内核的体量是差不多大的。而且现代的显卡上的 GPU 的复杂程度在一定程度上可以和 CPU 相聘美,从程序员的角度看,操作系统(CPU 的驱动)包含的许多功能在 GPU 驱动上都能够找到。比如说,GPU 有自己的指令系统,着色器程序(GLSL、HLSL、Cg 这类着色语言)需要编译成 GPU 的指令集,然后才能够在 GPU 上运行,符合着色语言规范的 3D 驱动都包含这样的一个编译器。3D 应用程序需要使用大量内存,GPU 在进行运算时需要访问这些内存,所以 GPU 访问内存时也使用一套和 CPU 页表一样的机制。另外,在中断系统上,GPU 和 CPU 也有相似之处。后面的一些内容将会陆续对这些问题做一个简单的介绍。

传统上 Linux 是一个宏内核,设备驱动大部分都是包含在内核里面的,内核代码最庞大的部分就是 drivers 目录,如果你从 kernel.org 上面下载一个内核源码,你会发现编译时间大部分都耗在编译设备驱动上。

对于微内核操作系统,设备驱动不是内核的部分。不过出于调试方便以及其他一些原因,Linux 操作系统上面的一些驱动是放在核外的。比如说打印机、扫描仪这类设备,当前的打印机扫描仪通常都是通过 USB 接口连接到计算机上的,对于这些设备的 Linux 驱动,除了 USB 核心部分在内核,这些打印机扫描仪本身的驱动都是在核外的。Linux 上面的打印机使用 CUPS 系统,CUPS 运行在核外,其驱动是按照 CUPS 的接口来开发的。Linux上面的扫描仪使用的则是运行在核外的 sane 系统,其驱动是以动态链接库的形式存在的。另外一类核外的驱动是图形系统的驱动,由于图形系统、显卡本身比较复杂,加上一些历史原因,图形系统的驱动在核内核外都有,且显卡驱动最主要的部分在核外。

>>> 阅读全文

 

, , , , , , , ,

WDDM 编程与调试 (1) — GPU 架构概览

3D 图形处理主要目的是把 3D 场景变成一个 2D 图像。这里涉及的主要是几何学,主要需要解决的问题是坐标变换(Transform)、裁剪(clipping)和投影(lignting), 简称 T&L 或 TCL:

  • 坐标变换(Transform):即将一个 3D 物体变化为 2D 图像,基本做法是投影,包括透视投影和垂直投影。 其实这里面还会涉及把物体的“物体坐标”转换成世界坐标,再转换成“相机坐标”等。这涉及一系列矩阵变换。
  • 裁剪(clipping):3D 物体投影到 2D 平面上后,或是投影过程中,发现有一些部分是不应该被看见的,这时需要根据遮挡信息等把他们裁掉。
  • 光源(lighting):光把 3D 物理投影到 2D 平面并不能给人们带来足够真实感,因为同样的几何体,由于光照角度不同,材质不同,可能会显示出非常不一样的颜色,人眼需要这种颜色或灰度变化来区分物体间的位置关系。

一、3D 图形处理和 GPU 架构发展
Nvidia 在 1999 年推出的 GeForce256 第一次提出了 GPU 的概念,它第一次完整实现了整个渲染管线(pipeline). 这个时期使用 AGP 替代 PCI 传输数据,并且增加了诸如硬件 T&L、立方环境材质贴图、顶点混合、纹理压缩和凹凸映射贴图、双重纹理四像素、256 位渲染引擎等诸多先进技术。而硬件 T&L (Transform & Lighting 坐标转换和光源处理)可以说是 GPU 问世的标志。这个时期实现的渲染管线就是熟知的 fixed function pipeline,即固定管线渲染。从此 3D 游戏中坐标和光源的转换工作就由 CPU 转交给了 GPU。

渲染管线也叫渲染流水线,是显卡芯片中和图形信号处理单元相互独立的并行处理单元,渲染管线提高了显卡的工作能力和效率,传统的一条渲染管线由 PSU(像素着色单元 Pixel Shader Unit)、TMU (纹理贴图单元,Texture Mapping Unit) 和 ROP (光栅化引擎 Raster Operations Pipeline)三部分组成,PSU 负责像素处理,TMU 负责纹理渲染,而 ROP 负责最终的像素输出,用公式表示为 PS = PSU + TMU + ROP。一条完整的渲染管线意味着在一个时钟周期里至少进行一次 PS 计算,并输出一次纹理。

接下来的重大革新则是 DirectX 8.0 引入了着色器 (Shader) 。着色器就是一段可以改变顶点和像素的小程序,可被加载并在 GPU 上运行,它替代了传统的固定渲染管线参与到流程中,可以实现 3D 图形学中的相关计算。同硬件 T&L 仅能实现的固定光影转换相比,Shader 的灵活性更大,它使 GPU 真正成为了可编程的处理器。例如它可以只让特定的蓝色材质发生移动、扭曲和倒映,这样就产生波光粼粼的水波效果。

早期的着色器有两种:顶点着色器(Vertex Shader,在 OpenGL 中称为 Vertex Program),它取代固定渲染管线中坐标变换和光照部分,可以用于控制顶点变换和投影变换等,另一种称为像素着色器(Pixel Shader,OpenGL 称为 Fragement Program),用来取代固定渲染管线中的光栅化部分,可以用于控制像素颜色和纹理采样。换句话说,着色器就是一段由 GPU 执行的用于对 3D 对象进行操作的程序。像素着色器和顶点着色器都是 ShaderModel 中的以一部分,而 ShaderModel 可以理解为 GPU 的渲染指令集。事实上,着色器与汇编语言非常相似,只不过它是运行在 GPU 上的。1此后每逢 DirectX 有重大版本更新时,ShaderModel 也会相应的升级版本,技术特性都会大大增强。

>>> 阅读全文

 

, , , , , , , ,

WebGL 教程(三)动起来!

欢迎来到Lesson 3!在这一课中我们将开始尝试让物体运动起来。本节课的内容是基于 NeHe 的 OpenGL 教程的第四课改写的。

Here’s what the lesson looks like when run on a browser that supports WebGL:

Click here and you’ll see the live WebGL version, if you’ve got a browser that supports it; here’s how to get one if you don’t.

More on how it all works below…

The usual warning: these lessons are targeted at people with a reasonable amount of programming knowledge, but no real experience in 3D graphics; the aim is to get you up and running, with a good understanding of what’s going on in the code, so that you can start producing your own 3D Web pages as quickly as possible. If you haven’t read the first and second tutorials already, you should probably do so before reading this one — here I will only explain the differences between the code for lesson 2 and the new code.

>>> 阅读全文

 

, , , ,

WebGL 教程 (二) 添加颜色

文章评价:
英文原文
欢迎来到 WebGL 教程的第二篇。在本文中我们将会研究一下如何给场景中的物体上色。本文的内容是基于 NeHe 的 OpenGL 教程的第三章改写的。

如果你的浏览器支持 WebGL 的话,你可以点击这里 来浏览线上版本。

事先声明,本系列的教程是面向那些具备相应编程知识,但没有实际 3D 图形经验的人群;目标是让学习者创建并运行代码,并且明白代码其中的含义,从而可以快速地创建自己的 3D Web 页面。如果你还没有阅读第一课,请先看一下第一课的内容吧。因为本课中我只会讲解那些与第一课中不同的新知识。

和上一篇文章一样,本教程应该有不少错误和混淆,如果你发现了哪些毗漏,请不吝留言斧正。

有两种方法可以获得上面实例的代码:在浏览线上版本时在页面中选择“查看源代码”;你也可以从 Github 中克隆源代码的压缩包。

>>> 阅读全文

 

, , , , , ,

WebGL 教程 (一)三角形和正方形

文章评价:

欢迎来到我的第一篇 WebGL 教程 !本文借鉴了 NeHe 的 OpenGL 教程第二章,它是学习游戏开发的 3D 图形中好文章。本文将带你学习如何在网页上绘制三角形和正方形。也许这不够酷,但很好地阐述了如何用 WebGL 编程;如果你明白了这部分是如何工作,那么剩下的就相当简单了。

我们先看一下本文在支持 WebGL 的浏览器中的运行效果:

要继续本教程,你需要安装支持 WebGL 的浏览器,比如 IE11、 FireFox、Chrome 或者 Safari 等。 下面我们将继续了解如何用 WebGL 绘制三角形和正方形。

注意: 本教程是面向那些具有一定的编程知识,但没有体验过 3D 图形编程的人群,目标是让你从零开始,透过运行代码深入了解其工作原理,以便能尽快地开始编写自己的 3D 网页。我在自学 WebGL 的时候顺便写了这些教程,难免会有毗漏,欢迎大家斧正。如果您发现哪里存在谬误,请麻烦给我留言并加以指正。

>>> 阅读全文

 

, , , , , , ,

用 WebGL 和 HTML5 创建三维分子查看器

简介
许多人对 OpenGL 相当熟悉,但是对使用 WebGL 就有一点陌生。然而,许多 OpenGL 的概念和格式都可以应用到 WebGL 上。本文打算在 WebGL 编程方面做出一些尝试,可以让你了解 WebGL 的一些难易程度。象我这种略知 OpenGL 而对 WebGL 完全没概念的新手,这个例子也只花了我不到 6 个小时。现在有许多用 Java applet 或 C++ 程序写好的查看器。本项目尝试用 Javascript 和 WebGL 来完成同样的工作。让人惊讶的是,这一点也不难。

背景
WebGL 是一种 3D 绘图标准,这种绘图技术标准允许把 JavaScript 和 OpenGL ES 2.0 结合在一起,通过增加 OpenGL ES 2.0 的一个 JavaScript 绑定,WebGL 可以为 HTML5 Canvas 提供硬件 3D 加速渲染,这样 Web 开发人员就可以借助系统显卡来在浏览器里更流畅地展示 3D 场景和模型了,还能创建复杂的导航和数据视觉化。显然,WebGL 技术标准免去了开发网页专用渲染插件的麻烦,可被用于创建具有复杂3D结构的网站页面,甚至可以用来设计 3D 网页游戏等等。

如何使用本文的代码

将本文的代码安装到 Web 服务器上,你可以选用本地服务器,也可以选择远程服务器。打开 index.html ,选择 Choose File 按钮,从本机选一个 PDB 文件,然后你就可以看到分子了。

这是一些快捷键:

>>> 阅读全文

 

, , , , , ,