2011-12-29 116 views
0

我在这里有三个问题:GLSL和c有什么区别?

  1. Qt/3D API是由GLSL代码实现的吗?
  2. GLSL代码是否作为正常的c/C++代码编译和链接,并且可以在CPU(不是GPU)上运行?
  3. 为什么GLSL比正常的c/C++更好地渲染?

回答

11

您似乎对GLSL有什么根本性的误解。它不是图形的编程语言。它是一个着色器语言。

OpenGL rendering pipeline中,渲染对象的某些阶段被设计为由程序实现。这些阶段被称为“着色器阶段”。着色器是一个程序,用GLSL编写(至少用于OpenGL),在这些着色器阶段之一执行。

GLSL被用作渲染过程的一部分。 GLSL定义了如何渲染,而不是什么被渲染。

因此:

是通过GLSL代码实现了Qt/3D API?

不符合你的意思。绘图功能的一些渲染流水线可能是。但它可能不会。这与你无关,因为你从外面使用它。

GLSL代码是否作为正常的c/C++代码编译和链接,并且可以在CPU(不是GPU)上运行?

不是,根据上面。着色器影响渲染,渲染发生在GPU上。 GLSL是OpenGL的着色语言,因此GLSL代码在GPU上执行。

为什么GLSL比正常的c/C++更好?

这不是更好或更坏;你不能使用另一个。作为渲染流水线的一部分,您不能随意在GPU上丢弃随机C代码。而且你不能编译CPU的GLSL。我们称之为domain specific language。这是一种旨在促进特定目的的语言。它具有大多数语言根本没有的语言结构。它知道什么是“纹理”。它具有在单次渲染调用(统一)内对着色器的多次执行不变的值的概念。它有许多其他的概念,这些概念对于基于硬件的着色器和渲染问题是独一无二的。

您不仅可以将C或C++扔在GPU上,您也不会想要。不适用于着色器。

+0

'GLSL代码是否作为正常的c/C++代码编译和链接,并且可以在CPU(不是GPU)上运行?' '着色器影响渲染,渲染发生在GPU上。 GLSL是OpenGL的着色语言,因此GLSL代码在GPU上执行。' 严格来说,这并非完全正确。如果你在[仿真模式](http://stackoverflow.com/questions/7364871/how-to-start-opengl-in-software-emulation-mode)中运行OpenGL,一切都将在CPU上完成。 – 2012-08-02 23:05:10

+0

@SchighSchagh:OpenGL中没有“模拟模式”。你会得到最好的是运行MesaGL。 – 2012-08-03 03:48:38

+4

就OpenGL规范而言,没有提及任何“仿真模式”,但这是因为它是一个API规范;同样,该规范没有提到GPU,当然也没有要求在GPU上渲染,就像你声称的那样。也就是说,各种驱动程序(包括在您指出的MesaGL中)提供了仅在CPU上运行的纯软件实现。事实上,MesaGL主页上的** Introduction **明确提到,Mesa可以用于许多不同的环境,从软件仿真到为现代GPU完成硬件加速。 – 2012-08-05 02:00:40

4

Qt/3D API是否由GLSL代码实现?

不是。它可能会在内部使用,但这对用户来说都是隐藏的。 API本身是C++。 OpenGL的API使用C语言,尽管它(驱动程序)在内部使用程序集。

是否GLSL代码编译和链接是正常的C/C++代码

不,当然不是。它由视频卡驱动程序编译并在GPU上运行。这是一种相当有限的语言,除了着色器之外没有太多用处。

为什么GLSL在绘画上比普通的c/C++更有价值?

它包含GPU擅长的功能,同时缺乏功能不佳的功能。