确保GLSL兼容性

ron*_*nag 6 c++ opengl compatibility shader glsl

如何确保GLSL着色器与大多数现代卡兼容?

我有一个软件,我从这里使用GLSL代码.但即使我已经将#version 120添加到我的最终着色器的开头并确保它编译,在某些用户计算机上它们会出现着色器编译错误(即使它们支持OpenGL 3.2).

是否有任何工具可用于"验证"或尝试使用不同的"着色器编译器"进行编译?

Nic*_*las 6

没有用于验证着色器的工具.即使有,但它对你没有用,因为如果它不能在你想要的硬件上运行,那么着色器有什么用呢?您可以随心所欲,但如果您的硬件拒绝它,即使您在技术上正确,您的着色器仍然无法运行.

如果特定版本的着色器在一个目标上编译(称为A)而不在另一个目标上编译(称为B),则可能是由于以下问题之一:

  1. 目标A未正确实施GLSL.它允许您编译规范不允许的内容.更符合标准的目标B(或者至少是不同的不兼容)会拒绝您的着色器,因为着色器不符合规范.
  2. 目标B不符合规范.你正在给它一个合法的着色器,它拒绝它.
  3. 目标B不支持着色器使用的GLSL版本(这不太可能),除非:
  4. 目标B使用的是OpenGL核心规范,版本3.2或更高版本.GLSL 1.20着色器无法在核心3.2 OpenGL实现上运行.

如果您仅使用NVIDIA硬件开发,则更有可能发生#1.NVIDIA使用OpenGL规范有点快速和宽松.他们会在这里和那里采取一些自由,平滑一些规范所说的不愉快的事情.它可以提供更流畅的开发人员体验,但如果着色器不在竞争对手上运行,它还有助于保持供应商使用NVIDIA硬件;)

#3几乎不存在,但有例外.您链接到Photoshop着色器,因此我认为您无法控制OpenGL上下文的创建和管理.即便如此,我仍然怀疑Photoshop会使用核心环境; 他们有太多需要向后兼容的着色器.

解决这个问题的最佳方法是在AMD和NVIDIA硬件上进行测试(如果你需要在那里运行,还要测试英特尔).您可能不需要测试每种可能的系统组合,但选择Radeon HD卡和GeForce 200或更高版本.他们甚至不必是高端的.