什么是OpenGL/DirectX 什么是HLSL﹑GLSL﹑Cg 什么是Draw Call

2024-01-21 06:32
文章标签 call opengl directx draw cg glsl hlsl

本文主要是介绍什么是OpenGL/DirectX 什么是HLSL﹑GLSL﹑Cg 什么是Draw Call,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

什么是OpenGL/DirectX

如果要开发者直接访问GPU是一件非常麻烦的事情,我们可能需要和各种寄存器﹑显存打交道。而图像编程接口在这些硬件的基础实现了一层抽象。

OpenGL和DirectX就是这些图像应用编程接口,这些接口用于渲染二维或三维图形。这些接口架起了上层应用程序和底层GPU的沟通桥梁。一个应用程序向这些接口发送渲染命令,而这些接口会依次向显卡驱动(Graphics Driver)发送渲染命令,这些显卡驱动是真正知道如何和GPU通信的角色,正是它们把OpenGL或者DirectX的函数调用翻译成了GPU能够听懂的语言,同时它们负责把纹理等数据转换成GPU所支持的格式。

我们的应用程序运行在CPU上。应用程序可以通过调用OpenGL或DirectX的图形接口将渲染所需的数据,如顶点数据﹑纹理数据﹑材质参数等数据存储在显存中的特定区域。随后,开发者可以通过图像编程接口发出渲染命令,这些渲染命令也被称为Draw Call,它们将会被显卡驱动翻译成GPU能够理解的代码,进行真正的绘制。

因为显卡驱动的存在,几乎所有的GPU都既可以和OpenGL合作,也可以和DirectX一起工作。从显卡的角度出发,实际上它只需要和显卡驱动打交道就可以了。而显卡驱动就好像一个中介者,负责和两方(图像编程接口和GPU)打交道。因此,一个显卡制作商为了让它们的显卡可以以同时和OpenGL﹑DirectX合作,就必须提供支持OpenGL﹑DirectX接口的显卡驱动。

什么是HLSL﹑GLSL﹑Cg 

着色语言是专门用于编写着色器的,常见的着色语言有DirectX的HLSL(High Level Shading Language)﹑OpenGL的GLSL(OpenGL Shading Language)以及NVIDIA的Cg(C for Graphic)。这些语言会被编译成与机器无关的汇编语言,也被称为中间语言。

GLSL的优点在于跨平台性,它可以在Window﹑Linux﹑Mac甚至移动平台等多种平台上工作,但这种跨平台是由于OpenGL没有提供着色器编译器,而是由显卡驱动来完成着色器的编译工作。换句话说,GLSL是依赖硬件,而非操作系统层级的。但这也意味着GLSL的编译结果将取决于硬件供应商。

而对于HLSL,是由微软控制着色器的编译,就算使用了不同的硬件,同一个着色器的编译结果也是一样的(前提是版本相同)。但也因此支持HLSL的平台相对比较有限,几乎完全是微软自己的产品。其他平台没有可以编译HLSL的编译器。

Cg则是真正意义上的跨平台。它会根据平台的不同,编译成相应的中间语言。Cg语言的跨平台性很大原因取决于与微软的 合作,这也导致Cg语言的语法和HLSL非常相像,Cg语言可以无缝移植成HLSL代码。但缺点是可能无法完全发挥出OpenGL的最新特性。

什么是Draw Call

就是CPU调用图像编程接口,如OpenGL中的glDrawElements命令或者DirectX中的DrawIndexedPrimitive命令,以命令GPU进行渲染的操作。

参考我买的 Unity Shader入门精要

这篇关于什么是OpenGL/DirectX 什么是HLSL﹑GLSL﹑Cg 什么是Draw Call的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/628637

相关文章

OpenGL-ES 学习(6)---- 立方体绘制

目录 立方体绘制基本原理立方体的顶点坐标和绘制顺序立方体颜色和着色器实现效果和参考代码 立方体绘制基本原理 一个立方体是由8个顶点组成,共6个面,所以绘制立方体本质上就是绘制这6个面共12个三角形 顶点的坐标体系如下图所示,三维坐标的中心原点位于立方体的中心,但是要特别注意的是,前后方向表示的是Z轴,上下方向表示的是Y轴 立方体的顶点坐标和绘制顺序 立方体坐标定义

