Compiler construction 如何构建我自己的opengl着色器编译器?

Compiler construction 如何构建我自己的opengl着色器编译器?,compiler-construction,glsl,Compiler Construction,Glsl,GLSL和CG工具包根本不足以满足我的需要,看来我唯一的选择就是编写自己的编译器。我基本上需要一个二进制着色器结构图,这样我就可以从脚本中自己构建它 编辑:好的,我想我要找的是arb汇编的二进制结构 如何构建我自己的opengl着色器编译器 你没有。至少,不是你说的那样 OpenGL不定义二进制或程序集交换格式。OpenGL本身直接将GLSL编译成对象。即使您可以查询二进制数据,OpenGL也没有提供解释二进制数据实际存储内容的方法。它依赖于实现。NVIDIA和AMD将存储不同的信息,这将不同于

GLSL和CG工具包根本不足以满足我的需要,看来我唯一的选择就是编写自己的编译器。我基本上需要一个二进制着色器结构图,这样我就可以从脚本中自己构建它

编辑:好的,我想我要找的是arb汇编的二进制结构

如何构建我自己的opengl着色器编译器

你没有。至少,不是你说的那样

OpenGL不定义二进制或程序集交换格式。OpenGL本身直接将GLSL编译成对象。即使您可以查询二进制数据,OpenGL也没有提供解释二进制数据实际存储内容的方法。它依赖于实现。NVIDIA和AMD将存储不同的信息,这将不同于英特尔存储的信息。每一代硬件都会发生变化。等等

您可以编写生成GLSL的编译器。但仅此而已

如果你愿意坚持使用NVIDIA,他们一直致力于使ARB汇编语言保持最新。但很明显,任何这样的代码都只适用于NVIDIA

如何构建我自己的opengl着色器编译器

你没有。至少,不是你说的那样

OpenGL不定义二进制或程序集交换格式。OpenGL本身直接将GLSL编译成对象。即使您可以查询二进制数据,OpenGL也没有提供解释二进制数据实际存储内容的方法。它依赖于实现。NVIDIA和AMD将存储不同的信息,这将不同于英特尔存储的信息。每一代硬件都会发生变化。等等

您可以编写生成GLSL的编译器。但仅此而已


如果你愿意坚持使用NVIDIA,他们一直致力于使ARB汇编语言保持最新。但是很明显,任何这样的代码都只适用于NVIDIA。

为什么它们还不够呢?+这将是一项非常艰巨的任务,就像在hardDesugar中一样,使用现有的工具将自己的着色器编译成GLSL/Cg。否则就浪费时间吧。你在做什么,尤其是OpenGL和OpenCL互操作,做不到的?我很想知道。为什么它们不够呢?+这将是一项非常艰巨的任务,就像在hardDesugar中一样,使用现有的工具将自己的着色器编译成GLSL/Cg。否则就浪费时间吧。你在做什么,尤其是OpenGL和OpenCL互操作,做不到的?我很想知道。如果是这样,CG会编译成GLSL吗?如果不是,那么CG是如何工作的?@Steve:定义“工作”?CG可以“两种方式”工作:英伟达特定的方式将它编译成Nvidia的着色器汇编语言,它被编译成硬件专用的内部机器语言。“跨平台”的方法是将它编译成GLSL,然后用OpenGL的普通工具编译。@Stevefacto:你从来没有回答过最重要的问题:GLSL的“不足”是什么?老实说,我认为这种语言设计得很糟糕。我需要更像fx或cgfx的东西。cgfx将是完美的,但我找不到android的cg工具包二进制文件…@Steve:我不会对GLSL的质量或缺乏进行辩论(尽管我会说质量取决于你使用的版本。我觉得3.30相当合理,4.30相当不错)。但是,您正在使用OpenGL ES,而这些东西是不可用的。如果要使用FX格式和运行时,必须编写一个。虽然没有什么规定你不能为GLSL ES编写一个FX运行时。如果是这样,CG会编译成GLSL吗?如果不是,那么CG是如何工作的?@Steve:定义“工作”?CG可以“两种方式”工作:英伟达特定的方式将它编译成Nvidia的着色器汇编语言,它被编译成硬件专用的内部机器语言。“跨平台”的方法是将它编译成GLSL,然后用OpenGL的普通工具编译。@Stevefacto:你从来没有回答过最重要的问题:GLSL的“不足”是什么?老实说,我认为这种语言设计得很糟糕。我需要更像fx或cgfx的东西。cgfx将是完美的,但我找不到android的cg工具包二进制文件…@Steve:我不会对GLSL的质量或缺乏进行辩论(尽管我会说质量取决于你使用的版本。我觉得3.30相当合理,4.30相当不错)。但是,您正在使用OpenGL ES,而这些东西是不可用的。如果要使用FX格式和运行时,必须编写一个。尽管没有任何东西表明您不能为GLSL ES编写FX运行时。