我发现GL需要在不同系统上进行不同的设置才能正常运行。例如,在我的桌面上,如果我请求版本3.3核心配置文件上下文一切正常。在Mac上,我还必须设置前向兼容性标志。我的上网本声称只支持2.1版本,但大多数3.1功能都是扩展名。 (所以我必须要求2.1。)
我的问题是,是否有一般的方法来确定:
答案 0 :(得分:1)
我认为这里没有任何灵丹妙药。您可以自行决定是否进行适当的运行时检查,并提供可充分利用可用功能的备用路径。
当我编写OpenGL应用程序时,我通常会定义一个"大写"表,像这样:
struct GLInfo {
// GL extensions/features as booleans for direct access:
int hasVAO; // GL_ARB_vertex_array_object........: Has VAO support? Allows faster switching between vertex formats.
int hasPBO; // GL_ARB_pixel_buffer_object........: Supports Pixel Buffer Objects?
int hasFBO; // GL_ARB_framebuffer_object.........: Supports Framebuffer objects for offscreen rendering?
int hasGPUMemoryInfo; // GL_NVX_gpu_memory_info............: GPU memory info/stats.
int hasDebugOutput; // GL_ARB_debug_output...............: Allows GL to generate debug and profiling messages.
int hasExplicitAttribLocation; // GL_ARB_explicit_attrib_location...: Allows the use of "layout(location = N)" in GLSL code.
int hasSeparateShaderObjects; // GL_ARB_separate_shader_objects....: Allows creation of "single stage" programs that can be combined at use time.
int hasUniformBuffer; // GL_ARB_uniform_buffer_object......: Uniform buffer objects (UBOs).
int hasTextureCompressionS3TC; // GL_EXT_texture_compression_s3tc...: Direct use of S3TC compressed textures.
int hasTextureCompressionRGTC; // GL_ARB_texture_compression_rgtc...: Red/Green texture compression: RGTC/AT1N/ATI2N.
int hasTextureFilterAnisotropic; // GL_EXT_texture_filter_anisotropic.: Anisotropic texture filtering!
};
我将启动时收集的所有功能信息与glGet
放在一起,并测试函数指针。然后,当使用功能/功能时,我总是首先检查可用性,如果可能的话提供后备。 E.g:
if (glInfo.hasVAO)
{
draw_with_VAO();
}
else
{
draw_with_VB_only();
}
当然,您可能会决定硬件运行软件时必须具备的一些最小功能。例如:必须至少具有支持GLSL v120的OpenGL 2.1。这是完全正常和预期的。
关于核心和兼容性配置文件之间的差异,如果您希望同时支持这两者,则必须避免使用一些OpenGL功能。例如:始终使用VBO绘制。它们是Core的标准,并且在通过扩展之前就已存在。