OpenGL:中点直线算法

理论部分 中点直线算法是通过在像素中确定与理想直线最靠近的像素来进行扫描转换的。 在上图中,假设直线的斜率 0 ≤ m ≤ 1 0\le m \le 1 0≤m≤1。假设当前最近的像素已经确认为 P ( x k , y k ) P(x_k, y_k) P(xk​,yk​),由于 x x x位最大的位移方向,因此直线在 x x x方向上每次增加一个像素单位,而在 y y y方向上是否

【Rust 日报】2020-03-11 :2020 RustConf CFP (Call For Proposals) 正式启动

【博客】我对 Rust 和 .NET 的探索 作者从事于用 Rust 促进 .NET 开发的工作,现在他们的项目有点快成形的意思了但还有很多问题,所以他决定和社区的人介绍一下他们的工作并交流一下. 项目现在还没取好名字,也暂不开源,主要两部分组成: 将 rustc 中的 LLVM bitcode 转化为 .NET 程序集(assembly)的编译器为其他 .NET 程序集聚合 Rust bind

C# 实现draw一个简单的温度计

运行结果 概述: 代码分析 该控件主要包含以下几个部分: 属性定义: MinValue:最低温度值。 MaxValue:最高温度值。 CurrentValue:当前温度值。 构造函数: 设置了一些控件样式来提升绘制效果,如 DoubleBuffer 以及 ResizeRedraw 等。 设定了控件的默认宽度和高度,并设置背景色和内边距。 绘制逻辑(在 OnPaint 方

.net3.5以后的版本 如何使用 DirectX.dll和Directsound.dll

1.引用Microsoft.DirectX.dll和Microsoft.DirectX.Directsound.dll这2个文件。 2.项目属性里边,把目标平台改成X86。 3.调试菜单-->异常。把Managed Debugging Assistants里的LoaderLock引发的异常去掉。 4.App.Config修改下: <?xml version="1.0"?>

OpenGL学习笔记(二十九)

目录 模板测试 模板测试 当片段着色器处理完一个片段之后,模板测试(Stencil Test)会开始执行,和深度测试一样,它也可能会丢弃片段。接下来,被保留的片段会进入深度测试,它可能会丢弃更多的片段。模板测试是根据又一个缓冲来进行的,它叫做模板缓冲(Stencil Buffer)。

OpenGL学习笔记(二十八)

目录 面剔除 面剔除 一个3D立方体,从任何一个方向去看它,最多可以同时看到的面是3个。可以从一个立方体的任意位置和方向上去看它,但是永远不能看到多于3个面。所以为何还要去绘制那三个不会显示出来的3个面呢。如果可以以某种方式丢弃它们,会提高片段着色器超过50%的性能,这就是面剔除要做的事情。

OpenGL学习笔记(二十七)

目录 混合 混合 在OpenGL中,物体透明技术通常被叫做混合(Blending)。透明是物体(或物体的一部分)非纯色而是混合色,这种颜色来自于不同浓度的自身颜色和它后面的物体颜色。一个有色玻璃窗就是一种透明物体,玻璃有自身的颜色,但是最终的颜色包含了所有玻璃后面的颜色。这也正是混合这名称的出处,因为我们将多种(来自于不同物体)颜色混合为一个颜色,透明使得我们可以看穿物体。

OpenGL学习笔记(二十六)

目录 模板测试 模板测试 当片段着色器处理完片段之后,模板测试(Stencil Test) 就开始执行了,和深度测试一样,它能丢弃一些片段。仍然保留下来的片段进入深度测试阶段,深度测试可能丢弃更多。模板测试基于另一个缓冲,这个缓冲叫做模板缓冲(Stencil Buffer),我们被允许在渲染时更新它来获取有意思的效果。 模板缓冲中的模板值(Stencil Value)通常是

OpenGL学习笔记(二十五)

目录 EarlyZ EarlyZ 现在大多数 GPU 都支持一种称为提前深度测试(Early depth testing)的硬件功能。 提前深度测试允许深度测试在片段着色器之前运行。明确一个片段永远不会可见的 (它是其它物体的后面) 。 片段着色器通常是相当费时的所以应该尽量避免运行。 对片段着色器提前深度测试一个限制是,你不应该写入片段的深度值。如果片段着色器将写入其